diff --git a/docs-v3/.gitignore b/docs-v3/.gitignore new file mode 100644 index 000000000..cd65967e4 --- /dev/null +++ b/docs-v3/.gitignore @@ -0,0 +1,101 @@ +# Created by .ignore support plugin (hsz.mobi) +### Node template +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +static/sw.js + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# Nuxt generate +dist + +# Nuxt 3 build output +.output + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless + +# IDE +.idea +.vscode +*.swp +*.swo + +# OS generated files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Temporary files +*.tmp +*.temp diff --git a/docs-v3/.nuxt/app.config.mjs b/docs-v3/.nuxt/app.config.mjs new file mode 100644 index 000000000..fc95a313e --- /dev/null +++ b/docs-v3/.nuxt/app.config.mjs @@ -0,0 +1,18 @@ + +import { _replaceAppConfig } from '#app/config' +import { defuFn } from 'defu' + +const inlineConfig = { + "nuxt": {} +} + +// Vite - webpack is handled directly in #app/config +if (import.meta.hot) { + import.meta.hot.accept((newModule) => { + _replaceAppConfig(newModule.default) + }) +} + + + +export default /*@__PURE__*/ defuFn(inlineConfig) diff --git a/docs-v3/.nuxt/component-chunk.mjs b/docs-v3/.nuxt/component-chunk.mjs new file mode 100644 index 000000000..56004c9f9 --- /dev/null +++ b/docs-v3/.nuxt/component-chunk.mjs @@ -0,0 +1 @@ +export default {} \ No newline at end of file diff --git a/docs-v3/.nuxt/components.d.ts b/docs-v3/.nuxt/components.d.ts new file mode 100644 index 000000000..c24580dad --- /dev/null +++ b/docs-v3/.nuxt/components.d.ts @@ -0,0 +1,326 @@ + +import type { DefineComponent, SlotsType } from 'vue' +type IslandComponent = T & DefineComponent<{}, {refresh: () => Promise}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, SlotsType<{ fallback: { error: unknown } }>> +type HydrationStrategies = { + hydrateOnVisible?: IntersectionObserverInit | true + hydrateOnIdle?: number | true + hydrateOnInteraction?: keyof HTMLElementEventMap | Array | true + hydrateOnMediaQuery?: string + hydrateAfter?: number + hydrateWhen?: boolean + hydrateNever?: true +} +type LazyComponent = (T & DefineComponent void }>) +interface _GlobalComponents { + 'Alert': typeof import("../components/content/Alert.vue")['default'] + 'List': typeof import("../components/content/List.vue")['default'] + 'ProseAlert': typeof import("../components/content/ProseAlert.vue")['default'] + 'ProseList': typeof import("../components/content/ProseList.vue")['default'] + 'ProsePre': typeof import("../components/content/ProsePre.vue")['default'] + 'CopyButton': typeof import("../components/CopyButton.vue")['default'] + 'SearchInput': typeof import("../components/SearchInput.vue")['default'] + 'SearchModal': typeof import("../components/SearchModal.vue")['default'] + 'TheHeader': typeof import("../components/TheHeader.vue")['default'] + 'TheSidebar': typeof import("../components/TheSidebar.vue")['default'] + 'TheTableOfContents': typeof import("../components/TheTableOfContents.vue")['default'] + 'ThemeToggle': typeof import("../components/ThemeToggle.vue")['default'] + 'ToastContainer': typeof import("../components/ToastContainer.vue")['default'] + 'ContentDoc': typeof import("../node_modules/@nuxt/content/dist/runtime/components/ContentDoc.vue")['default'] + 'ContentList': typeof import("../node_modules/@nuxt/content/dist/runtime/components/ContentList.vue")['default'] + 'ContentNavigation': typeof import("../node_modules/@nuxt/content/dist/runtime/components/ContentNavigation.vue")['default'] + 'ContentQuery': typeof import("../node_modules/@nuxt/content/dist/runtime/components/ContentQuery.vue")['default'] + 'ContentRenderer': typeof import("../node_modules/@nuxt/content/dist/runtime/components/ContentRenderer.vue")['default'] + 'ContentRendererMarkdown': typeof import("../node_modules/@nuxt/content/dist/runtime/components/ContentRendererMarkdown.vue")['default'] + 'ContentSlot': typeof import("../node_modules/@nuxt/content/dist/runtime/components/ContentSlot.vue")['default'] + 'DocumentDrivenEmpty': typeof import("../node_modules/@nuxt/content/dist/runtime/components/DocumentDrivenEmpty.vue")['default'] + 'DocumentDrivenNotFound': typeof import("../node_modules/@nuxt/content/dist/runtime/components/DocumentDrivenNotFound.vue")['default'] + 'Markdown': typeof import("../node_modules/@nuxt/content/dist/runtime/components/Markdown.vue")['default'] + 'ProseCode': typeof import("../node_modules/@nuxt/content/dist/runtime/components/Prose/ProseCode.vue")['default'] + 'ProseCodeInline': typeof import("../node_modules/@nuxt/content/dist/runtime/components/Prose/ProseCodeInline.vue")['default'] + 'ProseA': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseA.vue")['default'] + 'ProseBlockquote': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseBlockquote.vue")['default'] + 'ProseEm': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseEm.vue")['default'] + 'ProseH1': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseH1.vue")['default'] + 'ProseH2': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseH2.vue")['default'] + 'ProseH3': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseH3.vue")['default'] + 'ProseH4': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseH4.vue")['default'] + 'ProseH5': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseH5.vue")['default'] + 'ProseH6': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseH6.vue")['default'] + 'ProseHr': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseHr.vue")['default'] + 'ProseImg': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseImg.vue")['default'] + 'ProseLi': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseLi.vue")['default'] + 'ProseOl': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseOl.vue")['default'] + 'ProseP': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseP.vue")['default'] + 'ProseScript': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseScript.vue")['default'] + 'ProseStrong': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseStrong.vue")['default'] + 'ProseTable': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseTable.vue")['default'] + 'ProseTbody': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseTbody.vue")['default'] + 'ProseTd': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseTd.vue")['default'] + 'ProseTh': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseTh.vue")['default'] + 'ProseThead': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseThead.vue")['default'] + 'ProseTr': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseTr.vue")['default'] + 'ProseUl': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseUl.vue")['default'] + 'NuxtWelcome': typeof import("../node_modules/nuxt/dist/app/components/welcome.vue")['default'] + 'NuxtLayout': typeof import("../node_modules/nuxt/dist/app/components/nuxt-layout")['default'] + 'NuxtErrorBoundary': typeof import("../node_modules/nuxt/dist/app/components/nuxt-error-boundary.vue")['default'] + 'ClientOnly': typeof import("../node_modules/nuxt/dist/app/components/client-only")['default'] + 'DevOnly': typeof import("../node_modules/nuxt/dist/app/components/dev-only")['default'] + 'ServerPlaceholder': typeof import("../node_modules/nuxt/dist/app/components/server-placeholder")['default'] + 'NuxtLink': typeof import("../node_modules/nuxt/dist/app/components/nuxt-link")['default'] + 'NuxtLoadingIndicator': typeof import("../node_modules/nuxt/dist/app/components/nuxt-loading-indicator")['default'] + 'NuxtTime': typeof import("../node_modules/nuxt/dist/app/components/nuxt-time.vue")['default'] + 'NuxtRouteAnnouncer': typeof import("../node_modules/nuxt/dist/app/components/nuxt-route-announcer")['default'] + 'NuxtImg': typeof import("../node_modules/nuxt/dist/app/components/nuxt-stubs")['NuxtImg'] + 'NuxtPicture': typeof import("../node_modules/nuxt/dist/app/components/nuxt-stubs")['NuxtPicture'] + 'MDC': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/MDC.vue")['default'] + 'MDCRenderer': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/MDCRenderer.vue")['default'] + 'MDCSlot': typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/MDCSlot.vue")['default'] + 'ColorScheme': typeof import("../node_modules/@nuxtjs/color-mode/dist/runtime/component.vue3.vue")['default'] + 'NuxtPage': typeof import("../node_modules/nuxt/dist/pages/runtime/page")['default'] + 'NoScript': typeof import("../node_modules/nuxt/dist/head/runtime/components")['NoScript'] + 'Link': typeof import("../node_modules/nuxt/dist/head/runtime/components")['Link'] + 'Base': typeof import("../node_modules/nuxt/dist/head/runtime/components")['Base'] + 'Title': typeof import("../node_modules/nuxt/dist/head/runtime/components")['Title'] + 'Meta': typeof import("../node_modules/nuxt/dist/head/runtime/components")['Meta'] + 'Style': typeof import("../node_modules/nuxt/dist/head/runtime/components")['Style'] + 'Head': typeof import("../node_modules/nuxt/dist/head/runtime/components")['Head'] + 'Html': typeof import("../node_modules/nuxt/dist/head/runtime/components")['Html'] + 'Body': typeof import("../node_modules/nuxt/dist/head/runtime/components")['Body'] + 'NuxtIsland': typeof import("../node_modules/nuxt/dist/app/components/nuxt-island")['default'] + 'NuxtRouteAnnouncer': IslandComponent + 'LazyAlert': LazyComponent + 'LazyList': LazyComponent + 'LazyProseAlert': LazyComponent + 'LazyProseList': LazyComponent + 'LazyProsePre': LazyComponent + 'LazyCopyButton': LazyComponent + 'LazySearchInput': LazyComponent + 'LazySearchModal': LazyComponent + 'LazyTheHeader': LazyComponent + 'LazyTheSidebar': LazyComponent + 'LazyTheTableOfContents': LazyComponent + 'LazyThemeToggle': LazyComponent + 'LazyToastContainer': LazyComponent + 'LazyContentDoc': LazyComponent + 'LazyContentList': LazyComponent + 'LazyContentNavigation': LazyComponent + 'LazyContentQuery': LazyComponent + 'LazyContentRenderer': LazyComponent + 'LazyContentRendererMarkdown': LazyComponent + 'LazyContentSlot': LazyComponent + 'LazyDocumentDrivenEmpty': LazyComponent + 'LazyDocumentDrivenNotFound': LazyComponent + 'LazyMarkdown': LazyComponent + 'LazyProseCode': LazyComponent + 'LazyProseCodeInline': LazyComponent + 'LazyProseA': LazyComponent + 'LazyProseBlockquote': LazyComponent + 'LazyProseEm': LazyComponent + 'LazyProseH1': LazyComponent + 'LazyProseH2': LazyComponent + 'LazyProseH3': LazyComponent + 'LazyProseH4': LazyComponent + 'LazyProseH5': LazyComponent + 'LazyProseH6': LazyComponent + 'LazyProseHr': LazyComponent + 'LazyProseImg': LazyComponent + 'LazyProseLi': LazyComponent + 'LazyProseOl': LazyComponent + 'LazyProseP': LazyComponent + 'LazyProseScript': LazyComponent + 'LazyProseStrong': LazyComponent + 'LazyProseTable': LazyComponent + 'LazyProseTbody': LazyComponent + 'LazyProseTd': LazyComponent + 'LazyProseTh': LazyComponent + 'LazyProseThead': LazyComponent + 'LazyProseTr': LazyComponent + 'LazyProseUl': LazyComponent + 'LazyNuxtWelcome': LazyComponent + 'LazyNuxtLayout': LazyComponent + 'LazyNuxtErrorBoundary': LazyComponent + 'LazyClientOnly': LazyComponent + 'LazyDevOnly': LazyComponent + 'LazyServerPlaceholder': LazyComponent + 'LazyNuxtLink': LazyComponent + 'LazyNuxtLoadingIndicator': LazyComponent + 'LazyNuxtTime': LazyComponent + 'LazyNuxtRouteAnnouncer': LazyComponent + 'LazyNuxtImg': LazyComponent + 'LazyNuxtPicture': LazyComponent + 'LazyMDC': LazyComponent + 'LazyMDCRenderer': LazyComponent + 'LazyMDCSlot': LazyComponent + 'LazyColorScheme': LazyComponent + 'LazyNuxtPage': LazyComponent + 'LazyNoScript': LazyComponent + 'LazyLink': LazyComponent + 'LazyBase': LazyComponent + 'LazyTitle': LazyComponent + 'LazyMeta': LazyComponent + 'LazyStyle': LazyComponent + 'LazyHead': LazyComponent + 'LazyHtml': LazyComponent + 'LazyBody': LazyComponent + 'LazyNuxtIsland': LazyComponent + 'LazyNuxtRouteAnnouncer': LazyComponent> +} + +declare module 'vue' { + export interface GlobalComponents extends _GlobalComponents { } +} + +export const Alert: typeof import("../components/content/Alert.vue")['default'] +export const List: typeof import("../components/content/List.vue")['default'] +export const ProseAlert: typeof import("../components/content/ProseAlert.vue")['default'] +export const ProseList: typeof import("../components/content/ProseList.vue")['default'] +export const ProsePre: typeof import("../components/content/ProsePre.vue")['default'] +export const CopyButton: typeof import("../components/CopyButton.vue")['default'] +export const SearchInput: typeof import("../components/SearchInput.vue")['default'] +export const SearchModal: typeof import("../components/SearchModal.vue")['default'] +export const TheHeader: typeof import("../components/TheHeader.vue")['default'] +export const TheSidebar: typeof import("../components/TheSidebar.vue")['default'] +export const TheTableOfContents: typeof import("../components/TheTableOfContents.vue")['default'] +export const ThemeToggle: typeof import("../components/ThemeToggle.vue")['default'] +export const ToastContainer: typeof import("../components/ToastContainer.vue")['default'] +export const ContentDoc: typeof import("../node_modules/@nuxt/content/dist/runtime/components/ContentDoc.vue")['default'] +export const ContentList: typeof import("../node_modules/@nuxt/content/dist/runtime/components/ContentList.vue")['default'] +export const ContentNavigation: typeof import("../node_modules/@nuxt/content/dist/runtime/components/ContentNavigation.vue")['default'] +export const ContentQuery: typeof import("../node_modules/@nuxt/content/dist/runtime/components/ContentQuery.vue")['default'] +export const ContentRenderer: typeof import("../node_modules/@nuxt/content/dist/runtime/components/ContentRenderer.vue")['default'] +export const ContentRendererMarkdown: typeof import("../node_modules/@nuxt/content/dist/runtime/components/ContentRendererMarkdown.vue")['default'] +export const ContentSlot: typeof import("../node_modules/@nuxt/content/dist/runtime/components/ContentSlot.vue")['default'] +export const DocumentDrivenEmpty: typeof import("../node_modules/@nuxt/content/dist/runtime/components/DocumentDrivenEmpty.vue")['default'] +export const DocumentDrivenNotFound: typeof import("../node_modules/@nuxt/content/dist/runtime/components/DocumentDrivenNotFound.vue")['default'] +export const Markdown: typeof import("../node_modules/@nuxt/content/dist/runtime/components/Markdown.vue")['default'] +export const ProseCode: typeof import("../node_modules/@nuxt/content/dist/runtime/components/Prose/ProseCode.vue")['default'] +export const ProseCodeInline: typeof import("../node_modules/@nuxt/content/dist/runtime/components/Prose/ProseCodeInline.vue")['default'] +export const ProseA: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseA.vue")['default'] +export const ProseBlockquote: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseBlockquote.vue")['default'] +export const ProseEm: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseEm.vue")['default'] +export const ProseH1: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseH1.vue")['default'] +export const ProseH2: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseH2.vue")['default'] +export const ProseH3: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseH3.vue")['default'] +export const ProseH4: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseH4.vue")['default'] +export const ProseH5: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseH5.vue")['default'] +export const ProseH6: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseH6.vue")['default'] +export const ProseHr: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseHr.vue")['default'] +export const ProseImg: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseImg.vue")['default'] +export const ProseLi: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseLi.vue")['default'] +export const ProseOl: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseOl.vue")['default'] +export const ProseP: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseP.vue")['default'] +export const ProseScript: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseScript.vue")['default'] +export const ProseStrong: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseStrong.vue")['default'] +export const ProseTable: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseTable.vue")['default'] +export const ProseTbody: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseTbody.vue")['default'] +export const ProseTd: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseTd.vue")['default'] +export const ProseTh: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseTh.vue")['default'] +export const ProseThead: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseThead.vue")['default'] +export const ProseTr: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseTr.vue")['default'] +export const ProseUl: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/prose/ProseUl.vue")['default'] +export const NuxtWelcome: typeof import("../node_modules/nuxt/dist/app/components/welcome.vue")['default'] +export const NuxtLayout: typeof import("../node_modules/nuxt/dist/app/components/nuxt-layout")['default'] +export const NuxtErrorBoundary: typeof import("../node_modules/nuxt/dist/app/components/nuxt-error-boundary.vue")['default'] +export const ClientOnly: typeof import("../node_modules/nuxt/dist/app/components/client-only")['default'] +export const DevOnly: typeof import("../node_modules/nuxt/dist/app/components/dev-only")['default'] +export const ServerPlaceholder: typeof import("../node_modules/nuxt/dist/app/components/server-placeholder")['default'] +export const NuxtLink: typeof import("../node_modules/nuxt/dist/app/components/nuxt-link")['default'] +export const NuxtLoadingIndicator: typeof import("../node_modules/nuxt/dist/app/components/nuxt-loading-indicator")['default'] +export const NuxtTime: typeof import("../node_modules/nuxt/dist/app/components/nuxt-time.vue")['default'] +export const NuxtRouteAnnouncer: typeof import("../node_modules/nuxt/dist/app/components/nuxt-route-announcer")['default'] +export const NuxtImg: typeof import("../node_modules/nuxt/dist/app/components/nuxt-stubs")['NuxtImg'] +export const NuxtPicture: typeof import("../node_modules/nuxt/dist/app/components/nuxt-stubs")['NuxtPicture'] +export const MDC: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/MDC.vue")['default'] +export const MDCRenderer: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/MDCRenderer.vue")['default'] +export const MDCSlot: typeof import("../node_modules/@nuxtjs/mdc/dist/runtime/components/MDCSlot.vue")['default'] +export const ColorScheme: typeof import("../node_modules/@nuxtjs/color-mode/dist/runtime/component.vue3.vue")['default'] +export const NuxtPage: typeof import("../node_modules/nuxt/dist/pages/runtime/page")['default'] +export const NoScript: typeof import("../node_modules/nuxt/dist/head/runtime/components")['NoScript'] +export const Link: typeof import("../node_modules/nuxt/dist/head/runtime/components")['Link'] +export const Base: typeof import("../node_modules/nuxt/dist/head/runtime/components")['Base'] +export const Title: typeof import("../node_modules/nuxt/dist/head/runtime/components")['Title'] +export const Meta: typeof import("../node_modules/nuxt/dist/head/runtime/components")['Meta'] +export const Style: typeof import("../node_modules/nuxt/dist/head/runtime/components")['Style'] +export const Head: typeof import("../node_modules/nuxt/dist/head/runtime/components")['Head'] +export const Html: typeof import("../node_modules/nuxt/dist/head/runtime/components")['Html'] +export const Body: typeof import("../node_modules/nuxt/dist/head/runtime/components")['Body'] +export const NuxtIsland: typeof import("../node_modules/nuxt/dist/app/components/nuxt-island")['default'] +export const NuxtRouteAnnouncer: IslandComponent +export const LazyAlert: LazyComponent +export const LazyList: LazyComponent +export const LazyProseAlert: LazyComponent +export const LazyProseList: LazyComponent +export const LazyProsePre: LazyComponent +export const LazyCopyButton: LazyComponent +export const LazySearchInput: LazyComponent +export const LazySearchModal: LazyComponent +export const LazyTheHeader: LazyComponent +export const LazyTheSidebar: LazyComponent +export const LazyTheTableOfContents: LazyComponent +export const LazyThemeToggle: LazyComponent +export const LazyToastContainer: LazyComponent +export const LazyContentDoc: LazyComponent +export const LazyContentList: LazyComponent +export const LazyContentNavigation: LazyComponent +export const LazyContentQuery: LazyComponent +export const LazyContentRenderer: LazyComponent +export const LazyContentRendererMarkdown: LazyComponent +export const LazyContentSlot: LazyComponent +export const LazyDocumentDrivenEmpty: LazyComponent +export const LazyDocumentDrivenNotFound: LazyComponent +export const LazyMarkdown: LazyComponent +export const LazyProseCode: LazyComponent +export const LazyProseCodeInline: LazyComponent +export const LazyProseA: LazyComponent +export const LazyProseBlockquote: LazyComponent +export const LazyProseEm: LazyComponent +export const LazyProseH1: LazyComponent +export const LazyProseH2: LazyComponent +export const LazyProseH3: LazyComponent +export const LazyProseH4: LazyComponent +export const LazyProseH5: LazyComponent +export const LazyProseH6: LazyComponent +export const LazyProseHr: LazyComponent +export const LazyProseImg: LazyComponent +export const LazyProseLi: LazyComponent +export const LazyProseOl: LazyComponent +export const LazyProseP: LazyComponent +export const LazyProseScript: LazyComponent +export const LazyProseStrong: LazyComponent +export const LazyProseTable: LazyComponent +export const LazyProseTbody: LazyComponent +export const LazyProseTd: LazyComponent +export const LazyProseTh: LazyComponent +export const LazyProseThead: LazyComponent +export const LazyProseTr: LazyComponent +export const LazyProseUl: LazyComponent +export const LazyNuxtWelcome: LazyComponent +export const LazyNuxtLayout: LazyComponent +export const LazyNuxtErrorBoundary: LazyComponent +export const LazyClientOnly: LazyComponent +export const LazyDevOnly: LazyComponent +export const LazyServerPlaceholder: LazyComponent +export const LazyNuxtLink: LazyComponent +export const LazyNuxtLoadingIndicator: LazyComponent +export const LazyNuxtTime: LazyComponent +export const LazyNuxtRouteAnnouncer: LazyComponent +export const LazyNuxtImg: LazyComponent +export const LazyNuxtPicture: LazyComponent +export const LazyMDC: LazyComponent +export const LazyMDCRenderer: LazyComponent +export const LazyMDCSlot: LazyComponent +export const LazyColorScheme: LazyComponent +export const LazyNuxtPage: LazyComponent +export const LazyNoScript: LazyComponent +export const LazyLink: LazyComponent +export const LazyBase: LazyComponent +export const LazyTitle: LazyComponent +export const LazyMeta: LazyComponent +export const LazyStyle: LazyComponent +export const LazyHead: LazyComponent +export const LazyHtml: LazyComponent +export const LazyBody: LazyComponent +export const LazyNuxtIsland: LazyComponent +export const LazyNuxtRouteAnnouncer: LazyComponent> + +export const componentNames: string[] diff --git a/docs-v3/.nuxt/content-cache/content-index.json b/docs-v3/.nuxt/content-cache/content-index.json new file mode 100644 index 000000000..8cbc21916 --- /dev/null +++ b/docs-v3/.nuxt/content-cache/content-index.json @@ -0,0 +1 @@ +{"/":["content:index.md"],"/quickstart":["content:quickstart.md"],"/settings":["content:settings.json"],"/boost/boost":["content:boost:boost.md"],"/api/actions":["content:api:actions.md"],"/api/fields":["content:api:fields.md"],"/api/getters":["content:api:getters.md"],"/api/relations":["content:api:relations.md"],"/api/repositories-advanced":["content:api:repositories-advanced.md"],"/api/repositories":["content:api:repositories.md"],"/api/repository-generation":["content:api:repository-generation.md"],"/api/rest-methods":["content:api:rest-methods.md"],"/api/serializer":["content:api:serializer.md"],"/api/validation-methods":["content:api:validation-methods.md"],"/auth/authentication":["content:auth:authentication.md"],"/auth/authorization":["content:auth:authorization.md"],"/auth/profile":["content:auth:profile.md"],"/performance/performance":["content:performance:performance.md"],"/performance/solutions":["content:performance:solutions.md"],"/graphql/graphql-generation":["content:graphql:graphql-generation.md"],"/graphql/graphql":["content:graphql:graphql.md"],"/testing/testing":["content:testing:testing.md"],"/search/advanced-filters":["content:search:advanced-filters.md"],"/search/basic-filters":["content:search:basic-filters.md"],"/search/sorting":["content:search:sorting.md"],"/mcp/mcp":["content:mcp:mcp.md"]} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/api/actions.md b/docs-v3/.nuxt/content-cache/parsed/content/api/actions.md new file mode 100644 index 000000000..cd27d4954 --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/api/actions.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/api/actions","_dir":"api","_draft":false,"_partial":false,"_locale":"","title":"Actions","description":"","menuTitle":"Actions","category":"API","position":9,"body":{"type":"root","children":[{"type":"element","tag":"h2","props":{"id":"motivation"},"children":[{"type":"text","value":"Motivation"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Built in CRUD operations and filtering, Restify allows you to define extra actions for your repositories."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's say you have a list of posts and you have to publish them. Usually, for these kind of operations, you have to define a custom route like:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"$router->post('posts/publish', PublishPostsController::class);\n\n// PublishPostsController.php\n\npublic function __invoke(RestifyRequest $request)\n{\n //...\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$router"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'posts/publish'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"PublishPostsController"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PublishPostsController.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" __invoke"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"classic"}]},{"type":"text","value":" approach is good. However, it has a few limitations. First, you have to manually take care of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"middleware"}]},{"type":"text","value":" route, as the testability for these endpoints should be done separately, which might be hard to maintain. Ultimately, the endpoint is disconnected from the repository, which makes it feel out of context so it has a bad readability."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"On that wise, code readability, testability and maintainability may become hard."}]},{"type":"element","tag":"h2","props":{"id":"invokable-action-format"},"children":[{"type":"text","value":"Invokable Action Format"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The simplest way to define an action is to use the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"invokable"}]},{"type":"text","value":" class format."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Here's an example:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"namespace App\\Restify\\Actions;\n\nuse Illuminate\\Http\\Request;\n\nclass PublishPostAction\n{\n public function __invoke(Request $request)\n {\n // $request->input(...)\n \n return response()->json([\n 'message' => 'Post published successfully',\n ]);\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"namespace"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" App\\Restify\\Actions"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Http\\Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PublishPostAction\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" __invoke"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // $request->input(...)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" response"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"json"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"([\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'message'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'Post published successfully'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Then add the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"action"}]},{"type":"text","value":" instance to the repository "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"actions"}]},{"type":"text","value":" method:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"...\npublic function actions(RestifyRequest $request): array\n{\n return [\n new PublishPostAction,\n ];\n}\n...\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" actions"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" PublishPostAction"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"...\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Bellow we will see how to define actions in a more advanced way."}]},{"type":"element","tag":"h2","props":{"id":"action-definition"},"children":[{"type":"text","value":"Action definition"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The action is nothing more than a class that extends the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Binaryk\\LaravelRestify\\Actions\\Action"}]},{"type":"text","value":" abstract class."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"It could be generated by using the following command:"}]},{"type":"element","tag":"pre","props":{"className":"language-bash shiki shiki-themes github-light github-dark","code":"php artisan restify:action PublishPostsAction\n","language":"bash","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:action"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" PublishPostsAction\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This will generate the action class:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"namespace App\\Restify\\Actions;\n\nuse Binaryk\\LaravelRestify\\Actions\\Action;\nuse Binaryk\\LaravelRestify\\Http\\Requests\\ActionRequest;\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Support\\Collection;\n\nclass PublishPostAction extends Action\n{\n public function handle(ActionRequest $request, Collection $models): JsonResponse\n {\n return response()->json();\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"namespace"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" App\\Restify\\Actions"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Actions\\Action"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Http\\Requests\\ActionRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Http\\JsonResponse"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Support\\Collection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PublishPostAction"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Action\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" handle"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"ActionRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Collection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $models)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" JsonResponse\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" response"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"json"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$models"}]},{"type":"text","value":" argument represents a collection of all the models for this query."}]},{"type":"element","tag":"h3","props":{"id":"register-action"},"children":[{"type":"text","value":"Register action"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Then add the action instance to the repository "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"actions"}]},{"type":"text","value":" method:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository.php\n\npublic function actions(RestifyRequest $request): array\n{\n return [\n PublishPostAction::new();\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" actions"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" PublishPostAction"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"authorize-action"},"children":[{"type":"text","value":"Authorize action"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can authorize certain actions to be active for specific users:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function actions(RestifyRequest $request): array\n{\n return [\n PublishPostAction::new()->canSee(function (Request $request) {\n return $request->user()->can('publishAnyPost', Post::class);\n }),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" actions"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" PublishPostAction"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"canSee"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"can"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'publishAnyPost'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"call-actions"},"children":[{"type":"text","value":"Call actions"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To call an action, you simply access:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"POST: api/restify/posts/actions?action=publish-posts-action\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"POST: api/restify/posts/actions?action=publish-posts-action\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"action"}]},{"type":"text","value":" query param value is the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ke-bab"}]},{"type":"text","value":" form of the filter class name by default, or a custom "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$uriKey"}]},{"type":"text","value":" "},{"type":"element","tag":"a","props":{"href":"#custom-uri-key"},"children":[{"type":"text","value":"defined in the action"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The payload could be any type of json data. However, if you're using an "},{"type":"element","tag":"a","props":{"href":"#index-actions"},"children":[{"type":"text","value":"index-action"}]},{"type":"text","value":", you are required to pass the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"repositories"}]},{"type":"text","value":" key, which represents the list of model keys that we apply to this action:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"repositories\": [1, 2]\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"repositories\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"2"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"handle-action"},"children":[{"type":"text","value":"Handle action"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As soon the action is called, the handled method will be invoked with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$request"}]},{"type":"text","value":" and a list of models matching the keys passed via "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"repositories"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function handle(ActionRequest $request, Collection $models)\n{\n $models->each->publish();\n\n return ok();\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" handle"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"ActionRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Collection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $models)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $models"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"each"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"publish"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" ok"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"action-customizations"},"children":[{"type":"text","value":"Action customizations"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Actions can be easily customized."}]},{"type":"element","tag":"h3","props":{"id":"action-index-query"},"children":[{"type":"text","value":"Action index query"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Similarly to repository "},{"type":"element","tag":"a","props":{"href":"/repositories-advanced#index-query"},"children":[{"type":"text","value":"index query"}]},{"type":"text","value":", we can do the same by adding the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"indexQuery"}]},{"type":"text","value":" method on the action:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PublishPostAction extends Action\n{\n public static function indexQuery(RestifyRequest $request, $query)\n {\n $query->whereNotNull('published_at');\n }\n \n ...\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PublishPostAction"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Action\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" indexQuery"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $query)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"whereNotNull"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'published_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This method will be called right before items are retrieved from the database, so you can filter out or eager load using your custom statements."}]},{"type":"element","tag":"h3","props":{"id":"custom-uri-key"},"children":[{"type":"text","value":"Custom uri key"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Since your class names might change along the way, you can define a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$uriKey"}]},{"type":"text","value":" property to your actions, so the frontend will always use the same "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"action"}]},{"type":"text","value":" query when applying an action:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PublishPostAction extends Action\n{\n public static $uriKey = 'publish-posts';\n\n //...\n\n};\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PublishPostAction"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Action\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $uriKey "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'publish-posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"};\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"rules"},"children":[{"type":"text","value":"Rules"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Similarly to "},{"type":"element","tag":"a","props":{"href":"/search/advanced-filters#advanced-filter-rules"},"children":[{"type":"text","value":"advanced filters rules"}]},{"type":"text","value":", you could define rules for the action so the payload will get validated before the handle method is fired."}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function rules(): array\n{\n return [\n 'active' => ['required', 'bool'],\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'active'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'bool'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"],\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"alert","props":{"type":"danger"},"children":[{"type":"text","value":"\nRestify doesn't validate the payload automatically as it does for filters, so you're free to validate the payload in the handle method.\n"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Always validate the payload as early as possible in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"handle"}]},{"type":"text","value":" method:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function handle(ActionRequest $request, Collection $models)\n{\n $request->validate($this->rules());\n \n ...\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" handle"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"ActionRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Collection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $models)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"validate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"());\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"actions-scope"},"children":[{"type":"text","value":"Actions scope"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By default, any action could be used on "},{"type":"element","tag":"a","props":{"href":"#index-actions"},"children":[{"type":"text","value":"index"}]},{"type":"text","value":" as well as on "},{"type":"element","tag":"a","props":{"href":"#show-actions"},"children":[{"type":"text","value":"show"}]},{"type":"text","value":". However, you can choose to instruct your action to be displayed to a specific scope."}]},{"type":"element","tag":"h2","props":{"id":"show-actions"},"children":[{"type":"text","value":"Show actions"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Show actions are used when you have to apply them for a single item."}]},{"type":"element","tag":"h3","props":{"id":"show-action-definition"},"children":[{"type":"text","value":"Show action definition"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The show action definition is different, in a way it receives arguments for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"handle"}]},{"type":"text","value":" method."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify automatically resolves Eloquent models defined in the route id and passes them to the action's handle method:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PublishPostAction.php\n\npublic function handle(ActionRequest $request, Post $post): JsonResponse\n{\n\n}\n\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PublishPostAction.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" handle"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"ActionRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $post)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" JsonResponse\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"show-action-registration"},"children":[{"type":"text","value":"Show action registration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To register a show action, we have to use the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"->onlyOnShow()"}]},{"type":"text","value":" accessor:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function actions(RestifyRequest $request)\n{\n return [\n PublishPostAction::new()->onlyOnShow(),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" actions"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" PublishPostAction"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"onlyOnShow"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"show-action-call"},"children":[{"type":"text","value":"Show action call"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The post URL should include the key of the model we want Restify to resolve:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"POST: api/restfiy/posts/1/actions?action=publish-post-action\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"POST: api/restfiy/posts/1/actions?action=publish-post-action\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The payload could be empty:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"list-show-actions"},"children":[{"type":"text","value":"List show actions"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To get the list of available actions only for a specific model key:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: api/api/restify/posts/1/actions\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: api/api/restify/posts/1/actions\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"See "},{"type":"element","tag":"a","props":{"href":"#get-available-actions"},"children":[{"type":"text","value":"get available actions"}]},{"type":"text","value":" for more details."}]},{"type":"element","tag":"h2","props":{"id":"index-actions"},"children":[{"type":"text","value":"Index actions"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Index actions are used when you have to apply them for a many items."}]},{"type":"element","tag":"h3","props":{"id":"index-action-definition"},"children":[{"type":"text","value":"Index action definition"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The index action definition is different in the way it receives arguments for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"handle"}]},{"type":"text","value":" method."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify automatically resolves Eloquent models sent via the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"repositories"}]},{"type":"text","value":" key into the call payload. Then, it passes it to the action's handle method as a collection of items:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PublishPostAction.php\nuse Illuminate\\Support\\Collection;\n\npublic function handle(ActionRequest $request, Collection $posts): JsonResponse\n{\n //\n}\n\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PublishPostAction.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Support\\Collection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" handle"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"ActionRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Collection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $posts)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" JsonResponse\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"index-action-registration"},"children":[{"type":"text","value":"Index action registration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To register an index action, we have to use the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"->onlyOnIndex()"}]},{"type":"text","value":" accessor:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository.php\n\npublic function actions(RestifyRequest $request)\n{\n return [\n PublishPostsAction::new()->onlyOnIndex(),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" actions"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" PublishPostsAction"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"onlyOnIndex"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"index-action-call"},"children":[{"type":"text","value":"Index action call"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The post URL:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"POST: api/restfiy/posts/actions?action=publish-posts-action\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"POST: api/restfiy/posts/actions?action=publish-posts-action\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The payload should always include a key called "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"repositories"}]},{"type":"text","value":", which is an array of model keys or the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"all"}]},{"type":"text","value":" keyword if you want to get them all:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"repositories\": [1, 2, 3]\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"repositories\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"2"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"3"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"So Restify will resolve posts with ids in the list of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"[1, 2, 3]"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h3","props":{"id":"apply-index-action-for-all"},"children":[{"type":"text","value":"Apply index action for all"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can apply the index action for all the models from the database if you send the payload:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"repositories\": \"all\"\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"repositories\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"all\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify will get chunks of 200 and send them into the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Collection"}]},{"type":"text","value":" argument for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"handle"}]},{"type":"text","value":" method."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can customize the chunk number by customizing the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"chunkCount"}]},{"type":"text","value":" action property:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PublishPostAction.php\n\npublic static int $chunkCount = 500;\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PublishPostAction.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" int"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $chunkCount "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" 500"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"list-index-actions"},"children":[{"type":"text","value":"List index actions"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To get the list of available actions:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: api/api/restify/posts/actions\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: api/api/restify/posts/actions\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"See "},{"type":"element","tag":"a","props":{"href":"#get-available-actions"},"children":[{"type":"text","value":"get available actions"}]},{"type":"text","value":" for more details."}]},{"type":"element","tag":"h2","props":{"id":"standalone-actions"},"children":[{"type":"text","value":"Standalone actions"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Sometimes, you don't need to have an action with models. Let's say for example the authenticated user wants to disable\nhis/her account."}]},{"type":"element","tag":"h3","props":{"id":"standalone-action-definition"},"children":[{"type":"text","value":"Standalone action definition:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The index action definition is different, in a way it doesn't require the second argument for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"handle"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// DisableProfileAction.php\n\npublic function handle(ActionRequest $request): JsonResponse\n{\n //\n}\n\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// DisableProfileAction.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" handle"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"ActionRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" JsonResponse\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"standalone-action-registration"},"children":[{"type":"text","value":"Standalone action registration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"There are two ways to register the standalone action:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// UserRepository\n\npublic function actions(RestifyRequest $request)\n{\n return [\n DisableProfileAction::new()->standalone(),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// UserRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" actions"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" DisableProfileAction"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"standalone"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"->standalone()"}]},{"type":"text","value":" mutator or by overriding the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$standalone"}]},{"type":"text","value":" action property directly into the action:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class DisableProfileAction extends Action\n{\n public bool $standalone = true;\n\n //...\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" DisableProfileAction"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Action\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $standalone "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"standalone-action-call"},"children":[{"type":"text","value":"Standalone action call"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To call a standalone action you're using a similar URL as for the "},{"type":"element","tag":"a","props":{"href":"#index-action-call"},"children":[{"type":"text","value":"index action"}]}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"POST: api/restfiy/users/actions?action=disable-profile-action\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"POST: api/restfiy/users/actions?action=disable-profile-action\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"However, you are not required to pass the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"repositories"}]},{"type":"text","value":" payload key."}]},{"type":"element","tag":"h3","props":{"id":"list-standalone-actions"},"children":[{"type":"text","value":"List standalone actions"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Standalone actions will be displayed on both "},{"type":"element","tag":"a","props":{"href":"#list-show-actions"},"children":[{"type":"text","value":"listing show actions"}]},{"type":"text","value":" or "},{"type":"element","tag":"a","props":{"href":"#list-index-actions"},"children":[{"type":"text","value":"listing index actions"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h2","props":{"id":"filters"},"children":[{"type":"text","value":"Filters"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can apply any search, match, filter or eager loadings as for a usual request:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"POST: api/api/restify/posts/actions?action=publish-posts-action&id=1&filters=\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"POST: api/api/restify/posts/actions?action=publish-posts-action&id=1&filters=\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This will apply the match for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"id = 1"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":" along with the match for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"repositories"}]},{"type":"text","value":" payload you're\nsending."}]},{"type":"element","tag":"h2","props":{"id":"action-log"},"children":[{"type":"text","value":"Action Log"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Oftentimes, it is quite useful to view a log of the actions that have been run against a model, or see when the model was\nupdated, deleted or created (and by whom)."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Thankfully, Restify makes it a breeze to add an action log to a model by attaching the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Binaryk\\LaravelRestify\\Models\\Concerns\\HasActionLogs"}]},{"type":"text","value":" trait to the repository's corresponding Eloquent model."}]},{"type":"element","tag":"h3","props":{"id":"activate-logs"},"children":[{"type":"text","value":"Activate logs"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By simply adding the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"HasActionLogs"}]},{"type":"text","value":" trait to your model, it will log all actions and CRUD operations into the database into the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"action_logs"}]},{"type":"text","value":" table:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// Post.php\n\nclass Post extends Model \n{\n use \\Binaryk\\LaravelRestify\\Models\\Concerns\\HasActionLogs;\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Post.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\Binaryk\\LaravelRestify\\Models\\Concerns\\HasActionLogs"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"display-logs"},"children":[{"type":"text","value":"Display logs"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can display them by attaching them to the related repository for example:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository.php\nuse Binaryk\\LaravelRestify\\Fields\\MorphToMany;\nuse Binaryk\\LaravelRestify\\Repositories\\ActionLogRepository;\n\npublic static function related(): array\n{\n return [\n 'logs' => MorphToMany::make('actionLogs', ActionLogRepository::class),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Fields\\MorphToMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Repositories\\ActionLogRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" related"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'logs'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" MorphToMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'actionLogs'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"ActionLogRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now you can call the posts with logs "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"api/restify/posts/1?related=logs"}]},{"type":"text","value":", and it will return you the list of actions\nperformed for posts:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"[\n {\n \"id\": \"1\",\n \"type\": \"action_logs\",\n \"attributes\": {\n \"user_id\": \"1\",\n \"name\": \"Stored\",\n \"actionable_type\": \"App\\\\Models\\\\Post\",\n \"actionable_id\": \"1\",\n \"status\": \"finished\",\n \"original\": [],\n \"changes\": [],\n \"exception\": \"\"\n }\n }\n]\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"[\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"1\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"action_logs\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"user_id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"1\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Stored\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"actionable_type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"App"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\\\"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"Models"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\\\"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"Post\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"actionable_id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"1\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"status\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"finished\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"original\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": [],\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"changes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": [],\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"exception\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"custom-logs-repository"},"children":[{"type":"text","value":"Custom logs repository"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can definitely use your own "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ActionLogRepository"}]},{"type":"text","value":". Just make sure you have it defined into the config:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// config/restify.php\n...\n'logs' => [\n 'repository' => MyCustomLogsRepository::class,\n],\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// config/restify.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'logs'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'repository'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" MyCustomLogsRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"],\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"get-available-actions"},"children":[{"type":"text","value":"Get available actions"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The frontend that consumes your API could check available actions by using this exposed endpoint:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: api/api/restify/posts/actions\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: api/api/restify/posts/actions\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This will answer with a json like:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"data\": {\n \"name\": \"Publish Posts Action\",\n \"destructive\": false,\n \"uriKey\": \"publish-posts-action\",\n \"payload\": []\n }\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"data\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Publish Posts Action\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"destructive\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"uriKey\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"publish-posts-action\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"payload\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": []\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"name"}]},{"type":"text","value":" - humanized name of the action"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"destructive"}]},{"type":"text","value":" - you may extend the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Binaryk\\LaravelRestify\\Actions\\DestructiveAction"}]},{"type":"text","value":" to indicate to the frontend that\nthis action is destructive (could be used for deletions)"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"uriKey"}]},{"type":"text","value":" - is the key of the action and it will be used to perform the action"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"payload"}]},{"type":"text","value":" - a key / value object indicating required payload defined in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rules"}]},{"type":"text","value":" Action class"}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"motivation","depth":2,"text":"Motivation"},{"id":"invokable-action-format","depth":2,"text":"Invokable Action Format"},{"id":"action-definition","depth":2,"text":"Action definition","children":[{"id":"register-action","depth":3,"text":"Register action"},{"id":"authorize-action","depth":3,"text":"Authorize action"},{"id":"call-actions","depth":3,"text":"Call actions"},{"id":"handle-action","depth":3,"text":"Handle action"}]},{"id":"action-customizations","depth":2,"text":"Action customizations","children":[{"id":"action-index-query","depth":3,"text":"Action index query"},{"id":"custom-uri-key","depth":3,"text":"Custom uri key"},{"id":"rules","depth":3,"text":"Rules"}]},{"id":"actions-scope","depth":2,"text":"Actions scope"},{"id":"show-actions","depth":2,"text":"Show actions","children":[{"id":"show-action-definition","depth":3,"text":"Show action definition"},{"id":"show-action-registration","depth":3,"text":"Show action registration"},{"id":"show-action-call","depth":3,"text":"Show action call"},{"id":"list-show-actions","depth":3,"text":"List show actions"}]},{"id":"index-actions","depth":2,"text":"Index actions","children":[{"id":"index-action-definition","depth":3,"text":"Index action definition"},{"id":"index-action-registration","depth":3,"text":"Index action registration"},{"id":"index-action-call","depth":3,"text":"Index action call"},{"id":"apply-index-action-for-all","depth":3,"text":"Apply index action for all"},{"id":"list-index-actions","depth":3,"text":"List index actions"}]},{"id":"standalone-actions","depth":2,"text":"Standalone actions","children":[{"id":"standalone-action-definition","depth":3,"text":"Standalone action definition:"},{"id":"standalone-action-registration","depth":3,"text":"Standalone action registration"},{"id":"standalone-action-call","depth":3,"text":"Standalone action call"},{"id":"list-standalone-actions","depth":3,"text":"List standalone actions"}]},{"id":"filters","depth":2,"text":"Filters"},{"id":"action-log","depth":2,"text":"Action Log","children":[{"id":"activate-logs","depth":3,"text":"Activate logs"},{"id":"display-logs","depth":3,"text":"Display logs"},{"id":"custom-logs-repository","depth":3,"text":"Custom logs repository"}]},{"id":"get-available-actions","depth":2,"text":"Get available actions"}]}},"_type":"markdown","_id":"content:api:actions.md","_source":"content","_file":"api/actions.md","_stem":"api/actions","_extension":"md"},"hash":"WSng0QROpp"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/api/fields.md b/docs-v3/.nuxt/content-cache/parsed/content/api/fields.md new file mode 100644 index 000000000..32953ca29 --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/api/fields.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/api/fields","_dir":"api","_draft":false,"_partial":false,"_locale":"","title":"Fields","description":"A field is basically the model's attribute representation.","menuTitle":"Fields","category":"API","position":8,"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"A field is basically the model's attribute representation."}]},{"type":"element","tag":"h2","props":{"id":"declaration"},"children":[{"type":"text","value":"Declaration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Each Field generally extends the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Binaryk\\LaravelRestify\\Fields\\Field"}]},{"type":"text","value":" class from the Laravel Restify. This class ships\na fluent API for a variety of mutators, interceptors and validators."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To add a field to a repository, we can simply add it to the repository's fields method. Typically, fields may be created\nusing their static "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"new"}]},{"type":"text","value":" or "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"make"}]},{"type":"text","value":" method."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The first argument is always the attribute name and usually matches the database "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"column"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"code":"\nuse Illuminate\\Support\\Facades\\Hash;\nuse Binaryk\\LaravelRestify\\Fields\\Field;\nuse Binaryk\\LaravelRestify\\Http\\Requests\\RestifyRequest;\n\npublic function fields(RestifyRequest $request)\n{\n return [\n Field::make('name')->required(),\n \n Field::make('email')->required()->storingRules('unique:users')->messages([\n 'required' => 'This field is required.',\n ]),\n ];\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Support\\Facades\\Hash"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Fields\\Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Http\\Requests\\RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"storingRules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'unique:users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"messages"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"([\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'This field is required.'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"field-helper"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field"}]},{"type":"text","value":" helper"}]},{"type":"element","tag":"alert","props":{},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Instead of using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Field"}]},{"type":"text","value":" class, you can use the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field"}]},{"type":"text","value":" helper. For example:"}]},{"type":"element","tag":"pre","props":{"code":"field('email')\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"computed-field"},"children":[{"type":"text","value":"Computed field"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The second optional argument is a callback or invokable, and it represents the displayable value of the field either in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"show"}]},{"type":"text","value":" or "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"index"}]},{"type":"text","value":" requests."}]},{"type":"element","tag":"pre","props":{"code":"field('name', fn() => 'John Doe')\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"() => "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'John Doe'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The field above will always return the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"name"}]},{"type":"text","value":" value as "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"John Doe"}]},{"type":"text","value":". The field is still writeable, so you can update or create an entity by using it."}]},{"type":"element","tag":"h3","props":{"id":"readonly-field"},"children":[{"type":"text","value":"Readonly field"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you don't want a field to be writeable you can mark it as readonly:"}]},{"type":"element","tag":"pre","props":{"code":"field('title')->readonly()\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"readonly"}]},{"type":"text","value":" accepts a request as well as you can use:"}]},{"type":"element","tag":"pre","props":{"code":"field('title')->readonly(fn($request) => $request->user()->isGuest())\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request) => $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isGuest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"())\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"virtual-field"},"children":[{"type":"text","value":"Virtual field"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"A virtual field, is a field that's "},{"type":"element","tag":"a","props":{"href":"#computed-field"},"children":[{"type":"text","value":"computed"}]},{"type":"text","value":" and "},{"type":"element","tag":"a","props":{"href":"#readonly-field"},"children":[{"type":"text","value":"readonly"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"code":"field('name', fn() => \"$this->first_name $this->last_name\")->readonly()\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"() => "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"first_name"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"last_name"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"authorization"},"children":[{"type":"text","value":"Authorization"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Field"}]},{"type":"text","value":" class provides a few methods in order to authorize certain actions. Each authorization method accepts a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Closure"}]},{"type":"text","value":" that\nshould return "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"true"}]},{"type":"text","value":"\nor "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"false"}]},{"type":"text","value":". The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Closure"}]},{"type":"text","value":" will receive the incoming "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"\\Illuminate\\Http\\Request"}]},{"type":"text","value":" request."}]},{"type":"element","tag":"h3","props":{"id":"can-see"},"children":[{"type":"text","value":"Can see"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Sometimes, you may want to hide certain fields from a group of users. You may easily accomplish this by chaining\nthe "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"canSee"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"code":"public function fields(RestifyRequest $request)\n{\n return [\n field('role_id')->canSee(fn($request) => $request->user()->isAdmin())\n ];\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'role_id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"canSee"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request) => $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isAdmin"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"())\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"can-store"},"children":[{"type":"text","value":"Can store"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The can store closure:"}]},{"type":"element","tag":"pre","props":{"code":"public function fields(RestifyRequest $request)\n{\n return [\n field('role_id')->canStore(fn($request) => $request->user()->isAdmin())\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'role_id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"canStore"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request) => $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isAdmin"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"())\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"can-update"},"children":[{"type":"text","value":"Can update"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The can update closure:"}]},{"type":"element","tag":"pre","props":{"code":"public function fields(RestifyRequest $request)\n{\n return [\n field('role_id')->canUpdate(fn($request) => $request->user()->isAdmin())\n ];\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'role_id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"canUpdate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request) => $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isAdmin"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"())\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"can-patch"},"children":[{"type":"text","value":"Can patch"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can authorize PATCH operations specifically:"}]},{"type":"element","tag":"pre","props":{"code":"public function fields(RestifyRequest $request)\n{\n return [\n field('status')->canPatch(fn($request) => $request->user()->can('patch-status'))\n ];\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'status'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"canPatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request) => $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"can"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'patch-status'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"))\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"can-update-bulk"},"children":[{"type":"text","value":"Can update bulk"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For bulk update operations, you can control authorization:"}]},{"type":"element","tag":"pre","props":{"code":"public function fields(RestifyRequest $request)\n{\n return [\n field('priority')->canUpdateBulk(fn($request) => $request->user()->isAdmin())\n ];\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'priority'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"canUpdateBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request) => $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isAdmin"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"())\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"bulk-operations"},"children":[{"type":"text","value":"Bulk Operations"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Laravel Restify provides specialized methods for handling bulk operations (creating or updating multiple records at once). Fields have specific callbacks and validation rules for these scenarios."}]},{"type":"element","tag":"h3","props":{"id":"bulk-visibility-control"},"children":[{"type":"text","value":"Bulk Visibility Control"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can control whether fields are visible during bulk operations:"}]},{"type":"element","tag":"pre","props":{"code":"public function fields(RestifyRequest $request)\n{\n return [\n field('title')->showOnStoreBulk(true)->showOnUpdateBulk(false),\n field('slug')->hideFromStoreBulk(), // Not editable during bulk creation\n ];\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"showOnStoreBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"showOnUpdateBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'slug'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"hideFromStoreBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(), "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Not editable during bulk creation\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The available visibility methods for bulk operations are:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"isShownOnStore()"}]},{"type":"text","value":" - Check if field is shown during single store"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"isShownOnStoreBulk()"}]},{"type":"text","value":" - Check if field is shown during bulk store"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"isShownOnUpdate()"}]},{"type":"text","value":" - Check if field is shown during single update"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"isShownOnUpdateBulk()"}]},{"type":"text","value":" - Check if field is shown during bulk update"}]}]},{"type":"element","tag":"h3","props":{"id":"bulk-authorization"},"children":[{"type":"text","value":"Bulk Authorization"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Use specialized authorization methods for bulk operations:"}]},{"type":"element","tag":"pre","props":{"code":"public function fields(RestifyRequest $request)\n{\n return [\n field('status')\n ->canStore(fn($request) => $request->user()->isAdmin())\n ->canUpdateBulk(fn($request) => $request->user()->isSuperAdmin()),\n ];\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'status'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"canStore"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request) => $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isAdmin"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"())\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"canUpdateBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request) => $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isSuperAdmin"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"field-type-detection"},"children":[{"type":"text","value":"Field Type Detection"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify includes an intelligent field type detection system that automatically infers the appropriate data type for fields based on various factors. This is particularly useful for API schema generation and MCP integration."}]},{"type":"element","tag":"h3","props":{"id":"automatic-type-detection"},"children":[{"type":"text","value":"Automatic Type Detection"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"guessFieldType()"}]},{"type":"text","value":" method analyzes fields using multiple strategies:"}]},{"type":"element","tag":"pre","props":{"code":"$field = field('email')->rules('required', 'email');\n$type = $field->guessFieldType(); // Returns: 'string'\n\n$field = field('is_active')->rules('boolean'); \n$type = $field->guessFieldType(); // Returns: 'boolean'\n\n$field = field('age')->rules('integer', 'min:0');\n$type = $field->guessFieldType(); // Returns: 'number'\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$field "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$type "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"guessFieldType"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Returns: 'string'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$field "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'is_active'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'boolean'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"); \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$type "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"guessFieldType"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Returns: 'boolean'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$field "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'age'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'integer'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'min:0'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$type "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"guessFieldType"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Returns: 'number'\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"detection-strategies"},"children":[{"type":"text","value":"Detection Strategies"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The system uses three detection strategies in order of priority:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Field Class Detection"}]},{"type":"text","value":" - Analyzes the field class name (File, Image, Boolean, etc.)"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Validation Rules Detection"}]},{"type":"text","value":" - Examines validation rules (email, boolean, integer, etc.)"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Attribute Name Patterns"}]},{"type":"text","value":" - Looks for common naming patterns"}]}]},{"type":"element","tag":"h4","props":{"id":"field-class-patterns"},"children":[{"type":"text","value":"Field Class Patterns"}]},{"type":"element","tag":"pre","props":{"code":"File::make('avatar')->guessFieldType(); // 'string'\nImage::make('photo')->guessFieldType(); // 'string' \nBooleanField::make('active')->guessFieldType(); // 'boolean'\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"File"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'avatar'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"guessFieldType"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// 'string'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Image"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'photo'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"guessFieldType"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// 'string' \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"BooleanField"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'active'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"guessFieldType"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// 'boolean'\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"validation-rule-patterns"},"children":[{"type":"text","value":"Validation Rule Patterns"}]},{"type":"element","tag":"pre","props":{"code":"field('email')->rules('email')->guessFieldType(); // 'string'\nfield('count')->rules('integer')->guessFieldType(); // 'number'\nfield('tags')->rules('array')->guessFieldType(); // 'array' \n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"guessFieldType"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// 'string'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'count'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'integer'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"guessFieldType"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// 'number'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'array'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"guessFieldType"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// 'array'\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"attribute-name-patterns"},"children":[{"type":"text","value":"Attribute Name Patterns"}]},{"type":"element","tag":"pre","props":{"code":"field('is_featured')->guessFieldType(); // 'boolean' (is_ prefix)\nfield('user_id')->guessFieldType(); // 'number' (_id suffix)\nfield('created_at')->guessFieldType(); // 'string' (_at suffix)\nfield('settings_json')->guessFieldType(); // 'array' (_json suffix)\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'is_featured'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"guessFieldType"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// 'boolean' (is_ prefix)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user_id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"guessFieldType"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// 'number' (_id suffix)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'created_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"guessFieldType"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// 'string' (_at suffix)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'settings_json'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"guessFieldType"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// 'array' (_json suffix)\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"computed-field-detection"},"children":[{"type":"text","value":"Computed Field Detection"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can check if a field is computed (virtual/calculated):"}]},{"type":"element","tag":"pre","props":{"code":"$field = field('full_name', fn() => \"$this->first_name $this->last_name\");\n$isComputed = $field->computed(); // Returns: true\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$field "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'full_name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"() => "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"first_name"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"last_name"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$isComputed "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"computed"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Returns: true\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"sorting"},"children":[{"type":"text","value":"Sorting"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Fields can be made sortable, allowing API consumers to order results by field values."}]},{"type":"element","tag":"h3","props":{"id":"making-fields-sortable"},"children":[{"type":"text","value":"Making Fields Sortable"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To make a field sortable, chain the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sortable()"}]},{"type":"text","value":" method:"}]},{"type":"element","tag":"pre","props":{"code":"public function fields(RestifyRequest $request)\n{\n return [\n field('name')->sortable(),\n field('email')->sortable(),\n field('created_at')->sortable(),\n field('is_active')->sortable(),\n ];\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"sortable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"sortable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'created_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"sortable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'is_active'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"sortable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"sortable-column-configuration"},"children":[{"type":"text","value":"Sortable Column Configuration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By default, the field's attribute name is used as the sortable column. You can specify a different column:"}]},{"type":"element","tag":"pre","props":{"code":"field('full_name')->sortable('name'), // Use 'name' column for 'full_name' field\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'full_name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"sortable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"), "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Use 'name' column for 'full_name' field\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"disabling-sorting"},"children":[{"type":"text","value":"Disabling Sorting"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can disable sorting for a field that was previously made sortable:"}]},{"type":"element","tag":"pre","props":{"code":"field('sensitive_data')->sortable(false),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'sensitive_data'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"sortable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"conditional-sorting"},"children":[{"type":"text","value":"Conditional Sorting"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Make fields conditionally sortable based on request context:"}]},{"type":"element","tag":"pre","props":{"code":"field('internal_score')->sortable(fn($request) => $request->user()->isAdmin()),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'internal_score'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"sortable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request) => $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isAdmin"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()),\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"using-sortable-fields"},"children":[{"type":"text","value":"Using Sortable Fields"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Once fields are marked as sortable, API consumers can use them in sort requests:"}]},{"type":"element","tag":"pre","props":{"code":"GET /api/restify/users?sort=name\nGET /api/restify/users?sort=-created_at # Descending\nGET /api/restify/users?sort=name,-created_at # Multiple fields\n","language":"http","meta":"","className":"language-http shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET /api/restify/users?sort=name\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET /api/restify/users?sort=-created_at # Descending\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET /api/restify/users?sort=name,-created_at # Multiple fields\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"matching"},"children":[{"type":"text","value":"Matching"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Fields can be made matchable, allowing API consumers to filter results using query parameters."}]},{"type":"element","tag":"h3","props":{"id":"making-fields-matchable"},"children":[{"type":"text","value":"Making Fields Matchable"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Use the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"matchable()"}]},{"type":"text","value":" method or convenient aliases:"}]},{"type":"element","tag":"pre","props":{"code":"public function fields(RestifyRequest $request)\n{\n return [\n field('name')->matchableText(), // Text matching with LIKE\n field('email')->matchable('users.email'), // Custom column - users table email\n field('status')->matchableText(), // Text matching\n field('is_active')->matchableBool(), // Boolean matching\n field('age')->matchableInteger(), // Integer matching\n field('created_at')->matchableDatetime(), // Date matching\n field('price')->matchableBetween(), // Range matching\n field('tags')->matchableArray(), // Array/IN matching\n ];\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"matchableText"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(), "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Text matching with LIKE\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"matchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users.email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"), "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Custom column - users table email\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'status'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"matchableText"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(), "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Text matching\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'is_active'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"matchableBool"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(), "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Boolean matching\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'age'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"matchableInteger"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(), "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Integer matching\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'created_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"matchableDatetime"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(), "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Date matching\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'price'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"matchableBetween"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(), "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Range matching\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"matchableArray"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(), "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Array/IN matching\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"using-matchable-fields"},"children":[{"type":"text","value":"Using Matchable Fields"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Once fields are marked as matchable, API consumers can filter using query parameters:"}]},{"type":"element","tag":"pre","props":{"code":"GET /api/restify/posts?title=Laravel # Text matching\nGET /api/restify/posts?is_active=true # Boolean matching\nGET /api/restify/posts?user_id=5 # Integer matching\nGET /api/restify/posts?created_at=2023-12-01 # Date matching\nGET /api/restify/posts?price=100,500 # Range matching\nGET /api/restify/posts?tags=php,laravel # Array matching\n\n# Negation (prefix with -)\nGET /api/restify/posts?-status=draft # Exclude drafts\nGET /api/restify/posts?-is_active=true # Inactive posts\n\n# Null checks\nGET /api/restify/posts?description=null # Posts with no description\n","language":"http","meta":"","className":"language-http shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET /api/restify/posts?title=Laravel # Text matching\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET /api/restify/posts?is_active=true # Boolean matching\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET /api/restify/posts?user_id=5 # Integer matching\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET /api/restify/posts?created_at=2023-12-01 # Date matching\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET /api/restify/posts?price=100,500 # Range matching\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET /api/restify/posts?tags=php,laravel # Array matching\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"# Negation (prefix with -)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET /api/restify/posts?-status=draft # Exclude drafts\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET /api/restify/posts?-is_active=true # Inactive posts\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"# Null checks\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET /api/restify/posts?description=null # Posts with no description\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"match-types-reference"},"children":[{"type":"text","value":"Match Types Reference"}]},{"type":"element","tag":"table","props":{},"children":[{"type":"element","tag":"thead","props":{},"children":[{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"th","props":{},"children":[{"type":"text","value":"Alias"}]},{"type":"element","tag":"th","props":{},"children":[{"type":"text","value":"Type"}]},{"type":"element","tag":"th","props":{},"children":[{"type":"text","value":"Example Usage"}]},{"type":"element","tag":"th","props":{},"children":[{"type":"text","value":"Query Behavior"}]}]}]},{"type":"element","tag":"tbody","props":{},"children":[{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"matchableText()"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"text"}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"?name=john"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"WHERE name LIKE '%john%'"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"matchableBool()"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"boolean"}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"?is_active=true"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"WHERE is_active = 1"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"matchableInteger()"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"integer"}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"?user_id=5"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"WHERE user_id = 5"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"matchableDatetime()"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"datetime"}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"?created_at=2023-12-01"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"WHERE DATE(created_at) = '2023-12-01'"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"matchableBetween()"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"between"}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"?price=100,500"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"WHERE price BETWEEN 100 AND 500"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"matchableArray()"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"array"}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"?tags=php,laravel"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"WHERE tags IN ('php', 'laravel')"}]}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"advanced-matchable-configuration"},"children":[{"type":"text","value":"Advanced Matchable Configuration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"matchable()"}]},{"type":"text","value":" method is flexible and accepts multiple types of arguments for advanced filtering scenarios:"}]},{"type":"element","tag":"h4","props":{"id":"basic-usage-no-arguments"},"children":[{"type":"text","value":"Basic Usage (No Arguments)"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When called without arguments, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"matchable()"}]},{"type":"text","value":" enables text-based matching using the field's attribute name:"}]},{"type":"element","tag":"pre","props":{"code":"field('title')->matchable(), // Enables text matching on 'title' column\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"matchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(), "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Enables text matching on 'title' column\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"custom-column"},"children":[{"type":"text","value":"Custom Column"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Specify a different database column for matching:"}]},{"type":"element","tag":"pre","props":{"code":"field('display_name')->matchable('users.name'), // Match against 'users.name' column\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'display_name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"matchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users.name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"), "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Match against 'users.name' column\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"custom-match-type"},"children":[{"type":"text","value":"Custom Match Type"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Specify both column and match type:"}]},{"type":"element","tag":"pre","props":{"code":"field('status')->matchable('posts.status', 'text'), // Custom column with text matching\nfield('priority')->matchable('priority', 'integer'), // Integer matching\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'status'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"matchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'posts.status'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'text'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"), "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Custom column with text matching\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'priority'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"matchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'priority'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'integer'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"), "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Integer matching\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"closure-based-matching"},"children":[{"type":"text","value":"Closure-based Matching"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For complex filtering logic, pass a closure that receives the request, query builder, and value:"}]},{"type":"element","tag":"pre","props":{"code":"field('title')->matchable(function ($request, $query, $value) {\n // Custom search logic - case insensitive partial matching\n $query->where('title', 'like', \"%{$value}%\");\n}),\n\nfield('content')->matchable(function ($request, $query, $value) {\n // Full-text search across multiple columns\n $query->whereRaw(\"MATCH(title, content) AGAINST(? IN BOOLEAN MODE)\", [$value]);\n}),\n\nfield('location')->matchable(function ($request, $query, $value) {\n // Complex geographical search\n [$lat, $lng, $radius] = explode(',', $value);\n $query->whereRaw(\n 'ST_Distance_Sphere(POINT(longitude, latitude), POINT(?, ?)) <= ?',\n [$lng, $lat, $radius * 1000]\n );\n}),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"matchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($request, $query, $value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Custom search logic - case insensitive partial matching\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'like'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"%{"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}%\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'content'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"matchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($request, $query, $value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Full-text search across multiple columns\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"whereRaw"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"MATCH(title, content) AGAINST(? IN BOOLEAN MODE)\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", [$value]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'location'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"matchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($request, $query, $value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Complex geographical search\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [$lat, $lng, $radius] "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" explode"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"','"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", $value);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"whereRaw"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'ST_Distance_Sphere(POINT(longitude, latitude), POINT(?, ?)) <= ?'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [$lng, $lat, $radius "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"*"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" 1000"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}),\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"custom-matchfilter-classes"},"children":[{"type":"text","value":"Custom MatchFilter Classes"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For reusable complex filtering logic, create custom MatchFilter classes:"}]},{"type":"element","tag":"pre","props":{"code":"use Binaryk\\LaravelRestify\\Filters\\MatchFilter;\nuse Binaryk\\LaravelRestify\\Http\\Requests\\RestifyRequest;\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Database\\Eloquent\\Relations\\Relation;\n\nclass CustomTitleFilter extends MatchFilter\n{\n public function __construct()\n {\n parent::__construct();\n $this->setColumn('title'); // Set the column to filter on\n }\n\n public function filter(RestifyRequest $request, Builder|Relation $query, $value)\n {\n // Custom filtering logic: search for titles that start with the given value\n $query->where('title', 'like', \"{$value}%\");\n \n return $query;\n }\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Filters\\MatchFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Http\\Requests\\RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Database\\Eloquent\\Builder"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Database\\Eloquent\\Relations\\Relation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" CustomTitleFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" MatchFilter\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" __construct"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" parent::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"__construct"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"setColumn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Set the column to filter on\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" filter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Builder"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"|"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Relation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query, $value)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Custom filtering logic: search for titles that start with the given value\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'like'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"{"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}%\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Then use the custom filter in your field definition:"}]},{"type":"element","tag":"pre","props":{"code":"field('title')->matchable(new CustomTitleFilter()),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"matchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" CustomTitleFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()),\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"invokable-classes"},"children":[{"type":"text","value":"Invokable Classes"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can also use invokable classes for cleaner code organization:"}]},{"type":"element","tag":"pre","props":{"code":"class SearchTitleFilter\n{\n public function __invoke($request, $query, $value)\n {\n $query->where('title', 'like', \"%{$value}%\")\n ->orWhere('description', 'like', \"%{$value}%\");\n }\n}\n\n// Usage\nfield('search')->matchable(new SearchTitleFilter()),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" SearchTitleFilter\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" __invoke"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request, $query, $value)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'like'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"%{"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}%\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"orWhere"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'description'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'like'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"%{"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}%\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Usage\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'search'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"matchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" SearchTitleFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()),\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"practical-examples"},"children":[{"type":"text","value":"Practical Examples"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"E-commerce Product Search:"}]}]},{"type":"element","tag":"pre","props":{"code":"field('search')->matchable(function ($request, $query, $value) {\n $query->where(function ($q) use ($value) {\n $q->where('name', 'like', \"%{$value}%\")\n ->orWhere('description', 'like', \"%{$value}%\")\n ->orWhere('sku', 'like', \"%{$value}%\");\n });\n}),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'search'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"matchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($request, $query, $value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($q) "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $q"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'like'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"%{"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}%\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"orWhere"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'description'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'like'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"%{"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}%\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"orWhere"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'sku'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'like'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"%{"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}%\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}),\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Date Range Filtering:"}]}]},{"type":"element","tag":"pre","props":{"code":"field('date_range')->matchable(function ($request, $query, $value) {\n [$start, $end] = explode(',', $value);\n $query->whereBetween('created_at', [$start, $end]);\n}),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'date_range'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"matchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($request, $query, $value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [$start, $end] "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" explode"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"','"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", $value);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"whereBetween"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'created_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", [$start, $end]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}),\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Tag-based Filtering:"}]}]},{"type":"element","tag":"pre","props":{"code":"field('tags')->matchable(function ($request, $query, $value) {\n $tags = explode(',', $value);\n $query->whereHas('tags', function ($q) use ($tags) {\n $q->whereIn('slug', $tags);\n });\n}),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"matchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($request, $query, $value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $tags "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" explode"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"','"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", $value);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"whereHas"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($q) "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($tags) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $q"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"whereIn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'slug'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", $tags);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}),\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Relationship Filtering:"}]}]},{"type":"element","tag":"pre","props":{"code":"field('author')->matchable(function ($request, $query, $value) {\n $query->whereHas('author', function ($q) use ($value) {\n $q->where('name', 'like', \"%{$value}%\")\n ->orWhere('email', 'like', \"%{$value}%\");\n });\n}),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'author'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"matchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($request, $query, $value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"whereHas"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'author'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($q) "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $q"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'like'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"%{"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}%\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"orWhere"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'like'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"%{"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}%\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}),\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"searchable"},"children":[{"type":"text","value":"Searchable"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Fields can be made searchable, enabling them to respond to global search queries. This provides field-level control over search behavior while maintaining the simplicity of the global search API."}]},{"type":"element","tag":"h3","props":{"id":"making-fields-searchable"},"children":[{"type":"text","value":"Making Fields Searchable"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To make a field searchable, chain the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"searchable()"}]},{"type":"text","value":" method:"}]},{"type":"element","tag":"pre","props":{"code":"public function fields(RestifyRequest $request)\n{\n return [\n field('title')->searchable(),\n field('description')->searchable(),\n field('email')->searchable(),\n ];\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'description'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"searchable()"}]},{"type":"text","value":" method uses a unified flexible signature that accepts multiple arguments and works consistently across all field types:"}]},{"type":"element","tag":"pre","props":{"code":"// Basic usage\nfield('title')->searchable(),\n\n// Custom column\nfield('name')->searchable('users.full_name'),\n\n// With optional type\nfield('price')->searchable('products.price', 'numeric'),\n\n// Multiple attributes (especially useful for relationship fields like BelongsTo)\nBelongsTo::make('author')->searchable('name', 'email', 'username'),\n\n// Array of attributes (legacy support)\nBelongsTo::make('editor')->searchable(['users.name', 'users.email']),\n\n// Closure/callback\nfield('content')->searchable(function ($request, $query, $value) {\n // Custom search logic\n}),\n\n// Custom filter instance\nfield('complex_search')->searchable(new CustomSearchFilter()),\n\n// Invokable class\nfield('tags')->searchable(new TagSearchHandler()),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Basic usage\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Custom column\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users.full_name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// With optional type\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'price'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'products.price'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'numeric'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Multiple attributes (especially useful for relationship fields like BelongsTo)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"BelongsTo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'author'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'username'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Array of attributes (legacy support)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"BelongsTo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'editor'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users.name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users.email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Closure/callback\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'content'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($request, $query, $value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Custom search logic\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Custom filter instance\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'complex_search'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" CustomSearchFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Invokable class\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" TagSearchHandler"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()),\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"unified-method-signatures"},"children":[{"type":"text","value":"Unified Method Signatures"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"All searchable-related methods now use consistent signatures across regular fields and relationship fields:"}]},{"type":"element","tag":"pre","props":{"code":"// All field types use the same signatures:\nsearchable(...$attributes) // Flexible variadic signature\nisSearchable(?RestifyRequest $request = null) // Optional request parameter\ngetSearchColumn(?RestifyRequest $request = null) // Optional request parameter\n\n// BelongsTo also provides relationship-specific method:\ngetSearchables(): array // Returns multiple searchable attributes\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// All field types use the same signatures:\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"..."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$attributes) "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Flexible variadic signature\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isSearchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Optional request parameter\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"getSearchColumn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Optional request parameter\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// BelongsTo also provides relationship-specific method:\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"getSearchables"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Returns multiple searchable attributes\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"using-searchable-fields"},"children":[{"type":"text","value":"Using Searchable Fields"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Searchable fields respond to the standard "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"search"}]},{"type":"text","value":" query parameter:"}]},{"type":"element","tag":"pre","props":{"code":"GET /api/restify/posts?search=laravel\n","language":"http","meta":"","className":"language-http shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET /api/restify/posts?search=laravel\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This will search across all searchable fields for the term \"laravel\"."}]},{"type":"element","tag":"h3","props":{"id":"advanced-searchable-configuration"},"children":[{"type":"text","value":"Advanced Searchable Configuration"}]},{"type":"element","tag":"h4","props":{"id":"basic-usage-no-arguments-1"},"children":[{"type":"text","value":"Basic Usage (No Arguments)"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When called without arguments, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"searchable()"}]},{"type":"text","value":" applies standard search behavior using the field's attribute:"}]},{"type":"element","tag":"pre","props":{"code":"field('title')->searchable(), // Searches the 'title' column with LIKE operator\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(), "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Searches the 'title' column with LIKE operator\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"custom-column-1"},"children":[{"type":"text","value":"Custom Column"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Specify a different database column for searching:"}]},{"type":"element","tag":"pre","props":{"code":"field('author_name')->searchable('users.name'), // Search in users.name column\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'author_name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users.name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"), "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Search in users.name column\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can also specify multiple attributes for relationship fields (like BelongsTo):"}]},{"type":"element","tag":"pre","props":{"code":"BelongsTo::make('author', UserRepository::class)->searchable('name', 'email'),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"BelongsTo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'author'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"closure-based-searching"},"children":[{"type":"text","value":"Closure-based Searching"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For custom search logic, pass a closure that receives the request, query builder, and search value:"}]},{"type":"element","tag":"pre","props":{"code":"field('content')->searchable(function ($request, $query, $value) {\n $query->where('title', 'LIKE', \"%{$value}%\")\n ->orWhere('description', 'LIKE', \"%{$value}%\");\n}),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'content'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($request, $query, $value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'LIKE'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"%{"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}%\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"orWhere"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'description'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'LIKE'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"%{"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}%\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}),\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"custom-searchablefilter-classes"},"children":[{"type":"text","value":"Custom SearchableFilter Classes"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Create dedicated filter classes for complex search logic:"}]},{"type":"element","tag":"pre","props":{"code":"field('complex_search')->searchable(new CustomContentSearchFilter),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'complex_search'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" CustomContentSearchFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Where "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"CustomContentSearchFilter"}]},{"type":"text","value":" extends "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"SearchableFilter"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"code":"use Binaryk\\LaravelRestify\\Filters\\SearchableFilter;\nuse Binaryk\\LaravelRestify\\Http\\Requests\\RestifyRequest;\n\nclass CustomContentSearchFilter extends SearchableFilter\n{\n public function filter(RestifyRequest $request, $query, $value)\n {\n return $query->where(function ($q) use ($value) {\n $q->where('title', 'LIKE', \"%{$value}%\")\n ->orWhere('description', 'LIKE', \"%{$value}%\")\n ->orWhere('tags', 'LIKE', \"%{$value}%\");\n });\n }\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Filters\\SearchableFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Http\\Requests\\RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" CustomContentSearchFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" SearchableFilter\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" filter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $query, $value)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($q) "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $q"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'LIKE'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"%{"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}%\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"orWhere"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'description'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'LIKE'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"%{"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}%\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"orWhere"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'LIKE'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"%{"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}%\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"invokable-classes-1"},"children":[{"type":"text","value":"Invokable Classes"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For reusable search logic, use invokable classes:"}]},{"type":"element","tag":"pre","props":{"code":"field('tags')->searchable(new TagSearchFilter),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" TagSearchFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]}]}]},{"type":"element","tag":"pre","props":{"code":"class TagSearchFilter\n{\n public function __invoke($request, $query, $value)\n {\n $tags = explode(',', $value);\n $query->whereHas('tags', function ($q) use ($tags) {\n $q->whereIn('name', $tags);\n });\n }\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" TagSearchFilter\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" __invoke"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request, $query, $value)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $tags "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" explode"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"','"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", $value);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"whereHas"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($q) "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($tags) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $q"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"whereIn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", $tags);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"practical-examples-1"},"children":[{"type":"text","value":"Practical Examples"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Full-text Search:"}]}]},{"type":"element","tag":"pre","props":{"code":"field('content')->searchable(function ($request, $query, $value) {\n $query->whereFullText(['title', 'description'], $value);\n}),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'content'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($request, $query, $value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"whereFullText"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'description'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"], $value);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}),\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Multi-field Search:"}]}]},{"type":"element","tag":"pre","props":{"code":"field('user_search')->searchable(function ($request, $query, $value) {\n $query->where('name', 'LIKE', \"%{$value}%\")\n ->orWhere('email', 'LIKE', \"%{$value}%\")\n ->orWhere('phone', 'LIKE', \"%{$value}%\");\n}),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user_search'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($request, $query, $value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'LIKE'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"%{"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}%\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"orWhere"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'LIKE'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"%{"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}%\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"orWhere"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'phone'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'LIKE'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"%{"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}%\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}),\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Relationship Search:"}]}]},{"type":"element","tag":"pre","props":{"code":"field('author')->searchable(function ($request, $query, $value) {\n $query->whereHas('author', function ($q) use ($value) {\n $q->where('name', 'like', \"%{$value}%\");\n });\n}),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'author'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($request, $query, $value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"whereHas"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'author'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($q) "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $q"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'like'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"%{"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}%\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}),\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"JSON Search:"}]}]},{"type":"element","tag":"pre","props":{"code":"field('metadata')->searchable(function ($request, $query, $value) {\n $query->whereJsonContains('metadata->tags', $value);\n}),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'metadata'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($request, $query, $value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"whereJsonContains"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'metadata->tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", $value);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}),\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"validation"},"children":[{"type":"text","value":"Validation"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"There is a golden rule that says - catch the exception as soon as possible on its request way."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Validations are the first bridge of your request information, so it would be a good start to validate your input. In this manner, you\ndon't have to worry about the payload anymore."}]},{"type":"element","tag":"h3","props":{"id":"attaching-rules"},"children":[{"type":"text","value":"Attaching rules"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Validation rules could be added by chaining the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rules"}]},{"type":"text","value":" method to\nattach "},{"type":"element","tag":"a","props":{"href":"https://laravel.com/docs/validation#available-validation-rules","rel":["nofollow"]},"children":[{"type":"text","value":"validation rules"}]},{"type":"text","value":" to the field:"}]},{"type":"element","tag":"pre","props":{"code":"field('email')->rules('required', 'email'),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Of course, if you are leveraging Laravel's support\nfor "},{"type":"element","tag":"a","props":{"href":"https://laravel.com/docs/validation#using-rule-objects","rel":["nofollow"]},"children":[{"type":"text","value":"validation rule objects"}]},{"type":"text","value":", you may attach those to the resources\nas well:"}]},{"type":"element","tag":"pre","props":{"code":"Field::new('email')->rules('required', new CustomRule),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" CustomRule"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Additionally, you may use "},{"type":"element","tag":"a","props":{"href":"https://laravel.com/docs/validation#using-closures","rel":["nofollow"]},"children":[{"type":"text","value":"custom Closure rules"}]},{"type":"text","value":"\nto validate your resource fields:"}]},{"type":"element","tag":"pre","props":{"code":"Field::new('email')->rules('required', function($attribute, $value, $fail) {\n if (strtolower($value) !== $value) {\n return $fail('The '.$attribute.' field must be lowercase.');\n }\n}),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($attribute, $value, $fail) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"strtolower"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($value) "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"!=="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $fail("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'The '"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$attribute"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"' field must be lowercase.'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}),\n"}]}]}]}]},{"type":"element","tag":"alert","props":{"type":"success"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Considering the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"required"}]},{"type":"text","value":" rule is very often used, Restify provides a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"required()"}]},{"type":"text","value":" validation\nhelper: "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field('email')->required()"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"These rules will be applied for all the update and store requests."}]},{"type":"element","tag":"h3","props":{"id":"storing-rules"},"children":[{"type":"text","value":"Storing Rules"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you would like to define more specific rules that only apply when a resource is being stored, you might want to use\nthe "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"storingRules"}]},{"type":"text","value":" method:"}]},{"type":"element","tag":"pre","props":{"code":"Field::new('email')\n ->rules('required', 'email', 'max:255')\n ->storingRules('unique:users,email');\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'max:255'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"storingRules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'unique:users,email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Considering the fact that Restify concatenates rules provided by the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rules()"}]},{"type":"text","value":" method, the entire validation for a POST request on\nthis repository will look like this:"}]},{"type":"element","tag":"pre","props":{"code":"$request->validate([\n 'email' => ['required', 'email', 'max:255', 'unique:users,email']\n]);\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"validate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"([\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'max:255'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'unique:users,email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]);\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"updating-rules"},"children":[{"type":"text","value":"Updating Rules"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Similarly, if you would like to define rules that only apply when a resource is being updated, you may use\nthe "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"updatingRules"}]},{"type":"text","value":" method."}]},{"type":"element","tag":"pre","props":{"code":"Field::new('email')->updatingRules('required', 'email');\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"updatingRules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"bulk-rules"},"children":[{"type":"text","value":"Bulk Rules"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For bulk operations, you can specify validation rules that apply only during bulk store or bulk update operations:"}]},{"type":"element","tag":"h4","props":{"id":"store-bulk-rules"},"children":[{"type":"text","value":"Store Bulk Rules"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Rules that apply only during bulk store operations:"}]},{"type":"element","tag":"pre","props":{"code":"Field::new('email')\n ->rules('required', 'email')\n ->storeBulkRules('unique:users,email');\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"storeBulkRules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'unique:users,email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"update-bulk-rules"},"children":[{"type":"text","value":"Update Bulk Rules"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Rules that apply only during bulk update operations:"}]},{"type":"element","tag":"pre","props":{"code":"Field::new('email')\n ->rules('email')\n ->updateBulkRules('required');\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"updateBulkRules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"store-rules-alias"},"children":[{"type":"text","value":"Store Rules Alias"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can also use "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"storeRules()"}]},{"type":"text","value":" as an alias for "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"storingRules()"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"code":"Field::new('email')->storeRules('unique:users,email');\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"storeRules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'unique:users,email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"interceptors"},"children":[{"type":"text","value":"Interceptors"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Sometimes you might want to take control over certain Field actions."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"That's why the Field class exposes a lot of chained methods you can call to configure it."}]},{"type":"element","tag":"h3","props":{"id":"fill-callback"},"children":[{"type":"text","value":"Fill callback"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"During the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"store"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"update"}]},{"type":"text","value":" requests, there are two steps before the value from the Request is attached to the model attribute."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"First, it is retrieved from the application request and passed to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fillCallback"}]},{"type":"text","value":". Then, the value is passed through the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"storeCallback"}]},{"type":"text","value":" or "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"updateCallback"}]},{"type":"text","value":":"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You may intercept each of these with closures."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's start with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fillCallback"}]},{"type":"text","value":". It accepts a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"callable"}]},{"type":"text","value":" (an invokable class) or a Closure. The callable will receive the Request, the repository model (an empty one for storing and filled one for updating) and the attribute name:"}]},{"type":"element","tag":"pre","props":{"code":"field('title')->fillCallback(function (RestifyRequest $request, Post $model, $attribute) {\n $model->title = strtoupper($request->input('title_from_the_request'));\n})\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"fillCallback"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model, $attribute) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"title "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" strtoupper"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"input"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title_from_the_request'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"})\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This way you can get anything from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$request"}]},{"type":"text","value":" and perform any transformations with the value before storing."}]},{"type":"element","tag":"h3","props":{"id":"store-callback"},"children":[{"type":"text","value":"Store callback"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Another handy interceptor is the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"storeCallback"}]},{"type":"text","value":". This is the step that comes immediately before attaching the value from the\nrequest to the model attribute:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This interceptor may be useful for modifying the value passed through the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$request"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"code":"Field::new('password')->storeCallback(function (RestifyRequest $request) {\n return Hash::make($request->input('password'));\n});\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'password'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"storeCallback"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Hash"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"input"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'password'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"});\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"update-callback"},"children":[{"type":"text","value":"Update callback"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"updateCallback"}]},{"type":"text","value":" works in the same manner. Let's use an invokable this time:"}]},{"type":"element","tag":"pre","props":{"code":"Field::new('password')->updateCallback(new PasswordUpdateInvokable);\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'password'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"updateCallback"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" PasswordUpdateInvokable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Where the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PasswordUpdateInvokable"}]},{"type":"text","value":" could be an invokable class:"}]},{"type":"element","tag":"pre","props":{"code":"class PasswordUpdateInvokable \n{\n public function __invoke(Request $request)\n {\n return Hash::make($request->input('password'));\n }\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PasswordUpdateInvokable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" __invoke"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Hash"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"input"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'password'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"store-bulk-callback"},"children":[{"type":"text","value":"Store bulk callback"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For bulk store operations, you can use the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"storeBulkCallback"}]},{"type":"text","value":" to modify values during bulk creation:"}]},{"type":"element","tag":"pre","props":{"code":"Field::new('slug')->storeBulkCallback(function (RestifyRequest $request) {\n return Str::slug($request->input('title'));\n});\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'slug'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"storeBulkCallback"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Str"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"slug"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"input"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"});\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"index-callback"},"children":[{"type":"text","value":"Index Callback"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Sometimes, you might want to transform an attribute from the database right before it is returned to the frontend."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Transform the value for the following index request:"}]},{"type":"element","tag":"pre","props":{"code":"Field::new('password')->indexCallback(function ($value) {\n return Hash::make($value);\n});\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'password'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"indexCallback"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Hash"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($value);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"});\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"show-callback"},"children":[{"type":"text","value":"Show callback"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Transform the value for the following show request:"}]},{"type":"element","tag":"pre","props":{"code":"Field::new('password')->showCallback(function ($value) {\n return Hash::make($value);\n});\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'password'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"showCallback"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Hash"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($value);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"});\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"resolve-callback"},"children":[{"type":"text","value":"Resolve callback"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Transform the value for both "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"show"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"index"}]},{"type":"text","value":" requests:"}]},{"type":"element","tag":"pre","props":{"code":"Field::new('password')->resolveCallback(function ($value) {\n return Hash::make($value);\n});\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'password'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"resolveCallback"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Hash"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($value);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"});\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"fields-actionable"},"children":[{"type":"text","value":"Fields actionable"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"At times, storing attributes might require the stored model before saving it."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For example, let's say the Post model uses the "},{"type":"element","tag":"a","props":{"href":"https://spatie.be/docs/laravel-medialibrary/v9/introduction","rel":["nofollow"]},"children":[{"type":"text","value":"media library"}]},{"type":"text","value":", and has the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"media"}]},{"type":"text","value":" relationship that is a list of Media files:"}]},{"type":"element","tag":"pre","props":{"code":"// PostRepository\n\npublic function fields(RestifyRequest $request): array\n{\n return [\n field('title'),\n \n field('files', \n fn () => $this->model()->media()->pluck('file_name')\n )\n ->action(new AttachPostFileRestifyAction),\n ];\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'files'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" () => "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"media"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"pluck"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'file_name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" )\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"action"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" AttachPostFileRestifyAction"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"So we have a virtual "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"files"}]},{"type":"text","value":" field (it's not an actual database column) that uses a "},{"type":"element","tag":"a","props":{"href":"#computed-field"},"children":[{"type":"text","value":"computed field"}]},{"type":"text","value":" to display the list of Post's files names. The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"->action()"}]},{"type":"text","value":" calls and accepts an instance of a class that extends "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Binaryk\\LaravelRestify\\Actions\\Action"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"code":"class AttachPostFileRestifyAction extends Action\n{\n public function handle(RestifyRequest $request, Post $post): void\n {\n $post->addMediaFromRequest('file')\n ->toMediaCollection();\n }\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" AttachPostFileRestifyAction"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Action\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" handle"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $post)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" void\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"addMediaFromRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'file'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"toMediaCollection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The action gets the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$request"}]},{"type":"text","value":" and the current "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$post"}]},{"type":"text","value":" model. Let's say the frontend has to create a post with a file:"}]},{"type":"element","tag":"pre","props":{"code":"const data = new FormData;\ndata.append('file', blobFile);\ndata.append('title', 'Post title');\n\naxios.post(`api/restify/posts`, data);\n","language":"javascript","meta":"","className":"language-javascript shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" data"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" FormData;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"data."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"append"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'file'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", blobFile);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"data."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"append"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'Post title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"axios."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"`api/restify/posts`"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", data);\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We were able to create the post and attach a file using media library in a single request. Otherwise, it would have implied creating 2 separate requests (post creation and file attaching)."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Actionable fields handle "},{"type":"element","tag":"a","props":{"href":"/repositories#store-request"},"children":[{"type":"text","value":"store"}]},{"type":"text","value":", put, "},{"type":"element","tag":"a","props":{"href":"/repositories#store-bulk-flow"},"children":[{"type":"text","value":"bulk store"}]},{"type":"text","value":" and bulk update requests."}]},{"type":"element","tag":"h2","props":{"id":"fallbacks"},"children":[{"type":"text","value":"Fallbacks"}]},{"type":"element","tag":"h3","props":{"id":"default-stored-value"},"children":[{"type":"text","value":"Default Stored Value"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Usually, there is necessary to store a field as "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Auth::id()"}]},{"type":"text","value":". This field will be automatically populated by Restify if\nyou specify the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"value"}]},{"type":"text","value":" value for it:"}]},{"type":"element","tag":"pre","props":{"code":"Field::new('user_id')->value(Auth::id());\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user_id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Auth"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"id"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"());\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"or by using a closure:"}]},{"type":"element","tag":"pre","props":{"code":"Field::new('user_id')->hidden()->value(function(RestifyRequest $request, $model, $attribute) {\n return $request->user()->id;\n});\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user_id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"hidden"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $model, $attribute) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"id;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"});\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"default-displayed-value"},"children":[{"type":"text","value":"Default Displayed Value"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you have a field which has "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"null"}]},{"type":"text","value":" value into the database, you might want to return a fallback default value for\nthe frontend:"}]},{"type":"element","tag":"pre","props":{"code":"Field::new('description')->default('N/A');\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'description'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"default"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'N/A'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now, for the fields that don't have a description into the database, it will return "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"N/A"}]},{"type":"text","value":"."}]},{"type":"element","tag":"alert","props":{"type":"info"},"children":[{"type":"text","value":"\nThe default value is ONLY used for the READ, not for WRITE requests.\n"}]},{"type":"element","tag":"h3","props":{"id":"default-stored-value-1"},"children":[{"type":"text","value":"Default Stored Value"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"During any (update or store requests), this is called after the fill and store callbacks."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can pass a callable or a value, and it will be attached to the model if no value provided otherwise."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Imagine it's like "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"attributes"}]},{"type":"text","value":" in the model:"}]},{"type":"element","tag":"pre","props":{"code":"field('currency')->defaultCallback('EUR'),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'currency'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"defaultCallback"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'EUR'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"customizations"},"children":[{"type":"text","value":"Customizations"}]},{"type":"element","tag":"h3","props":{"id":"field-label"},"children":[{"type":"text","value":"Field label"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Field label, so you can replace a field attribute spelling when it is returned to the frontend:"}]},{"type":"element","tag":"pre","props":{"code":"Field::new('created_at')->label('sent_at')\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"Field::new('created_at')->label('sent_at')\n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you want to populate this value from a frontend request, you can use the label as a payload key."}]},{"type":"element","tag":"h3","props":{"id":"hidden-field"},"children":[{"type":"text","value":"Hidden field"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Field can be setup as hidden:"}]},{"type":"element","tag":"pre","props":{"code":"Field::new('token')->hidden(); // this will not be visible \n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'token'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"hidden"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// this will not be visible\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"However, you can populate the field value when the entity is stored by using "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"value"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"code":"Field::new('token')->value(Str::random(32))->hidden();\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'token'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Str"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"random"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"32"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"))"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"hidden"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"mcp-visibility-control"},"children":[{"type":"text","value":"MCP Visibility Control"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When using Laravel Restify with Model Context Protocol (MCP), you can control field visibility specifically for MCP requests using dedicated methods:"}]},{"type":"element","tag":"pre","props":{"code":"// Hide field from MCP requests completely\nField::new('secret_key')->hideFromMcp()\n\n// Show field only in MCP requests (hide from regular API)\nField::new('mcp_metadata')->showOnIndex(false)->showOnShow(false)->showOnMcp(true)\n\n// Conditionally hide based on user permissions\nField::new('admin_notes')->hideFromMcp(function($request, $repository) {\n return !$request->user()->isAdmin();\n})\n\n// Show field in MCP based on user role\nField::new('sensitive_data')->showOnMcp(function($request, $repository) {\n return $request->user()->can('view-sensitive', $repository);\n})\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Hide field from MCP requests completely\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'secret_key'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"hideFromMcp"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Show field only in MCP requests (hide from regular API)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'mcp_metadata'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"showOnIndex"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"showOnShow"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"showOnMcp"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Conditionally hide based on user permissions\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'admin_notes'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"hideFromMcp"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request, $repository) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" !"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isAdmin"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"})\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Show field in MCP based on user role\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'sensitive_data'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"showOnMcp"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request, $repository) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"can"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'view-sensitive'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", $repository);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"})\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"mcp-visibility-methods"},"children":[{"type":"text","value":"MCP Visibility Methods"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"showOnMcp($callback = true)"}]}]},{"type":"text","value":" - Control whether the field should be visible in MCP requests"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"hideFromMcp($callback = true)"}]}]},{"type":"text","value":" - Hide the field from MCP requests (inverse of showOnMcp)"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Both methods accept either a boolean value or a callback function that receives the request and repository as parameters."}]},{"type":"element","tag":"alert","props":{"type":"info"},"children":[{"type":"text","value":"\nMCP visibility rules take precedence over regular `showOnIndex`/`showOnShow` rules when processing MCP requests. Fields are visible in MCP by default unless explicitly hidden.\n"}]},{"type":"element","tag":"h4","props":{"id":"how-it-works"},"children":[{"type":"text","value":"How It Works"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The MCP visibility system automatically detects when a request is coming from an MCP tool and applies the appropriate visibility rules:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Regular API requests"}]},{"type":"text","value":" use "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"showOnIndex()"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"showOnShow()"}]},{"type":"text","value":" rules"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"MCP requests"}]},{"type":"text","value":" use "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"showOnMcp()"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"hideFromMcp()"}]},{"type":"text","value":" rules"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Default behavior"}]},{"type":"text","value":" - fields are visible in MCP unless explicitly hidden"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This allows you to have different field visibility for your regular API consumers versus AI agents accessing your data through MCP tools."}]},{"type":"element","tag":"h3","props":{"id":"field-descriptions"},"children":[{"type":"text","value":"Field Descriptions"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Fields can have custom descriptions that are used when generating schema documentation, particularly useful for MCP tools and API documentation:"}]},{"type":"element","tag":"pre","props":{"code":"public function fields(RestifyRequest $request)\n{\n return [\n field('status')\n ->description('The current status of the item')\n ->rules(['required', 'string']),\n \n field('feedbackable_id')\n ->description('This is the id of the employee.')\n ->rules(['required', 'string', 'max:26']),\n \n field('priority')\n ->description(function($generatedDescription, $field, $repository) {\n return $generatedDescription . ' - Values range from 1 (low) to 5 (high)';\n }),\n ];\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'status'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"description"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'The current status of the item'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'string'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'feedbackable_id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"description"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'This is the id of the employee.'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'string'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'max:26'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'priority'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"description"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($generatedDescription, $field, $repository) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $generatedDescription "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" ' - Values range from 1 (low) to 5 (high)'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"description()"}]},{"type":"text","value":" method accepts either:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"String"}]},{"type":"text","value":": A static description text"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Closure"}]},{"type":"text","value":": A callback that receives the auto-generated description, field instance, and repository for dynamic modifications"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When using a closure, you can:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Modify the automatically generated description"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Add context-specific information"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Access field and repository data for dynamic descriptions"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The description callback receives three parameters:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$generatedDescription"}]},{"type":"text","value":" - The automatically generated description based on field type and validation rules"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$field"}]},{"type":"text","value":" - The field instance"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$repository"}]},{"type":"text","value":" - The repository context"}]}]},{"type":"element","tag":"h3","props":{"id":"custom-tool-schema"},"children":[{"type":"text","value":"Custom Tool Schema"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When using MCP, you can define custom schema definitions for individual fields using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"toolSchema()"}]},{"type":"text","value":" method:"}]},{"type":"element","tag":"pre","props":{"code":"Field::new('status')->toolSchema(function ($field, $request, $repository) {\n return [\n 'type' => 'string',\n 'enum' => ['draft', 'published', 'archived'],\n 'description' => 'The publication status of the content'\n ];\n});\n\nField::new('settings')->toolSchema(function ($field, $request, $repository) {\n return [\n 'type' => 'object',\n 'properties' => [\n 'theme' => ['type' => 'string'],\n 'notifications' => ['type' => 'boolean']\n ],\n 'description' => 'User configuration settings'\n ];\n});\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'status'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"toolSchema"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($field, $request, $repository) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'type'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'string'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'enum'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'draft'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'published'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'archived'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"],\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'description'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'The publication status of the content'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"});\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'settings'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"toolSchema"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($field, $request, $repository) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'type'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'object'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'properties'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'theme'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'type'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'string'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"],\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'notifications'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'type'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'boolean'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ],\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'description'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'User configuration settings'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"});\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"toolSchema()"}]},{"type":"text","value":" callback receives:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$field"}]},{"type":"text","value":" - The field instance"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$request"}]},{"type":"text","value":" - The current request"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$repository"}]},{"type":"text","value":" - The parent repository"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This allows you to provide detailed schema information that helps MCP tools understand the structure and constraints of your data fields."}]},{"type":"element","tag":"h2","props":{"id":"hooks"},"children":[{"type":"text","value":"Hooks"}]},{"type":"element","tag":"h3","props":{"id":"after-store"},"children":[{"type":"text","value":"After store"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can handle the after field store callback:"}]},{"type":"element","tag":"pre","props":{"code":"Field::new('title')->afterStore(function($value) {\n dump($value);\n})\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"afterStore"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" dump"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($value);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"})\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"after-update"},"children":[{"type":"text","value":"After update"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can handle the after field is updated callback:"}]},{"type":"element","tag":"pre","props":{"code":"Field::new('title')->afterUpdate(function($value, $oldValue) {\n dump($value, $oldValue);\n})\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"afterUpdate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($value, $oldValue) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" dump"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($value, $oldValue);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"})\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"file-fields"},"children":[{"type":"text","value":"File fields"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To illustrate the behavior of Restify file upload fields, let's assume our application's users can upload \"avatar\nphotos\" to their account. Our users' database table will have an "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"avatar"}]},{"type":"text","value":" column. This column will contain the path\nto the profile on disk, or, when using a cloud storage provider such as Amazon S3, the profile photo's path within its\nbucket."}]},{"type":"element","tag":"h3","props":{"id":"defining-the-field"},"children":[{"type":"text","value":"Defining the field"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Next, let's attach the file field to our "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"UserRepository"}]},{"type":"text","value":". In this example, we will create the field and instruct it to\nstore the underlying file on the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"public"}]},{"type":"text","value":" disk. This disk name should correspond to a disk name in your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"filesystems"}]},{"type":"text","value":"\nconfiguration file:"}]},{"type":"element","tag":"pre","props":{"code":"use Binaryk\\LaravelRestify\\Fields\\File;\n\npublic function fields(RestifyRequest $request)\n{\n return [\n File::make('avatar')->disk('public')\n ];\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Fields\\File"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" File"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'avatar'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"disk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'public'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"alert","props":{"type":"info"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can use "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field('avatar')->file()"}]},{"type":"text","value":" instead of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"File::make('avatar')"}]},{"type":"text","value":" as well."}]}]},{"type":"element","tag":"h3","props":{"id":"how-files-are-stored"},"children":[{"type":"text","value":"How Files Are Stored"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When a file is uploaded by using this field, Restify will use\nLaravel's "},{"type":"element","tag":"a","props":{"href":"https://laravel.com/docs/filesystem","rel":["nofollow"]},"children":[{"type":"text","value":"Filesystem integration"}]},{"type":"text","value":" to store the file from the disk of your choice\nwith a randomly generated filename. Once the file is stored, Restify will store the relative path to the file in the\nfile field's underlying database column."}]},{"type":"element","tag":"h3","props":{"id":"url-input-support"},"children":[{"type":"text","value":"URL Input Support"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"File fields also accept URL strings as input, providing flexibility when working with remote files or existing URLs:"}]},{"type":"element","tag":"pre","props":{"code":"// You can send either a file upload or a URL string\nPOST /api/restify/users\n{\n \"name\": \"John Doe\",\n \"avatar\": \"https://example.com/images/avatar.jpg\"\n}\n\n// Or upload a file traditionally\nPOST /api/restify/users\nContent-Type: multipart/form-data\nname: John Doe\navatar: [binary file data]\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// You can send either a file upload or a URL string\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"POST"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" /"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"api"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"/"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"restify"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"/"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"users\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"John Doe\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"avatar\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"https://example.com/images/avatar.jpg\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Or upload a file traditionally\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"POST"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" /"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"api"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"/"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"restify"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"/"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"users\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Content"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"-"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Type"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"multipart"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"/"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"form"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"-"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"data\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"name"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"John"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Doe\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"avatar"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"binary"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" file"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" data"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When a valid URL is provided:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"The URL is stored directly in the database column"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"If "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"storeOriginalName()"}]},{"type":"text","value":" is configured, the filename from the URL is extracted and stored"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Validation rules are automatically adjusted to accept both files and URLs"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To illustrate the default behavior of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"File"}]},{"type":"text","value":" field, let's take a look at an equivalent route that would store the\nfile in the same way:"}]},{"type":"element","tag":"pre","props":{"code":"use Illuminate\\Http\\Request;\n\nRoute::post('/avatar', function (Request $request) {\n $path = $request->avatar->store('/', 'public');\n\n $request->user()->update([\n 'avatar' => $path,\n ]);\n});\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Http\\Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Route"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'/avatar'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $path "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"avatar"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"store"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'/'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'public'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"update"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"([\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'avatar'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $path,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"});\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you are using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"public"}]},{"type":"text","value":" disk with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"local"}]},{"type":"text","value":" driver, you should run the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"php artisan storage:link"}]},{"type":"text","value":" Artisan\ncommand to create a symbolic link from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"public/storage"}]},{"type":"text","value":" to "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"storage/app/public"}]},{"type":"text","value":". To learn more about file storage in\nLaravel, check out the "},{"type":"element","tag":"a","props":{"href":"https://laravel.com/docs/filesystem","rel":["nofollow"]},"children":[{"type":"text","value":"Laravel file storage documentation"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h3","props":{"id":"image"},"children":[{"type":"text","value":"Image"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Image"}]},{"type":"text","value":" field behaves exactly like the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"File"}]},{"type":"text","value":" field; however, it will instruct Restify to only accept mimetypes of\ntype "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"image/*"}]},{"type":"text","value":" for it:"}]},{"type":"element","tag":"pre","props":{"code":"Image::make('avatar')->storeAs('avatar.jpg')\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Image"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'avatar'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"storeAs"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'avatar.jpg'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"storing-metadata"},"children":[{"type":"text","value":"Storing Metadata"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In addition to storing the path to the file within the storage system, you may also instruct Restify to store the\noriginal client filename and its size (in bytes). You may accomplish this using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"storeOriginalName"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"storeSize"}]},{"type":"text","value":"\nmethods. Each of these methods accepts the name of the column that you would want to store the file's information in:"}]},{"type":"element","tag":"pre","props":{"code":"Image::make('avatar')\n ->storeOriginalName('avatar_original')\n ->storeSize('avatar_size')\n ->storeAs('avatar.jpg')\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Image"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'avatar'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"storeOriginalName"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'avatar_original'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"storeSize"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'avatar_size'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"storeAs"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'avatar.jpg'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The image above will store the file with the name "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"avatar.jpg"}]},{"type":"text","value":" in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"avatar"}]},{"type":"text","value":" column, the original file name\ninto "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"avatar_original"}]},{"type":"text","value":" column and file size in bytes under "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"avatar_size"}]},{"type":"text","value":" column (only if these columns are fillable on\nyour model)."}]},{"type":"element","tag":"alert","props":{"type":"info"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can use "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field('avatar')->image()"}]},{"type":"text","value":" instead of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Image::make('avatar')"}]},{"type":"text","value":" as well."}]}]},{"type":"element","tag":"h3","props":{"id":"pruning-deletion"},"children":[{"type":"text","value":"Pruning & Deletion"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"File fields are deletable by default, so check out the following field definition:"}]},{"type":"element","tag":"pre","props":{"code":"File::make('avatar')\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"File"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'avatar'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You have a request to delete the avatar of the user with the id 1:"}]},{"type":"element","tag":"pre","props":{"code":"DELETE: api/restify/users/1/field/avatar\n","language":"http","meta":"request","className":"language-http shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"DELETE: api/restify/users/1/field/avatar\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can override this behavior by using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"deletable"}]},{"type":"text","value":" method:"}]},{"type":"element","tag":"pre","props":{"code":"File::make('Photo')->disk('public')->deletable(false)\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"File"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'Photo'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"disk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'public'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"deletable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now, the field will not be deletable anymore."}]},{"type":"element","tag":"h3","props":{"id":"customizing-file-storage"},"children":[{"type":"text","value":"Customizing File Storage"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Previously we learned that, by default, Restify stores the file using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"store"}]},{"type":"text","value":" method of\nthe "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Illuminate\\Http\\UploadedFile"}]},{"type":"text","value":" class. However, you may fully customize this behavior based on your application's\nneeds."}]},{"type":"element","tag":"h4","props":{"id":"customizing-the-name-path"},"children":[{"type":"text","value":"Customizing The Name / Path"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you only need to customize the name or path of the stored file on disk, you may use the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"path"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"storeAs"}]},{"type":"text","value":" methods\nof the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"File"}]},{"type":"text","value":" field:"}]},{"type":"element","tag":"pre","props":{"code":"use Illuminate\\Http\\Request;\n\nFile::make('avatar')\n ->disk('s3')\n ->path($request->user()->id.'-attachments')\n ->storeAs(function (Request $request) {\n return sha1($request->attachment->getClientOriginalName());\n }),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Http\\Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"File"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'avatar'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"disk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'s3'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"path"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"id"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'-attachments'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"storeAs"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" sha1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"attachment"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"getClientOriginalName"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"());\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }),\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"customizing-the-entire-storage-process"},"children":[{"type":"text","value":"Customizing The Entire Storage Process"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"However, if you would like to take "},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"full"}]},{"type":"text","value":" control over the file storage logic of a field, you may use the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"store"}]},{"type":"text","value":"\nmethod. The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"store"}]},{"type":"text","value":" method accepts a callable which receives the incoming HTTP request and the model's instance associated\nwith the request:"}]},{"type":"element","tag":"pre","props":{"code":"use Illuminate\\Http\\Request;\n\nFile::make('avatar')\n ->store(function (Request $request, $model) {\n return [\n 'attachment' => $request->attachment->store('/', 's3'),\n 'attachment_name' => $request->attachment->getClientOriginalName(),\n 'attachment_size' => $request->attachment->getSize(),\n ];\n }),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Http\\Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"File"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'avatar'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"store"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $model) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'attachment'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"attachment"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"store"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'/'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'s3'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'attachment_name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"attachment"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"getClientOriginalName"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'attachment_size'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"attachment"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"getSize"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }),\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As you can see in the example above, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"store"}]},{"type":"text","value":" callback is returning an array of keys and values. These key / value\npairs are mapped onto your model's instance before it is saved to the database, allowing you to update one or many of the\nmodel's database columns after your file is stored."}]},{"type":"element","tag":"h3","props":{"id":"customizing-file-display"},"children":[{"type":"text","value":"Customizing File Display"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By default, Restify will display the file's stored path name. However, you may customize this behavior."}]},{"type":"element","tag":"h4","props":{"id":"displaying-temporary-url"},"children":[{"type":"text","value":"Displaying temporary url"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For disks such as S3, you may instruct Restify to display a temporary URL to the file instead of the stored path name:"}]},{"type":"element","tag":"pre","props":{"code":" field('path')\n ->file()\n ->path(\"documents/\".Auth::id())\n ->resolveUsingTemporaryUrl()\n ->disk('s3'),\n\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'path'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"file"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"path"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"documents/\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Auth"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"id"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"())\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"resolveUsingTemporaryUrl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"disk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'s3'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"resolveUsingTemporaryUrl"}]},{"type":"text","value":" accepts 3 arguments:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$resolveTemporaryUrl"}]},{"type":"text","value":" - a boolean to determine if the temporary url should be resolved. Defaults to "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"true"}]},{"type":"text","value":"."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$expiration"}]},{"type":"text","value":" - A CarbonInterface to determine the time before the URL expires. Defaults to 5 minutes."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$options"}]},{"type":"text","value":" - An array of options to pass to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"temporaryUrl"}]},{"type":"text","value":" method of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Illuminate\\Contracts\\Filesystem\\Filesystem"}]},{"type":"text","value":" implementation. Defaults to an empty array."}]}]},{"type":"element","tag":"h4","props":{"id":"displaying-full-url"},"children":[{"type":"text","value":"Displaying full url"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For disks such as "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"public"}]},{"type":"text","value":", you may instruct Restify to display a full URL to the file instead of the stored path name:"}]},{"type":"element","tag":"pre","props":{"code":" field('path')\n ->file()\n ->path(\"documents/\".Auth::id())\n ->resolveUsingFullUrl()\n ->disk('public'),\n\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'path'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"file"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"path"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"documents/\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Auth"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"id"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"())\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"resolveUsingFullUrl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"disk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'public'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"storeables"},"children":[{"type":"text","value":"Storeables"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Of course, performing all of your file storage logic within a Closure can cause your resource to become bloated. For\nthat reason, Restify allows you to pass an \"Storable\" class to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"store"}]},{"type":"text","value":" method:"}]},{"type":"element","tag":"pre","props":{"code":"File::make('avatar')->store(AvatarStore::class),\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"File"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'avatar'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"store"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"AvatarStore"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The storable class should be a simple PHP class that implements the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Binaryk\\LaravelRestify\\Repositories\\Storable"}]},{"type":"text","value":" contract:"}]},{"type":"element","tag":"pre","props":{"code":" $request->file('avatar')->storeAs('/', 'avatar.jpg', 'customDisk')\n ];\n }\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"file"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'avatar'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"storeAs"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'/'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'avatar.jpg'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'customDisk'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"command"},"children":[{"type":"text","value":"Command"}]},{"type":"element","tag":"alert","props":{},"children":[{"type":"text","value":"\nYou can use the "},{"type":"element","tag":"code","props":{},"children":[{"type":"text","value":"php artisan restify:store AvatarStore"}]},{"type":"text","value":" command to generate a store file.\n"}]},{"type":"element","tag":"h2","props":{"id":"lazy-loading"},"children":[{"type":"text","value":"Lazy Loading"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Fields can be configured to lazy load relationships, which is particularly useful for computed attributes that depend on related models. This helps avoid N+1 queries by ensuring relationships are loaded only when needed."}]},{"type":"element","tag":"h3","props":{"id":"making-fields-lazy"},"children":[{"type":"text","value":"Making Fields Lazy"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Use the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"lazy()"}]},{"type":"text","value":" method to mark a field for lazy loading:"}]},{"type":"element","tag":"pre","props":{"code":"public function fields(RestifyRequest $request)\n{\n return [\n // Lazy load the 'tags' relationship when displaying profileTagNames\n field('profileTagNames', fn() => $this->model()->profileTagNames)\n ->lazy('tags'),\n \n // Lazy load using the field's attribute name (if it matches the relationship)\n field('tags', fn() => $this->model()->tags->pluck('name'))\n ->lazy(),\n \n // Another example with user relationship\n field('authorName', fn() => $this->model()->user->name ?? 'Unknown')\n ->lazy('user'),\n ];\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Lazy load the 'tags' relationship when displaying profileTagNames\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'profileTagNames'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"() => "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"profileTagNames)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"lazy"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Lazy load using the field's attribute name (if it matches the relationship)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"() => "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"tags"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"pluck"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"))\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"lazy"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Another example with user relationship\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'authorName'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"() => "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"name "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"??"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'Unknown'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"lazy"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"how-it-works-1"},"children":[{"type":"text","value":"How It Works"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When you have a model attribute like this:"}]},{"type":"element","tag":"pre","props":{"code":"class Post extends Model\n{\n public function getProfileTagNamesAttribute(): array\n {\n return $this->tags()->pluck('name')->toArray();\n }\n \n public function tags()\n {\n return $this->belongsToMany(Tag::class);\n }\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Model\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" getProfileTagNamesAttribute"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"tags"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"pluck"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"toArray"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" tags"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"belongsToMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Tag"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can create a field that efficiently loads this data:"}]},{"type":"element","tag":"pre","props":{"code":"field('profileTagNames', fn() => $this->model()->profileTagNames)\n ->lazy('tags')\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'profileTagNames'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"() => "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"profileTagNames)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"lazy"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This ensures that:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"tags"}]},{"type":"text","value":" relationship is loaded before the field value is computed"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Multiple fields using the same relationship won't cause additional queries"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"The computed value can safely access the relationship data"}]}]},{"type":"element","tag":"h3","props":{"id":"lazy-loading-methods"},"children":[{"type":"text","value":"Lazy Loading Methods"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"CanLoadLazyRelationship"}]},{"type":"text","value":" trait provides the following methods:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"lazy(?string $relationshipName = null)"}]},{"type":"text","value":" - Mark the field as lazy and optionally specify the relationship name"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"isLazy(RestifyRequest $request)"}]},{"type":"text","value":" - Check if the field is configured for lazy loading"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"getLazyRelationshipName()"}]},{"type":"text","value":" - Get the name of the relationship to lazy load"}]}]},{"type":"element","tag":"h3","props":{"id":"benefits"},"children":[{"type":"text","value":"Benefits"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Performance"}]},{"type":"text","value":": Prevents N+1 queries when dealing with computed attributes"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Efficiency"}]},{"type":"text","value":": Relationships are loaded only once, even if multiple fields depend on them"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Flexibility"}]},{"type":"text","value":": Works with any relationship type (BelongsTo, HasMany, ManyToMany, etc.)"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Clean Code"}]},{"type":"text","value":": Keeps your field definitions simple while ensuring optimal database usage"}]}]},{"type":"element","tag":"h2","props":{"id":"utility-methods"},"children":[{"type":"text","value":"Utility Methods"}]},{"type":"element","tag":"h3","props":{"id":"repository-management"},"children":[{"type":"text","value":"Repository Management"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Fields can be assigned to repositories programmatically:"}]},{"type":"element","tag":"pre","props":{"code":"$field = Field::new('title');\n$field->setRepository($repository);\n$field->setParentRepository($parentRepository);\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$field "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"setRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($repository);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"setParentRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($parentRepository);\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"These methods are primarily used internally by Restify but can be useful when building custom field logic."}]},{"type":"element","tag":"h3","props":{"id":"legacy-methods"},"children":[{"type":"text","value":"Legacy Methods"}]},{"type":"element","tag":"h4","props":{"id":"deprecated-append-method"},"children":[{"type":"text","value":"Deprecated append() Method"}]},{"type":"element","tag":"alert","props":{"type":"warning"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"append()"}]},{"type":"text","value":" method has been deprecated in favor of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"value()"}]},{"type":"text","value":". Use "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"value()"}]},{"type":"text","value":" instead:"}]},{"type":"element","tag":"pre","props":{"code":"// Deprecated\nfield('user_id')->append(Auth::id());\n\n// Recommended \nfield('user_id')->value(Auth::id());\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Deprecated\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user_id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"append"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Auth"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"id"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"());\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Recommended \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user_id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Auth"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"id"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"());\n"}]}]}]}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"declaration","depth":2,"text":"Declaration","children":[{"id":"field-helper","depth":3,"text":"field helper"},{"id":"computed-field","depth":3,"text":"Computed field"},{"id":"readonly-field","depth":3,"text":"Readonly field"},{"id":"virtual-field","depth":3,"text":"Virtual field"}]},{"id":"authorization","depth":2,"text":"Authorization","children":[{"id":"can-see","depth":3,"text":"Can see"},{"id":"can-store","depth":3,"text":"Can store"},{"id":"can-update","depth":3,"text":"Can update"},{"id":"can-patch","depth":3,"text":"Can patch"},{"id":"can-update-bulk","depth":3,"text":"Can update bulk"}]},{"id":"bulk-operations","depth":2,"text":"Bulk Operations","children":[{"id":"bulk-visibility-control","depth":3,"text":"Bulk Visibility Control"},{"id":"bulk-authorization","depth":3,"text":"Bulk Authorization"}]},{"id":"field-type-detection","depth":2,"text":"Field Type Detection","children":[{"id":"automatic-type-detection","depth":3,"text":"Automatic Type Detection"},{"id":"detection-strategies","depth":3,"text":"Detection Strategies"},{"id":"computed-field-detection","depth":3,"text":"Computed Field Detection"}]},{"id":"sorting","depth":2,"text":"Sorting","children":[{"id":"making-fields-sortable","depth":3,"text":"Making Fields Sortable"},{"id":"sortable-column-configuration","depth":3,"text":"Sortable Column Configuration"},{"id":"disabling-sorting","depth":3,"text":"Disabling Sorting"},{"id":"conditional-sorting","depth":3,"text":"Conditional Sorting"},{"id":"using-sortable-fields","depth":3,"text":"Using Sortable Fields"}]},{"id":"matching","depth":2,"text":"Matching","children":[{"id":"making-fields-matchable","depth":3,"text":"Making Fields Matchable"},{"id":"using-matchable-fields","depth":3,"text":"Using Matchable Fields"},{"id":"match-types-reference","depth":3,"text":"Match Types Reference"},{"id":"advanced-matchable-configuration","depth":3,"text":"Advanced Matchable Configuration"}]},{"id":"searchable","depth":2,"text":"Searchable","children":[{"id":"making-fields-searchable","depth":3,"text":"Making Fields Searchable"},{"id":"unified-method-signatures","depth":3,"text":"Unified Method Signatures"},{"id":"using-searchable-fields","depth":3,"text":"Using Searchable Fields"},{"id":"advanced-searchable-configuration","depth":3,"text":"Advanced Searchable Configuration"}]},{"id":"validation","depth":2,"text":"Validation","children":[{"id":"attaching-rules","depth":3,"text":"Attaching rules"},{"id":"storing-rules","depth":3,"text":"Storing Rules"},{"id":"updating-rules","depth":3,"text":"Updating Rules"},{"id":"bulk-rules","depth":3,"text":"Bulk Rules"},{"id":"store-rules-alias","depth":3,"text":"Store Rules Alias"}]},{"id":"interceptors","depth":2,"text":"Interceptors","children":[{"id":"fill-callback","depth":3,"text":"Fill callback"},{"id":"store-callback","depth":3,"text":"Store callback"},{"id":"update-callback","depth":3,"text":"Update callback"},{"id":"store-bulk-callback","depth":3,"text":"Store bulk callback"},{"id":"index-callback","depth":3,"text":"Index Callback"},{"id":"show-callback","depth":3,"text":"Show callback"},{"id":"resolve-callback","depth":3,"text":"Resolve callback"},{"id":"fields-actionable","depth":3,"text":"Fields actionable"}]},{"id":"fallbacks","depth":2,"text":"Fallbacks","children":[{"id":"default-stored-value","depth":3,"text":"Default Stored Value"},{"id":"default-displayed-value","depth":3,"text":"Default Displayed Value"},{"id":"default-stored-value-1","depth":3,"text":"Default Stored Value"}]},{"id":"customizations","depth":2,"text":"Customizations","children":[{"id":"field-label","depth":3,"text":"Field label"},{"id":"hidden-field","depth":3,"text":"Hidden field"},{"id":"mcp-visibility-control","depth":3,"text":"MCP Visibility Control"},{"id":"field-descriptions","depth":3,"text":"Field Descriptions"},{"id":"custom-tool-schema","depth":3,"text":"Custom Tool Schema"}]},{"id":"hooks","depth":2,"text":"Hooks","children":[{"id":"after-store","depth":3,"text":"After store"},{"id":"after-update","depth":3,"text":"After update"}]},{"id":"file-fields","depth":2,"text":"File fields","children":[{"id":"defining-the-field","depth":3,"text":"Defining the field"},{"id":"how-files-are-stored","depth":3,"text":"How Files Are Stored"},{"id":"url-input-support","depth":3,"text":"URL Input Support"},{"id":"image","depth":3,"text":"Image"},{"id":"storing-metadata","depth":3,"text":"Storing Metadata"},{"id":"pruning-deletion","depth":3,"text":"Pruning & Deletion"},{"id":"customizing-file-storage","depth":3,"text":"Customizing File Storage"},{"id":"customizing-file-display","depth":3,"text":"Customizing File Display"},{"id":"command","depth":3,"text":"Command"}]},{"id":"lazy-loading","depth":2,"text":"Lazy Loading","children":[{"id":"making-fields-lazy","depth":3,"text":"Making Fields Lazy"},{"id":"how-it-works-1","depth":3,"text":"How It Works"},{"id":"lazy-loading-methods","depth":3,"text":"Lazy Loading Methods"},{"id":"benefits","depth":3,"text":"Benefits"}]},{"id":"utility-methods","depth":2,"text":"Utility Methods","children":[{"id":"repository-management","depth":3,"text":"Repository Management"},{"id":"legacy-methods","depth":3,"text":"Legacy Methods"}]}]}},"_type":"markdown","_id":"content:api:fields.md","_source":"content","_file":"api/fields.md","_stem":"api/fields","_extension":"md"},"hash":"31Edm3pxdc"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/api/getters.md b/docs-v3/.nuxt/content-cache/parsed/content/api/getters.md new file mode 100644 index 000000000..a46f08c98 --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/api/getters.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/api/getters","_dir":"api","_draft":false,"_partial":false,"_locale":"","title":"Getters","description":"","menuTitle":"Getters","category":"API","position":10,"body":{"type":"root","children":[{"type":"element","tag":"h2","props":{"id":"motivation"},"children":[{"type":"text","value":"Motivation"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify provides powerful filters and gets routes with relationships. However, sometimes you might want to get some extra data for your repositories."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's say you have a stripe user. This is how you retrieve the stripe user information through a get request:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"Route::get('users/stripe-information', UserStripeController::class);\n\n// UserStripeController.php\n\npublic function __invoke(Request $request)\n{\n ...\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Route"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users/stripe-information'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"UserStripeController"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// UserStripeController.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" __invoke"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"classic"}]},{"type":"text","value":" approach is good, although it has a few limitations. First, you have to take care of the route "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"middleware"}]},{"type":"text","value":" manually, as the testability for these endpoints should be done separately, which might be hard to maintain. At last, the endpoint is disconnected from the repository, which makes it feel out of context so has a bad readability."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"That way, code readability, testability, and maintainability can become hard."}]},{"type":"element","tag":"h2","props":{"id":"invokable-getter-format"},"children":[{"type":"text","value":"Invokable Getter Format"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The simplest way to define a getter is to use the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"invokable"}]},{"type":"text","value":" class format."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Here's an example:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"namespace App\\Restify\\Getters;\n\nclass StripeInformationGetter\n{\n public function __invoke()\n {\n return response()->json([\n 'foo' => 'bar',\n ]);\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"namespace"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" App\\Restify\\Getters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" StripeInformationGetter\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" __invoke"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" response"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"json"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"([\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'foo'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'bar'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Then add the getter instance to the repository "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"getters"}]},{"type":"text","value":" method:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"...\npublic function getters(RestifyRequest $request): array\n{\n return [\n new StripeInformationGetter,\n ];\n}\n...\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" getters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" StripeInformationGetter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"...\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Bellow we will see how to define getters in a more advanced way."}]},{"type":"element","tag":"h2","props":{"id":"getter-definition"},"children":[{"type":"text","value":"Getter definition"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Getters are very similar to actions in this sense. The big difference is that getters only allow GET requests, and should not perform any kind of DB data writing:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The getter is nothing more than a class that extends the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Binaryk\\LaravelRestify\\Getters\\Getter"}]},{"type":"text","value":" abstract class."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"An example of a getter class:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"namespace App\\Restify\\Getters;\n\nuse Binaryk\\LaravelRestify\\Getters\\Getter;\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\Request;use Illuminate\\Support\\Collection;\n\nclass StripeInformationGetter extends Getter\n{\n public static $uriKey = 'stripe-information';\n \n public function handle(Request $request): JsonResponse\n {\n return response()->json([\n 'data' => $request->user()->asStripeUser()\n ]);\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"namespace"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" App\\Restify\\Getters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Getters\\Getter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Http\\JsonResponse"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Http\\Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Support\\Collection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" StripeInformationGetter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Getter\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $uriKey "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'stripe-information'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" handle"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" JsonResponse\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" response"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"json"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"([\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'data'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"asStripeUser"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"register-getter"},"children":[{"type":"text","value":"Register getter"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Then add the getter instance to the repository "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"getters"}]},{"type":"text","value":" method:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// UserRepository.php\n\npublic function getters(RestifyRequest $request): array\n{\n return [\n StripeInformationGetter::new()\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// UserRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" getters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" StripeInformationGetter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"authorize-getter"},"children":[{"type":"text","value":"Authorize getter"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can authorize certain getters to be active for specific users:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function getters(RestifyRequest $request): array\n{\n return [\n StripeInformationGetter::new()->canSee(function (Request $request) {\n return $request->user()->can('seeStripeInfo'),\n }),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" getters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" StripeInformationGetter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"canSee"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"can"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'seeStripeInfo'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"call-getters"},"children":[{"type":"text","value":"Call getters"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To call a getter, you simply access:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: api/restify/posts/getters/stripe-information\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: api/restify/posts/getters/stripe-information\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"getter"}]},{"type":"text","value":" query param value is the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ke-bab"}]},{"type":"text","value":" form of the filter class name by default, or a custom "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$uriKey"}]},{"type":"text","value":" "},{"type":"element","tag":"a","props":{"href":"#custom-uri-key"},"children":[{"type":"text","value":"defined in the getter"}]}]},{"type":"element","tag":"h3","props":{"id":"handle-getter"},"children":[{"type":"text","value":"Handle getter"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As soon the getter is called, the handled method will be invoked with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$request"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function handle(Request $request)\n{\n //\n\n return ok();\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" handle"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" ok"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"getter-customizations"},"children":[{"type":"text","value":"Getter customizations"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Getters could be easily customized."}]},{"type":"element","tag":"h3","props":{"id":"custom-keys"},"children":[{"type":"text","value":"Custom keys"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Since your class names could change along the way, you can define a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$uriKey"}]},{"type":"text","value":" property to your getters, so the frontend will use always the same "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"getter"}]},{"type":"text","value":" query when applying a getter:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class StripeInformationGetter extends Getter\n{\n public static $uriKey = 'stripe-information';\n //...\n\n};\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" StripeInformationGetter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Getter\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $uriKey "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'stripe-information'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"};\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"getters-scope"},"children":[{"type":"text","value":"Getters scope"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By default, any getter could be used on "},{"type":"element","tag":"a","props":{"href":"#index-getters"},"children":[{"type":"text","value":"index"}]},{"type":"text","value":" as well as on "},{"type":"element","tag":"a","props":{"href":"#show-getters"},"children":[{"type":"text","value":"show"}]},{"type":"text","value":". However, you can choose to instruct your getter to be displayed to a specific scope."}]},{"type":"element","tag":"h2","props":{"id":"show-getters"},"children":[{"type":"text","value":"Show getters"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Show getters are used when you have to apply them for a single item."}]},{"type":"element","tag":"h3","props":{"id":"show-getter-definition"},"children":[{"type":"text","value":"Show getter definition"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The show getter definition differs in how it receives arguments for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"handle"}]},{"type":"text","value":" method."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify automatically resolves Eloquent models defined in the route id and passes them to the getter's handle method:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function handle(Request $request, User $user): JsonResponse\n{\n\n}\n\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" handle"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" JsonResponse\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"show-getter-registration"},"children":[{"type":"text","value":"Show getter registration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To register a show getter, we have to use the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"->onlyOnShow()"}]},{"type":"text","value":" accessor:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function getters(RestifyRequest $request)\n{\n return [\n StripeInformationGetter::new()->onlyOnShow(),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" getters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" StripeInformationGetter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"onlyOnShow"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"show-getter-call"},"children":[{"type":"text","value":"Show getter call"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The post URL should include the key of the model we want Restify to resolve:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: api/restfiy/users/1/getters/stripe-information\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: api/restfiy/users/1/getters/stripe-information\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"list-show-getters"},"children":[{"type":"text","value":"List show getters"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To get the list of available getters only for a specific model key:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: api/api/restify/posts/1/getters\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: api/api/restify/posts/1/getters\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"index-getters"},"children":[{"type":"text","value":"Index getters"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Index getters are used when you have to apply them for many items."}]},{"type":"element","tag":"h3","props":{"id":"index-getter-definition"},"children":[{"type":"text","value":"Index getter definition"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The index getter definition differs in how it receives arguments for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"handle"}]},{"type":"text","value":" method."}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function handle(Request $request): JsonResponse\n{\n //\n}\n\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" handle"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" JsonResponse\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"index-getter-registration"},"children":[{"type":"text","value":"Index getter registration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To register an index getter, we have to use the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"->onlyOnIndex()"}]},{"type":"text","value":" accessor:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function getters(RestifyRequest $request)\n{\n return [\n StripeInformationGetter::new()->onlyOnIndex(),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" getters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" StripeInformationGetter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"onlyOnIndex"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"index-getter-call"},"children":[{"type":"text","value":"Index getter call"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The post URL:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: api/restfiy/posts/getters/stripe-information\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: api/restfiy/posts/getters/stripe-information\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"list-index-getters"},"children":[{"type":"text","value":"List index getters"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To get the list of available getters:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: api/api/restify/posts/getters\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: api/api/restify/posts/getters\n"}]}]}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"motivation","depth":2,"text":"Motivation"},{"id":"invokable-getter-format","depth":2,"text":"Invokable Getter Format"},{"id":"getter-definition","depth":2,"text":"Getter definition","children":[{"id":"register-getter","depth":3,"text":"Register getter"},{"id":"authorize-getter","depth":3,"text":"Authorize getter"},{"id":"call-getters","depth":3,"text":"Call getters"},{"id":"handle-getter","depth":3,"text":"Handle getter"}]},{"id":"getter-customizations","depth":2,"text":"Getter customizations","children":[{"id":"custom-keys","depth":3,"text":"Custom keys"}]},{"id":"getters-scope","depth":2,"text":"Getters scope"},{"id":"show-getters","depth":2,"text":"Show getters","children":[{"id":"show-getter-definition","depth":3,"text":"Show getter definition"},{"id":"show-getter-registration","depth":3,"text":"Show getter registration"},{"id":"show-getter-call","depth":3,"text":"Show getter call"},{"id":"list-show-getters","depth":3,"text":"List show getters"}]},{"id":"index-getters","depth":2,"text":"Index getters","children":[{"id":"index-getter-definition","depth":3,"text":"Index getter definition"},{"id":"index-getter-registration","depth":3,"text":"Index getter registration"},{"id":"index-getter-call","depth":3,"text":"Index getter call"},{"id":"list-index-getters","depth":3,"text":"List index getters"}]}]}},"_type":"markdown","_id":"content:api:getters.md","_source":"content","_file":"api/getters.md","_stem":"api/getters","_extension":"md"},"hash":"PsIHwgDI95"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/api/relations.md b/docs-v3/.nuxt/content-cache/parsed/content/api/relations.md new file mode 100644 index 000000000..6de3a7ee0 --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/api/relations.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/api/relations","_dir":"api","_draft":false,"_partial":false,"_locale":"","title":"Relations","description":"","menuTitle":"Relations","category":"API","position":10,"body":{"type":"root","children":[{"type":"element","tag":"h2","props":{"id":"introduction"},"children":[{"type":"text","value":"Introduction"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Eloquent provides a large variety of relationships. You can read about them "},{"type":"element","tag":"a","props":{"href":"https://laravel.com/docs/eloquent-relationships","rel":["nofollow"]},"children":[{"type":"text","value":"here"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify handles all relationships and gives you an expressive way to list resource relationships."}]},{"type":"element","tag":"h2","props":{"id":"definition"},"children":[{"type":"text","value":"Definition"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The list of relationships should be defined into a repository method called "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"related"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public static function related(): array\n{\n return [];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" related"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"eager-fields"},"children":[{"type":"text","value":"Eager fields"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"related"}]},{"type":"text","value":" method will return an array that should be a key-value pair, where the key is the related name that the API will request, and the value could be an instance of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Binaryk\\LaravelRestify\\Fields\\EagerField"}]},{"type":"text","value":" or a relationship name defined in your model."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Each "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"EagerField"}]},{"type":"text","value":" declaration is similar to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Field"}]},{"type":"text","value":" one. The first argument is the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"model"}]},{"type":"text","value":" relationship name. The second argument is a repository that represents the related entity."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's say we have a User that has a list of posts. We will define it this way:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"HasMany::make('posts', PostRepository::class),\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"HasMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"or:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"HasMany::make('posts'),\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"HasMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]}]}]},{"type":"element","tag":"alert","props":{"type":"info"},"children":[{"type":"text","value":"\nRestify 7+ will guess the serialization repository using the key, so you don't necessarily have to specify it:\n"}]},{"type":"element","tag":"h3","props":{"id":"related-declaration"},"children":[{"type":"text","value":"Related Declaration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's see how can we inform a repository about its relationships:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// CompanyRepository\npublic static function related(): array\n{\n return [\n 'usersRelationship' => HasMany::make('users', UserRepository::class),\n \n HasMany::make('posts'),\n \n 'extraData' => fn() => ['location' => 'Romania'],\n \n 'extraMeta' => new Invokable(),\n \n 'country',\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// CompanyRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" related"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'usersRelationship'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" HasMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" HasMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'extraData'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"() => ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'location'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'Romania'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"],\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'extraMeta'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Invokable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'country'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Above we can see a few types of relationships declarations that Restify provides. Let's explain them."}]},{"type":"element","tag":"h4","props":{"id":"long-definition"},"children":[{"type":"text","value":"Long definition"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"'usersRelationship' => HasMany::make('users', UserRepository::class),\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'usersRelationship'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" HasMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This means that there is a relationship of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"hasMany"}]},{"type":"text","value":" type declared in the Company model. The Eloquent relationship name is "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"users"}]},{"type":"text","value":" (see the first argument of the HasMany field):"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// app/Models/Company.php\npublic function users(): \\Illuminate\\Database\\Eloquent\\Relations\\HasMany\n{\n return $this->hasMany(User::class);\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// app/Models/Company.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" users"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\Illuminate\\Database\\Eloquent\\Relations\\HasMany\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"hasMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The key "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"usersRelationship"}]},{"type":"text","value":" represents the query param the API exposes to load the list of users:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: api/companies?related=usersRelationship\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: api/companies?related=usersRelationship\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"UserRepository"}]},{"type":"text","value":" represents the repository class that serializes the users list."}]},{"type":"element","tag":"h4","props":{"id":"short-definition"},"children":[{"type":"text","value":"Short definition"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"HasMany::make('posts'),\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"HasMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Usually the key (query param) and the actual Eloquent relationship names are the same, so Restify provides a shorter version of defining the relationship."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In this case the name of the query param will be the same as the relationship name - "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"posts"}]},{"type":"text","value":". The name of the repository "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PostRepository"}]},{"type":"text","value":" will be resolved based on the same key and $uriKey of the repository."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The request will look like this:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: api/companies?related=posts\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: api/companies?related=posts\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"callables"},"children":[{"type":"text","value":"Callables"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"'extraData' => fn() => ['location' => 'Romania'],\n\n'extraMeta' => new Invokable()\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'extraData'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"() => ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'location'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'Romania'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"],\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'extraMeta'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Invokable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify allows you to resolve specific data using callable functions or invokable (classes with a single public __invoke method). You can return any kind of data from these callables. It'll be serialized accordingly. The query param in this case should match the key:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: api/companies?related=extraData,extraMeta\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: api/companies?related=extraData,extraMeta\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"forwarding"},"children":[{"type":"text","value":"Forwarding"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"'country',\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'country'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you simply define a key in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"related"}]},{"type":"text","value":", Restify will forward your request to the associated model. Your model could return anything, as it might be an Eloquent relationship or any primary data."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's take a look over all the relationships that Restify provides:"}]},{"type":"element","tag":"h3","props":{"id":"frontend-request"},"children":[{"type":"text","value":"Frontend request"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In order to get the related resources, you need to send a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"GET"}]},{"type":"text","value":" request to:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET `/api/restify/users?include=posts`\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET `/api/restify/users?include=posts`\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Sometimes, you might want to load specific columns from the database into the response. For example, if you have a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Post"}]},{"type":"text","value":" model with an "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"id"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"title"}]},{"type":"text","value":", and a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"description"}]},{"type":"text","value":" column, you might want to load only the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"title"}]},{"type":"text","value":" and the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"description"}]},{"type":"text","value":" column in the response."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In order to do this, you can use the following request:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET /users/1?include=posts[title|description]\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET /users/1?include=posts[title|description]\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"nested-relationships"},"children":[{"type":"text","value":"Nested relationships"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's assume you have the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"CompanyRepository"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// CompanyRepository\npublic static function related(): array\n{\n return [\n HasMany::make('users'),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// CompanyRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" related"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" HasMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the UserRepository you have a relationship to a list of user posts and roles:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// UserRepository\npublic static function related(): array\n{\n return [\n HasMany::make('posts'),\n MorphToMany::make('roles'),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// UserRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" related"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" HasMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" MorphToMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'roles'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PostRepository"}]},{"type":"text","value":" you might have a list of comments for each post:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository\npublic static function related(): array\n{\n return [\n HasMany::make('comments'),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" related"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" HasMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'comments'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In order to get the company's users with their posts and roles, you can follow the "},{"type":"element","tag":"a","props":{"href":"https://laravel.com/docs/master/eloquent-relationships#nested-eager-loading","rel":["nofollow"]},"children":[{"type":"text","value":"laravel syntax for eager loading"}]},{"type":"text","value":" into the request query:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/companies?include=users.posts,users.roles\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/companies?include=users.posts,users.roles\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This request will return a list like this:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"data\": {\n \"id\": \"91c2bdd0-bf6f-4717-b1c4-a6131843ba56\",\n \"type\": \"companies\",\n \"attributes\": {\n \"name\": \"Binar Code\"\n },\n \"relationships\": {\n \"users\": [{\n \"id\": \"3\",\n \"type\": \"users\",\n \"attributes\": {\n \"name\": \"Eduard\"\n },\n \"relationships\": {\n \"posts\": [{\n \"id\": \"1\",\n \"type\": \"posts\",\n \"attributes\": {\n \"title\": \"Post title\"\n }\n }],\n \"roles\": [{\n \"id\": \"1\",\n \"type\": \"roles\",\n \"attributes\": {\n \"name\": \"admin\"\n }\n }]\n }\n }]\n }\n }\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"data\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"91c2bdd0-bf6f-4717-b1c4-a6131843ba56\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"companies\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Binar Code\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"relationships\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"users\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": [{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"3\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"users\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Eduard\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"relationships\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"posts\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": [{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"1\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"posts\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"title\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Post title\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }],\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"roles\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": [{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"1\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"roles\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"admin\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can also specify and load the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"comments"}]},{"type":"text","value":" of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"posts"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/companies?include=users.posts.comments,users.roles\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/companies?include=users.posts.comments,users.roles\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Or specify the exact columns that you want to load for each nested layer:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/companies?include=users[name].posts[id|title].comments[comment],users.roles[name]\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/companies?include=users[name].posts[id|title].comments[comment],users.roles[name]\n"}]}]}]}]},{"type":"element","tag":"alert","props":{"type":"info"},"children":[{"type":"text","value":"\nGetting specific columns will make your requests more performant.\n"}]},{"type":"element","tag":"h3","props":{"id":"meta-information"},"children":[{"type":"text","value":"Meta information"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Starting with Restify 7+, meta information for related (in index requests) will not be displayed. For more details read the "},{"type":"element","tag":"a","props":{"href":"/api/repositories#index-item-meta"},"children":[{"type":"text","value":"repository meta"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h2","props":{"id":"belongsto-morphone"},"children":[{"type":"text","value":"BelongsTo & MorphOne"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BelongsTo"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"MorphOne"}]},{"type":"text","value":" eager fields work in a similar way, so let's take the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BelongsTo"}]},{"type":"text","value":" as an example."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's assume each "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Post"}]},{"type":"text","value":" "},{"type":"element","tag":"a","props":{"href":"https://laravel.com/docs/eloquent-relationships#one-to-many-inverse","rel":["nofollow"]},"children":[{"type":"text","value":"belongsTo"}]},{"type":"text","value":" a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"User"}]},{"type":"text","value":". To return the post's owner, we will define it like this:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository\npublic static function related(): array\n{\n return [\n 'owner' => \\Binaryk\\LaravelRestify\\Fields\\BelongsTo::make('user', UserRepository::class),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" related"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'owner'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\Binaryk\\LaravelRestify\\Fields\\BelongsTo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The model should define the relationship "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"user"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// Post.php\n\npublic function user()\n{\n return $this->belongsTo(User::class);\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Post.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"belongsTo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now the frontend can list a post or posts including the following relationship:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: api/restify/posts/1?include=owner\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: api/restify/posts/1?include=owner\n"}]}]}]}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"data\": {\n \"id\": \"91c2bdd0-bf6f-4717-b1c4-a6131843ba56\",\n \"type\": \"posts\",\n \"attributes\": {\n \"title\": \"Culpa qui accusamus eaque sint.\",\n \"description\": \"Id illo et quidem nobis reiciendis molestiae.\"\n },\n \"relationships\": {\n \"owner\": {\n \"id\": \"3\",\n \"type\": \"users\",\n \"attributes\": {\n \"name\": \"Laborum vel esse dolorem amet consequatur.\",\n \"email\": \"jacobi.ferne@gmail.com\"\n },\n \"meta\": {\n \"authorizedToShow\": true,\n \"authorizedToStore\": true,\n \"authorizedToUpdate\": false,\n \"authorizedToDelete\": false\n }\n }\n },\n \"meta\": {\n \"authorizedToShow\": true,\n \"authorizedToStore\": true,\n \"authorizedToUpdate\": true,\n \"authorizedToDelete\": true\n }\n }\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"data\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"91c2bdd0-bf6f-4717-b1c4-a6131843ba56\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"posts\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"title\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Culpa qui accusamus eaque sint.\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"description\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Id illo et quidem nobis reiciendis molestiae.\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"relationships\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"owner\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"3\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"users\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Laborum vel esse dolorem amet consequatur.\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"email\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"jacobi.ferne@gmail.com\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToShow\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToStore\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToUpdate\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToDelete\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToShow\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToStore\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToUpdate\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToDelete\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"searchable-belongs-to"},"children":[{"type":"text","value":"Searchable belongs to"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BelongsTo"}]},{"type":"text","value":" field allows you to use the search endpoint to "},{"type":"element","tag":"a","props":{"href":"/search/basic-filters#repository-search"},"children":[{"type":"text","value":"search over a column"}]},{"type":"text","value":" from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"belongsTo"}]},{"type":"text","value":" relationship by simply using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"searchables"}]},{"type":"text","value":" call:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"BelongsTo::make('user')->searchable('name', 'email')\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"BelongsTo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"searchable"}]},{"type":"text","value":" method accepts multiple database attributes from the related entity ("},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"users"}]},{"type":"text","value":" in our case)."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Therefore, if we get the following search request, it'll also search into the related user's name and email:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: api/restify/companies?related=user&search=\"John\"\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: api/restify/companies?related=user&search=\"John\"\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can check if a relation is searchable using:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"$field = BelongsTo::make('user')->searchable('name');\n$isSearchable = $field->isSearchable(); // true\n$attributes = $field->getSearchables(); // ['name']\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$field "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" BelongsTo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$isSearchable "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isSearchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// true\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$attributes "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"getSearchables"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// ['name']\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"custom-search-callbacks"},"children":[{"type":"text","value":"Custom Search Callbacks"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For advanced search scenarios, you can provide a custom callback to completely control the search behavior:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"BelongsTo::make('user')->searchable(function ($query, $request, $value, $field, $repository) {\n return $query->whereHas('user', function ($q) use ($value) {\n $q->where('name', 'ilike', \"%{$value}%\")\n ->orWhere('email', 'ilike', \"%{$value}%\")\n ->orWhere('phone', 'like', \"%{$value}%\");\n });\n})\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"BelongsTo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($query, $request, $value, $field, $repository) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"whereHas"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($q) "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($value) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $q"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'ilike'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"%{"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}%\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"orWhere"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'ilike'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"%{"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}%\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"orWhere"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'phone'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'like'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"%{"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}%\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"})\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The callback receives the following parameters:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$query"}]},{"type":"text","value":" - The main query builder instance"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$request"}]},{"type":"text","value":" - The current RestifyRequest instance"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$value"}]},{"type":"text","value":" - The search value from the request"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$field"}]},{"type":"text","value":" - The BelongsTo field instance"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$repository"}]},{"type":"text","value":" - The current repository instance"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This approach provides maximum flexibility for complex search requirements while maintaining the same API interface."}]},{"type":"element","tag":"h2","props":{"id":"hasone"},"children":[{"type":"text","value":"HasOne"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"HasOne"}]},{"type":"text","value":" field corresponds to a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"hasOne"}]},{"type":"text","value":" Eloquent relationship."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For example, let's assume a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"User"}]},{"type":"text","value":" model "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"hasOne"}]},{"type":"text","value":" "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Phone"}]},{"type":"text","value":" model. We may add the relationship to our "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"UserRepository"}]},{"type":"text","value":" like so:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// UserRepository\npublic static function related(): array\n{\n return [\n \\Binaryk\\LaravelRestify\\Fields\\HasOne::make('phone', PhoneRepository::class),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// UserRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" related"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\Binaryk\\LaravelRestify\\Fields\\HasOne"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'phone'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"PhoneRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"sortable-hasone-relations"},"children":[{"type":"text","value":"Sortable HasOne Relations"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"HasOne"}]},{"type":"text","value":" relations can be made sortable:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"HasOne::make('phone')->sortable('number')\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"HasOne"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'phone'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"sortable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'number'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This allows sorting by the related model's attributes:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: api/restify/users?sort=phone.number\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: api/restify/users?sort=phone.number\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The json response structure will be the same as previously:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"data\": {\n \"id\": \"1\",\n \"type\": \"users\",\n \"attributes\": {\n \"name\": \"Et maxime voluptatem cumque accusamus sit.\"\n },\n \"relationships\": {\n \"phone\": {\n \"id\": \"2\",\n \"type\": \"phones\",\n \"attributes\": {\n \"phone\": \"+40 766 444 22\"\n },\n \"meta\": {\n \"authorizedToShow\": false,\n \"authorizedToStore\": true,\n \"authorizedToUpdate\": false,\n \"authorizedToDelete\": false\n }\n },\n ...\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"data\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"1\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"users\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Et maxime voluptatem cumque accusamus sit.\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"relationships\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"phone\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"2\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"phones\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"phone\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"+40 766 444 22\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToShow\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToStore\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToUpdate\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToDelete\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic"},"children":[{"type":"text","value":" ...\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"hasmany-morphmany"},"children":[{"type":"text","value":"HasMany & MorphMany"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"HasMany"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"MorphMany"}]},{"type":"text","value":" fields correspond to a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"hasMany"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"morphMany"}]},{"type":"text","value":" Eloquent relationship. For example, let's assume a User\nmodel "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"hasMany"}]},{"type":"text","value":" "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Post"}]},{"type":"text","value":" models. We may add the relationship to our "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"UserRepository"}]},{"type":"text","value":" as shown:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// UserRepository\npublic static function related(): array\n{\n return [\n \\Binaryk\\LaravelRestify\\Fields\\HasMany::make('posts', PostRepository::class),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// UserRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" related"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\Binaryk\\LaravelRestify\\Fields\\HasMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In addition, you will get back the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"posts"}]},{"type":"text","value":" relationship:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"data\": {\n \"id\": \"1\",\n \"type\": \"users\",\n \"attributes\": {\n \"name\": \"Et maxime voluptatem cumque accusamus sit.\"\n },\n \"relationships\": {\n \"posts\": [\n {\n \"id\": \"91c2bdd0-ccf6-49ec-9ae9-8bae1d39c100\",\n \"type\": \"posts\",\n \"attributes\": {\n \"title\": \"Rem suscipit tempora ullam accusantium in rerum.\",\n \"description\": \"Vero nostrum quasi velit molestiae animi neque.\"\n },\n \"meta\": {\n \"authorizedToShow\": true,\n \"authorizedToStore\": true,\n \"authorizedToUpdate\": true,\n \"authorizedToDelete\": true\n }\n }\n ]\n },\n \"meta\": {\n \"authorizedToShow\": true,\n \"authorizedToStore\": true,\n \"authorizedToUpdate\": false,\n \"authorizedToDelete\": false\n }\n }\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"data\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"1\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"users\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Et maxime voluptatem cumque accusamus sit.\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"relationships\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"posts\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"91c2bdd0-ccf6-49ec-9ae9-8bae1d39c100\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"posts\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"title\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Rem suscipit tempora ullam accusantium in rerum.\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"description\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Vero nostrum quasi velit molestiae animi neque.\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToShow\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToStore\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToUpdate\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToDelete\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToShow\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToStore\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToUpdate\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToDelete\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"paginate"},"children":[{"type":"text","value":"Paginate"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"HasMany"}]},{"type":"text","value":" field returns 15 entries in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"relationships"}]},{"type":"text","value":". This could be customizable from the repository (the\nrepository being in this case the class of the related resource) class by using:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public static int $defaultRelatablePerPage = 100;\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" int"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $defaultRelatablePerPage "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" 100"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"relatable-per-page"},"children":[{"type":"text","value":"Relatable per page"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can also use the query "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"?relatablePerPage=100"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: api/restify/users?related=posts&relatablePerPage=100\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: api/restify/users?related=posts&relatablePerPage=100\n"}]}]}]}]},{"type":"element","tag":"alert","props":{"type":"warning"},"children":[{"type":"text","value":" \n"},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When using "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"relatablePerPage"}]},{"type":"text","value":" query param, it will paginate all the relatable entities with that size."}]}]},{"type":"element","tag":"h2","props":{"id":"belongstomany-morphtomany"},"children":[{"type":"text","value":"BelongsToMany & MorphToMany"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BelongsToMany"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"MorphToMany"}]},{"type":"text","value":" field corresponds to a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"belongsToMany"}]},{"type":"text","value":" or "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"morphToMany"}]},{"type":"text","value":" Eloquent relationship. For example, let's assume a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"User"}]},{"type":"text","value":"\nmodel "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"belongsToMany"}]},{"type":"text","value":" Role models. We may add the relationship to our UserRepository like this:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// CompanyRepository\npublic static function related(): array\n{\n return [\n \\Binaryk\\LaravelRestify\\Fields\\BelongsToMany::make('users', UserRepository::class),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// CompanyRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" related"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\Binaryk\\LaravelRestify\\Fields\\BelongsToMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"pivot-fields"},"children":[{"type":"text","value":"Pivot fields"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"belongsToMany"}]},{"type":"text","value":" relationship interacts with additional \"pivot\" attributes that are stored on the intermediate\ntable of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"many-to-many"}]},{"type":"text","value":" relationship, you may also attach those to your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BelongsToMany"}]},{"type":"text","value":" Restify Field. Once these\nfields are attached to the relationship field and the relationship has been defined on both sides, they will be\ndisplayed on the request."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For example, let's assume our "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"User"}]},{"type":"text","value":" model "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"belongsToMany"}]},{"type":"text","value":" Role models. On our "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"user_role"}]},{"type":"text","value":" intermediate table, let's\nimagine we have a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"policy"}]},{"type":"text","value":" field that contains a simple text about the relationship. We can attach this pivot field\nto the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BelongsToMany"}]},{"type":"text","value":" field by using the fields method:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"BelongsToMany::make('users', RoleRepository::class)->withPivot(\n field('is_admin')\n),\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"BelongsToMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RoleRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"withPivot"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'is_admin'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You might also need to define this in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"User"}]},{"type":"text","value":" model:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function users()\n{\n return $this->belongsToMany(User::class, 'user_company')->withPivot('is_admin');\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" users"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"belongsToMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user_company'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"withPivot"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'is_admin'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now, let's try to get the list of companies with users:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/company/1?include=users\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/company/1?include=users\n"}]}]}]}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"data\": {\n \"id\": \"1\",\n \"type\": \"companies\",\n \"attributes\": {\n \"name\": \"ut\"\n },\n \"relationships\": {\n \"users\": [\n {\n \"id\": \"1\",\n \"type\": \"users\",\n \"attributes\": {\n \"name\": \"Linnea Rowe Sr.\",\n \"email\": \"tledner@example.com\",\n },\n \"meta\": {\n \"authorizedToShow\": true,\n \"authorizedToStore\": true,\n \"authorizedToUpdate\": true,\n \"authorizedToDelete\": true\n },\n \"pivots\": {\n \"is_admin\": true\n }\n }\n ]\n },\n \"meta\": {\n \"authorizedToShow\": true,\n \"authorizedToStore\": true,\n \"authorizedToUpdate\": true,\n \"authorizedToDelete\": true\n }\n }\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"data\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"1\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"companies\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"ut\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"relationships\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"users\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"1\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"users\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Linnea Rowe Sr.\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"email\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"tledner@example.com\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToShow\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToStore\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToUpdate\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToDelete\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"pivots\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"is_admin\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToShow\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToStore\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToUpdate\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToDelete\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":35},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":36},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"attach-related"},"children":[{"type":"text","value":"Attach related"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Once you have defined the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BelongsToMany"}]},{"type":"text","value":" field, you can now attach User to a Company just like this:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"POST: api/restify/companies/1/attach/users\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"POST: api/restify/companies/1/attach/users\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Payload:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"users\": [1, 2],\n \"is_admin\": true\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"users\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"2"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"],\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"is_admin\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"authorize-attach"},"children":[{"type":"text","value":"Authorize attach"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You have a few options to authorize the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"attach"}]},{"type":"text","value":" endpoint."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"First, you can define the policy method "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"attachUsers"}]},{"type":"text","value":". The name should start with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"attach"}]},{"type":"text","value":" and suffix with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"CamelCase"}]},{"type":"text","value":" name of the model's relationship name:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// CompanyPolicy.php\n\npublic function attachUsers(User $authenticatedUser, Company $company, User $userToBeAttached): bool\n{ \n return $authenticatedUser->isAdmin();\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// CompanyPolicy.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" attachUsers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $authenticatedUser, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Company"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $company, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $userToBeAttached)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{ \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $authenticatedUser"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isAdmin"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The policy "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"attachUsers"}]},{"type":"text","value":" method will be called for each individual "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"userToBeAttached"}]},{"type":"text","value":". However, if you attach - "},{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"1, 3"}]},{"type":"text","value":" ids, this method will be called twice."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Another way to authorize this is by using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"canAttach"}]},{"type":"text","value":" method to the Eager field directly. This method accepts an invokable class instance or a closure:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"'users' => BelongsToMany::make('users', UserRepository::class)\n ->canAttach(function ($request, $pivot) {\n return $request->user()->isAdmin();\n }),\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" BelongsToMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"canAttach"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($request, $pivot) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isAdmin"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }),\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"override-attach"},"children":[{"type":"text","value":"Override attach"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You are free to intercept the attach operation entirely and override it by using a closure or an invokable:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"'users' => BelongsToMany::make('users', UserRepository::class)\n ->attachCallback(function ($request, $repository, $company) {\n $company->users()->attach($request->input('users'));\n }),\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" BelongsToMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"attachCallback"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($request, $repository, $company) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $company"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"users"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"attach"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"input"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }),\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Or using an invokable :"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"'users' => BelongsToMany::make('users', UserRepository::class)\n ->attachCallback(new AttachCompanyUsers),\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" BelongsToMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"attachCallback"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" AttachCompanyUsers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"and then define the class:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"use Illuminate\\Http\\Request;\n\nclass AttachCompanyUsers\n{\n public function __invoke(Request $request, CompanyRepository $repository, Company $company): void\n {\n $company->users()->attach($request->input('users'));\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Http\\Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" AttachCompanyUsers\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" __invoke"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"CompanyRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $repository, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Company"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $company)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" void\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $company"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"users"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"attach"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"input"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"sync-related"},"children":[{"type":"text","value":"Sync related"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can also "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sync"}]},{"type":"text","value":" your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BelongsToMany"}]},{"type":"text","value":" field. Say you have to sync permissions to a role. You can do it like this:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"POST: api/restify/roles/1/sync/permissions\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"POST: api/restify/roles/1/sync/permissions\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Payload:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"permissions\": [1, 2]\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"permissions\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"2"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Under the hood this will call the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sync"}]},{"type":"text","value":" method on the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BelongsToMany"}]},{"type":"text","value":" relationship:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// $role of the id 1\n\n$role->permissions()->sync($request->input('permissions'));\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// $role of the id 1\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$role"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"permissions"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"sync"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"input"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'permissions'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"));\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"authorize-sync"},"children":[{"type":"text","value":"Authorize sync"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can define a policy method "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"syncPermissions"}]},{"type":"text","value":". The name should start with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sync"}]},{"type":"text","value":" and suffix with the plural "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"CamelCase"}]},{"type":"text","value":" name of the model's relationship name:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// RolePolicy.php\n\npublic function syncPermissions(User $authenticatedUser, Company $company, Collection $keys): bool\n{ \n // $keys are the primary keys of the related model (permissions in our case) Restify is trying to `sync`\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// RolePolicy.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" syncPermissions"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $authenticatedUser, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Company"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $company, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Collection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $keys)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{ \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // $keys are the primary keys of the related model (permissions in our case) Restify is trying to `sync`\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"detach-related"},"children":[{"type":"text","value":"Detach related"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As soon we declared the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BelongsToMany"}]},{"type":"text","value":" relationship, Restify automatically registers the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"detach"}]},{"type":"text","value":" endpoint:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"POST: api/restify/companies/1/detach/users\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"POST: api/restify/companies/1/detach/users\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Using the payload:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"users\": [1]\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"users\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"authorize-detach"},"children":[{"type":"text","value":"Authorize detach"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You have a few options to authorize the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"detach"}]},{"type":"text","value":" endpoint."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Primarily, you can define the policy method "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"detachUsers"}]},{"type":"text","value":", as the name should start with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"detach"}]},{"type":"text","value":" and suffix with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"CamelCase"}]},{"type":"text","value":" name of the model relationship name:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// CompanyPolicy.php\n\npublic function detachUsers(User $authenticatedUser, Company $company, User $userToBeDetached): bool\n{ \n return $authenticatedUser->isAdmin();\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// CompanyPolicy.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" detachUsers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $authenticatedUser, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Company"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $company, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $userToBeDetached)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{ \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $authenticatedUser"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isAdmin"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The policy "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"detachUsers"}]},{"type":"text","value":" method will be called for each individual "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"userToBeDetached"}]},{"type":"text","value":". If you detach - "},{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"1, 3"}]},{"type":"text","value":" ids, this method will be called twice."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Another way to authorize this is by using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"canDetach"}]},{"type":"text","value":" method to the Eager field directly. This method accepts an "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"invokable"}]},{"type":"text","value":" class instance or a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"closure"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"'users' => BelongsToMany::make('users', UserRepository::class)\n ->canDetach(\n fn($request, $pivot) => $request->user()->can('detach', $pivot)\n ),\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" BelongsToMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"canDetach"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request, $pivot) => $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"can"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'detach'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", $pivot)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ),\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"override-detach"},"children":[{"type":"text","value":"Override detach"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You are free to intercept the detach method entirely and override it by using a closure or an invokable:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"'users' => BelongsToMany::make('users', UserRepository::class)\n ->detachCallback(function ($request, $repository, $company) {\n $company->users()->detach($request->input('users'));\n }),\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" BelongsToMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"detachCallback"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($request, $repository, $company) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $company"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"users"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"detach"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"input"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }),\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Or using an invokable :"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"'users' => BelongsToMany::make('users', UserRepository::class)\n ->detachCallback(new DetachCompanyUsers),\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" BelongsToMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"detachCallback"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" DetachCompanyUsers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"and then define the class:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"use Illuminate\\Http\\Request;\n\nclass DetachCompanyUsers\n{\n public function __invoke(Request $request, CompanyRepository $repository, Company $company): void\n {\n $company->users()->detach($request->input('users'));\n }\n}\n\n## Validation for Attach Operations\n\nYou can add custom validation for attach operations:\n\n```php\nBelongsToMany::make('users', UserRepository::class)\n ->validationCallback(function ($request, $pivot) {\n return [\n 'users.*' => 'exists:users,id',\n 'is_admin' => 'boolean'\n ];\n })\n ->unique() // Prevents duplicate attachments\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Http\\Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" DetachCompanyUsers\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" __invoke"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"CompanyRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $repository, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Company"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $company)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" void\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $company"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"users"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"detach"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"input"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"## Validation for Attach Operations\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"You"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" can"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" add"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" custom"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" validation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" for"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" attach"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" operations"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":":\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"```php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"BelongsToMany::make('users', UserRepository::class)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" ->validationCallback(function ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$pivot"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":") {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" return [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'users.*' => 'exists:users,id',\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'is_admin' => 'boolean'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" })\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" ->unique() // Prevents duplicate attachments\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"validationCallback"}]},{"type":"text","value":" receives the request and pivot data, and should return validation rules. The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"unique()"}]},{"type":"text","value":" method prevents duplicate attachments automatically."}]},{"type":"element","tag":"h2","props":{"id":"column-selection-in-relations"},"children":[{"type":"text","value":"Column Selection in Relations"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can specify which columns to load for relations using Laravel's column selection syntax:"}]},{"type":"element","tag":"h3","props":{"id":"basic-column-selection"},"children":[{"type":"text","value":"Basic Column Selection"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/users?include=posts[id,title,created_at]\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/users?include=posts[id,title,created_at]\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"nested-column-selection"},"children":[{"type":"text","value":"Nested Column Selection"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/companies?include=users[id,name].posts[title].comments[comment]\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/companies?include=users[id,name].posts[title].comments[comment]\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"mixed-column-selection"},"children":[{"type":"text","value":"Mixed Column Selection"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// In your repository\nHasMany::make('posts')->columns(['id', 'title', 'published_at'])\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// In your repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"HasMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"columns"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'published_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"])\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"advanced-sorting"},"children":[{"type":"text","value":"Advanced Sorting"}]},{"type":"element","tag":"h3","props":{"id":"sorting-by-related-fields"},"children":[{"type":"text","value":"Sorting by Related Fields"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Both "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BelongsTo"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"HasOne"}]},{"type":"text","value":" relations support sorting:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// BelongsTo sorting\nBelongsTo::make('user')->sortable('name')\n\n// HasOne sorting \nHasOne::make('profile')->sortable('bio')\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// BelongsTo sorting\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"BelongsTo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"sortable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// HasOne sorting \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"HasOne"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'profile'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"sortable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'bio'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"json-attribute-sorting"},"children":[{"type":"text","value":"JSON Attribute Sorting"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Relations can sort by JSON attributes:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"BelongsTo::make('user')->sortable('preferences->theme')\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"BelongsTo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"sortable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'preferences->theme'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"custom-sort-logic"},"children":[{"type":"text","value":"Custom Sort Logic"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can define custom sorting logic:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"use Binaryk\\\\LaravelRestify\\\\Filters\\\\SortableFilter;\n\nSortableFilter::make()\n ->usingClosure(function ($query, $direction) {\n return $query->orderBy('custom_logic', $direction);\n })\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\\\LaravelRestify\\\\Filters\\\\SortableFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"SortableFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"usingClosure"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($query, $direction) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"orderBy"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'custom_logic'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", $direction);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" })\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"morph-relations"},"children":[{"type":"text","value":"Morph Relations"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Laravel Restify supports all morph relationship types:"}]},{"type":"element","tag":"h3","props":{"id":"morphone"},"children":[{"type":"text","value":"MorphOne"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// CommentRepository\npublic static function related(): array\n{\n return [\n MorphOne::make('commentable', PostRepository::class),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// CommentRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" related"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" MorphOne"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'commentable'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"morphmany"},"children":[{"type":"text","value":"MorphMany"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository \npublic static function related(): array\n{\n return [\n MorphMany::make('comments', CommentRepository::class),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" related"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" MorphMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'comments'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"CommentRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"morphtomany"},"children":[{"type":"text","value":"MorphToMany"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository\npublic static function related(): array\n{\n return [\n MorphToMany::make('tags', TagRepository::class)->withPivot('created_at'),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" related"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" MorphToMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"TagRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"withPivot"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'created_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"relationship-authorization"},"children":[{"type":"text","value":"Relationship Authorization"}]},{"type":"element","tag":"h3","props":{"id":"repository-level-authorization"},"children":[{"type":"text","value":"Repository-Level Authorization"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Relations inherit authorization from their target repositories. You can customize this:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"HasMany::make('posts')->canEnableRelationship(function ($request) {\n return $request->user()->can('view-posts');\n})\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"HasMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"canEnableRelationship"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($request) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"can"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'view-posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"})\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"policy-based-authorization"},"children":[{"type":"text","value":"Policy-Based Authorization"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Define policy methods for relation operations:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// In your Policy class\npublic function viewPosts(User $user, Company $company): bool\n{\n return $user->can('view', $company);\n}\n\npublic function attachUsers(User $user, Company $company, User $userToAttach): bool \n{\n return $user->isAdmin();\n}\n\npublic function detachUsers(User $user, Company $company, User $userToDetach): bool\n{\n return $user->isAdmin(); \n}\n\npublic function syncPermissions(User $user, Role $role, Collection $permissionIds): bool\n{\n return $user->can('manage-permissions');\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// In your Policy class\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" viewPosts"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Company"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $company)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"can"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'view'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", $company);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" attachUsers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Company"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $company, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $userToAttach)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isAdmin"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" detachUsers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Company"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $company, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $userToDetach)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isAdmin"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" syncPermissions"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Role"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $role, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Collection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $permissionIds)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"can"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'manage-permissions'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"performance-optimizations"},"children":[{"type":"text","value":"Performance Optimizations"}]},{"type":"element","tag":"h3","props":{"id":"eager-loading-prevention"},"children":[{"type":"text","value":"Eager Loading Prevention"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Relations automatically prevent circular references and deep nesting to avoid performance issues."}]},{"type":"element","tag":"h3","props":{"id":"pagination-control"},"children":[{"type":"text","value":"Pagination Control"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Control relation pagination globally:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// In your Repository\npublic static int $defaultRelatablePerPage = 50;\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// In your Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" int"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $defaultRelatablePerPage "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" 50"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Or per request:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/users?include=posts&relatablePerPage=25\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/users?include=posts&relatablePerPage=25\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"selective-column-loading"},"children":[{"type":"text","value":"Selective Column Loading"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Always specify only needed columns:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/users?include=posts[id,title]&fields[users]=id,name\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/users?include=posts[id,title]&fields[users]=id,name\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"debugging-relations"},"children":[{"type":"text","value":"Debugging Relations"}]},{"type":"element","tag":"h3","props":{"id":"relation-state"},"children":[{"type":"text","value":"Relation State"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Check relation loading state:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"$related = Related::make('posts', $field);\n$isEager = $related->isEager(); // boolean\n$relation = $related->getRelation(); // string\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$related "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Related"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", $field);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$isEager "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $related"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isEager"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// boolean\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$relation "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $related"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"getRelation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// string\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"query-analysis"},"children":[{"type":"text","value":"Query Analysis"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Relations support query state tracking:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"$relatedQuery = RelatedQuery::fromToken('posts[id,title]');\n$columns = $relatedQuery->columns(); // ['id', 'title'] \n$isSerialized = $relatedQuery->isSerialized(); // boolean\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$relatedQuery "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" RelatedQuery"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"fromToken"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'posts[id,title]'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$columns "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $relatedQuery"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"columns"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// ['id', 'title'] \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$isSerialized "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $relatedQuery"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isSerialized"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// boolean\n"}]}]}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"introduction","depth":2,"text":"Introduction"},{"id":"definition","depth":2,"text":"Definition","children":[{"id":"eager-fields","depth":3,"text":"Eager fields"},{"id":"related-declaration","depth":3,"text":"Related Declaration"},{"id":"frontend-request","depth":3,"text":"Frontend request"},{"id":"nested-relationships","depth":3,"text":"Nested relationships"},{"id":"meta-information","depth":3,"text":"Meta information"}]},{"id":"belongsto-morphone","depth":2,"text":"BelongsTo & MorphOne","children":[{"id":"searchable-belongs-to","depth":3,"text":"Searchable belongs to"}]},{"id":"hasone","depth":2,"text":"HasOne","children":[{"id":"sortable-hasone-relations","depth":3,"text":"Sortable HasOne Relations"}]},{"id":"hasmany-morphmany","depth":2,"text":"HasMany & MorphMany","children":[{"id":"paginate","depth":3,"text":"Paginate"},{"id":"relatable-per-page","depth":3,"text":"Relatable per page"}]},{"id":"belongstomany-morphtomany","depth":2,"text":"BelongsToMany & MorphToMany","children":[{"id":"pivot-fields","depth":3,"text":"Pivot fields"},{"id":"attach-related","depth":3,"text":"Attach related"},{"id":"authorize-attach","depth":3,"text":"Authorize attach"},{"id":"override-attach","depth":3,"text":"Override attach"},{"id":"sync-related","depth":3,"text":"Sync related"},{"id":"authorize-sync","depth":3,"text":"Authorize sync"},{"id":"detach-related","depth":3,"text":"Detach related"},{"id":"authorize-detach","depth":3,"text":"Authorize detach"},{"id":"override-detach","depth":3,"text":"Override detach"}]},{"id":"column-selection-in-relations","depth":2,"text":"Column Selection in Relations","children":[{"id":"basic-column-selection","depth":3,"text":"Basic Column Selection"},{"id":"nested-column-selection","depth":3,"text":"Nested Column Selection"},{"id":"mixed-column-selection","depth":3,"text":"Mixed Column Selection"}]},{"id":"advanced-sorting","depth":2,"text":"Advanced Sorting","children":[{"id":"sorting-by-related-fields","depth":3,"text":"Sorting by Related Fields"},{"id":"json-attribute-sorting","depth":3,"text":"JSON Attribute Sorting"},{"id":"custom-sort-logic","depth":3,"text":"Custom Sort Logic"}]},{"id":"morph-relations","depth":2,"text":"Morph Relations","children":[{"id":"morphone","depth":3,"text":"MorphOne"},{"id":"morphmany","depth":3,"text":"MorphMany"},{"id":"morphtomany","depth":3,"text":"MorphToMany"}]},{"id":"relationship-authorization","depth":2,"text":"Relationship Authorization","children":[{"id":"repository-level-authorization","depth":3,"text":"Repository-Level Authorization"},{"id":"policy-based-authorization","depth":3,"text":"Policy-Based Authorization"}]},{"id":"performance-optimizations","depth":2,"text":"Performance Optimizations","children":[{"id":"eager-loading-prevention","depth":3,"text":"Eager Loading Prevention"},{"id":"pagination-control","depth":3,"text":"Pagination Control"},{"id":"selective-column-loading","depth":3,"text":"Selective Column Loading"}]},{"id":"debugging-relations","depth":2,"text":"Debugging Relations","children":[{"id":"relation-state","depth":3,"text":"Relation State"},{"id":"query-analysis","depth":3,"text":"Query Analysis"}]}]}},"_type":"markdown","_id":"content:api:relations.md","_source":"content","_file":"api/relations.md","_stem":"api/relations","_extension":"md"},"hash":"EFvVEslnWk"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/api/repositories-advanced.md b/docs-v3/.nuxt/content-cache/parsed/content/api/repositories-advanced.md new file mode 100644 index 000000000..6bb494ec8 --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/api/repositories-advanced.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/api/repositories-advanced","_dir":"api","_draft":false,"_partial":false,"_locale":"","title":"Repositories advanced","description":"","menuTitle":"Advanced","category":"API","position":7,"body":{"type":"root","children":[{"type":"element","tag":"h2","props":{"id":"query-builder"},"children":[{"type":"text","value":"Query Builder"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To perform any request to the database, Restify has to create a query builder instance. The query builder is passed through a few static methods from the repository, so you can override them and intercept the builder to add your custom statements."}]},{"type":"element","tag":"h3","props":{"id":"main-query"},"children":[{"type":"text","value":"Main query"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"mainQuery"}]},{"type":"text","value":" method is called for ALL repository operations and serves as the base query that other query methods build upon. This is the foundational query method that's applied to "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"show"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"index"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"global search"}]},{"type":"text","value":", and all other requests:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository\n\nuse Binaryk\\LaravelRestify\\Http\\Requests\\RestifyRequest;\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Database\\Eloquent\\Relations\\Relation;\n\npublic static function mainQuery(RestifyRequest $request, Builder | Relation $query)\n{\n return $query->where('company_id', $request->user()->company_id);\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Http\\Requests\\RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Database\\Eloquent\\Builder"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Database\\Eloquent\\Relations\\Relation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" mainQuery"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Builder"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" | "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Relation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'company_id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"company_id);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This method is ideal for:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Global scoping"}]},{"type":"text","value":" (e.g., multi-tenancy isolation)"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Common filtering logic"}]},{"type":"text","value":" that applies to all operations"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Security constraints"}]},{"type":"text","value":" that should never be bypassed"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Global eager loading"}]},{"type":"text","value":" for frequently used relationships"}]}]},{"type":"element","tag":"h3","props":{"id":"index-query"},"children":[{"type":"text","value":"Index query"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"indexQuery"}]},{"type":"text","value":" method is specifically called for listing operations ("},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"GET /api/restify/posts"}]},{"type":"text","value":") and global search requests. It builds on top of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"mainQuery"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository\n\nuse Binaryk\\LaravelRestify\\Http\\Requests\\RestifyRequest;\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Database\\Eloquent\\Relations\\Relation;\n\npublic static function indexQuery(RestifyRequest $request, Builder | Relation $query)\n{\n return $query->where('status', 'published')\n ->with('author:id,name')\n ->orderBy('published_at', 'desc');\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Http\\Requests\\RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Database\\Eloquent\\Builder"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Database\\Eloquent\\Relations\\Relation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" indexQuery"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Builder"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" | "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Relation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'status'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'published'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"with"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'author:id,name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"orderBy"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'published_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'desc'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This method is perfect for:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Index-specific filtering"}]},{"type":"text","value":" (e.g., only show published items)"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Default sorting"}]},{"type":"text","value":" for listings"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Performance optimizations"}]},{"type":"text","value":" for list views"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Lightweight eager loading"}]},{"type":"text","value":" for index displays"}]}]},{"type":"element","tag":"h3","props":{"id":"show-query"},"children":[{"type":"text","value":"Show query"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"showQuery"}]},{"type":"text","value":" method is applied specifically for individual resource requests ("},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"GET /api/restify/posts/1"}]},{"type":"text","value":"). It allows you to customize queries when fetching a single resource:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository\n\nuse Binaryk\\LaravelRestify\\Http\\Requests\\RestifyRequest;\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Database\\Eloquent\\Relations\\Relation;\n\npublic static function showQuery(RestifyRequest $request, Builder | Relation $query)\n{\n return $query->with(['author', 'categories', 'tags', 'comments.user']);\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Http\\Requests\\RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Database\\Eloquent\\Builder"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Database\\Eloquent\\Relations\\Relation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" showQuery"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Builder"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" | "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Relation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"with"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'author'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'categories'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'comments.user'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This method is useful for:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Detailed eager loading"}]},{"type":"text","value":" for full resource display"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Show-specific constraints"}]},{"type":"text","value":" or permissions"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Performance optimizations"}]},{"type":"text","value":" for single resource fetching"}]}]},{"type":"element","tag":"h3","props":{"id":"scout-query"},"children":[{"type":"text","value":"Scout query"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When using Laravel Scout for full-text search, you can customize the Scout query builder:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository\n\npublic static function scoutQuery(RestifyRequest $request, $scoutBuilder)\n{\n return $scoutBuilder->where('status', 'published')\n ->where('tenant_id', $request->user()->tenant_id);\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" scoutQuery"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $scoutBuilder)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $scoutBuilder"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'status'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'published'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tenant_id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"tenant_id);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"query-method-hierarchy"},"children":[{"type":"text","value":"Query Method Hierarchy"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The query methods are applied in this specific order:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Base Query"}]},{"type":"text","value":": "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"query()"}]},{"type":"text","value":" - Creates the initial query builder from the model"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Main Query"}]},{"type":"text","value":": "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"mainQuery()"}]},{"type":"text","value":" - Applied to ALL operations for global constraints"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Specific Query"}]},{"type":"text","value":": "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"indexQuery()"}]},{"type":"text","value":" or "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"showQuery()"}]},{"type":"text","value":" - Applied based on the operation type"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Search/Filters"}]},{"type":"text","value":": Applied by Restify's search service based on request parameters"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Scout Query"}]},{"type":"text","value":": "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"scoutQuery()"}]},{"type":"text","value":" - Only applied when using Laravel Scout search"}]}]},{"type":"element","tag":"h3","props":{"id":"complete-example-multi-tenant-blog-repository"},"children":[{"type":"text","value":"Complete Example: Multi-tenant Blog Repository"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PostRepository extends Repository\n{\n // Step 2: Applied to ALL operations - ensures tenant isolation\n public static function mainQuery(RestifyRequest $request, $query)\n {\n return $query->where('tenant_id', $request->user()->tenant_id)\n ->whereNull('deleted_at'); // Global soft delete check\n }\n \n // Step 3a: Only for listing - show published posts with minimal data\n public static function indexQuery(RestifyRequest $request, $query)\n {\n return $query->where('status', 'published')\n ->with('author:id,name,avatar')\n ->orderBy('published_at', 'desc');\n }\n \n // Step 3b: Only for individual posts - load complete relationships\n public static function showQuery(RestifyRequest $request, $query)\n {\n return $query->with([\n 'author',\n 'categories',\n 'tags',\n 'comments' => function ($query) {\n $query->where('approved', true)->with('user:id,name');\n }\n ]);\n }\n \n // Step 5: Scout search within tenant boundaries\n public static function scoutQuery(RestifyRequest $request, $scoutBuilder)\n {\n return $scoutBuilder->where('tenant_id', $request->user()->tenant_id)\n ->where('status', 'published');\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Step 2: Applied to ALL operations - ensures tenant isolation\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" mainQuery"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $query)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tenant_id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"tenant_id)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"whereNull"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'deleted_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Global soft delete check\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Step 3a: Only for listing - show published posts with minimal data\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" indexQuery"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $query)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'status'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'published'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"with"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'author:id,name,avatar'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"orderBy"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'published_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'desc'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Step 3b: Only for individual posts - load complete relationships\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" showQuery"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $query)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"with"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"([\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'author'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'categories'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'comments'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($query) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'approved'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"with"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user:id,name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Step 5: Scout search within tenant boundaries\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" scoutQuery"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $scoutBuilder)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $scoutBuilder"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tenant_id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"tenant_id)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":35},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'status'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'published'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":36},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":37},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"repository-prefix"},"children":[{"type":"text","value":"Repository prefix"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The default prefix of all Restify routes (except "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"login"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"register"}]},{"type":"text","value":") lives under the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"restify->base"}]},{"type":"text","value":" config:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// config/restify.php\n...\n'base' => '/api/restify',\n...\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// config/restify.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'base'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" '/api/restify'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"...\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Thus, Restify generates the URI for the repository in the following way:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"config('restify.base') . '/' . UserRepository::uriKey() . '/'\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"config"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'restify.base'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" '/'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"uriKey"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"() "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" '/'\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For example, let's assume we have the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"restify.base"}]},{"type":"text","value":" equal with: "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"api/restify"}]},{"type":"text","value":". The default URI generated for the\nUserRepository is:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/users\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/users\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"However, you can prefix the repository with your own:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// UserRepository\npublic static $prefix = 'api/v1';\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// UserRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $prefix "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'api/v1'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now, the generated URI will look like this:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/v1/users\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/v1/users\n"}]}]}]}]},{"type":"element","tag":"alert","props":{},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For the rest of the repositories the prefix will stay as it is, the default one. Keep in mind that this custom prefix\nwill be used for all the endpoints related to the user repository."}]}]},{"type":"element","tag":"h2","props":{"id":"repository-middleware"},"children":[{"type":"text","value":"Repository middleware"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Each repository has the middlewares from the config "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"restify.middleware"}]},{"type":"text","value":" out of the box for the CRUD methods. However,\nyou're free to add your own middlewares for a specific repository."}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":" // PostRepository.php\n\n public static $middleware = [\n NeedsCompanyMiddleware::class,\n ];\n\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // PostRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $middleware "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" NeedsCompanyMiddleware"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"NeedsCompanyMiddleware"}]},{"type":"text","value":" is a custom middleware, and it will be applied over all CRUD routes for this repository."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you need the current request, you can override the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"collectMiddlewares"}]},{"type":"text","value":" method and use the current request:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public static function collectMiddlewares(RestifyRequest $request): ?Collection\n{\n if ($request->isShowRequest()) \n {\n return collect([ \n NeedsCompanyMiddleware::class,\n ]);\n }\n\n if ($request->isIndexRequest()) \n {\n return collect([ \n SampleIndexRequest::class,\n ]);\n }\n\n return null;\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" collectMiddlewares"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Collection\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isShowRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()) \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" collect"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"([ \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" NeedsCompanyMiddleware"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isIndexRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()) \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" collect"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"([ \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" SampleIndexRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"repository-registration"},"children":[{"type":"text","value":"Repository registration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Laravel Restify registers all repositories automatically in the App namespace. However, you can register your own repositories from any service provider using the InteractsWithRestifyRepositories trait. Here's an example:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"loadRestifyFrom(__DIR__.'/Restify', __NAMESPACE__.'\\\\Restify\\\\');\n \n // The rest of your package's registration code goes here.\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"loadRestifyFrom"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"__DIR__"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'/Restify'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"__NAMESPACE__"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\\\"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"Restify"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\\\"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // The rest of your package's registration code goes here.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you want to load Restify from your own service provider, you must use the InteractsWithRestifyRepositories trait in the service provider class. The loadRestifyFrom method takes the path to the directory containing the repositories and the namespace under which the repositories will be registered."}]},{"type":"element","tag":"h2","props":{"id":"dependency-injection"},"children":[{"type":"text","value":"Dependency injection"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The Laravel "},{"type":"element","tag":"a","props":{"href":"https://laravel.com/docs/7.x/container","rel":["nofollow"]},"children":[{"type":"text","value":"service container"}]},{"type":"text","value":" is used to resolve all the Laravel Restify\nrepositories. As a result, you are able to type-hint any dependencies your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Repository"}]},{"type":"text","value":" may need in its constructor. The\ndeclared dependencies will automatically be resolved and injected into the repository's instance:"}]},{"type":"element","tag":"alert","props":{},"children":[{"type":"text","value":" \n"},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Important: Don't forget to call the parent "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"constructor"}]},{"type":"text","value":"."}]}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"use App\\Services\\PostService;\nuse App\\Restify\\Repository;\n\nclass PostRepository extends Repository\n{\n private PostService $postService; \n\n public function __construct(PostService $service)\n {\n parent::__construct();\n\n $this->postService = $service;\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" App\\Services\\PostService"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" App\\Restify\\Repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" private"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" PostService"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $postService; \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" __construct"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"PostService"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $service)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" parent::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"__construct"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"postService "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $service;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"custom-crud"},"children":[{"type":"text","value":"Custom CRUD"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify injects all "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"CRUD"}]},{"type":"text","value":"'s operations for you. However, sometimes you may want to intercept or override\nthe entire logic of a specific action. Let's say your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"save"}]},{"type":"text","value":" method needs to perform additional operations beyond the default action. In\nthis case you can easily override each action ("},{"type":"element","tag":"a","props":{"href":"/repositories#actions-handled-by-the-repository"},"children":[{"type":"text","value":"defined here"}]},{"type":"text","value":") in the repository:"}]},{"type":"element","tag":"h3","props":{"id":"index"},"children":[{"type":"text","value":"index"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":" public function index(RestifyRequest $request)\n {\n // Silence is golden\n }\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" index"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Silence is golden\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"show"},"children":[{"type":"text","value":"show"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":" public function show(RestifyRequest $request, $repositoryId)\n {\n // Silence is golden\n }\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" show"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $repositoryId)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Silence is golden\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"store"},"children":[{"type":"text","value":"store"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":" public function store(RestifyRequest $request)\n {\n // Silence is golden\n }\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" store"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Silence is golden\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"store-bulk"},"children":[{"type":"text","value":"store bulk"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":" public function storeBulk(RepositoryStoreBulkRequest $request)\n {\n // Silence is golden\n }\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" storeBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RepositoryStoreBulkRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Silence is golden\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"update"},"children":[{"type":"text","value":"update"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":" public function update(RestifyRequest $request, $repositoryId)\n {\n // Silence is golden\n }\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" update"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $repositoryId)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Silence is golden\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"update-bulk"},"children":[{"type":"text","value":"update bulk"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":" // $row is the payload row to be updated\n public function updateBulk(RestifyRequest $request, $repositoryId, int $row)\n {\n // Silence is golden\n }\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // $row is the payload row to be updated\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" updateBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $repositoryId, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"int"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $row)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Silence is golden\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"destroy"},"children":[{"type":"text","value":"destroy"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":" public function destroy(RestifyRequest $request, $repositoryId)\n {\n // Silence is golden\n }\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" destroy"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $repositoryId)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Silence is golden\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"custom-routes"},"children":[{"type":"text","value":"Custom routes"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Laravel Restify has its own \"CRUD\" routes, although you're able to define your custom routes right from your Repository\nclass:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"/**\n * Defining custom routes\n * \n * The default prefix of this route is the uriKey (e.g. 'api/restify/posts'),\n * \n * The default namespace is AppNamespace/Http/Controllers\n * \n * The default middlewares are the same from config('restify.middleware')\n *\n * All options could be overrided by passing an $attributes argument and set $wrap to false\n *\n * @param \\Illuminate\\Routing\\Router $router\n * @param $attributes\n */\npublic static function routes(\\Illuminate\\Routing\\Router $router, $attributes = [], $wrap = true)\n{\n $router->get('last-posts', function () {\n return static::makeModel()->latest()->first();\n });\n\n $router->post('make-primary/{post}', [static::class, 'makePrimary']);\n}\n\npublic function makePrimary(Post $post) \n{\n // Handle \n // ...\n return response('Done');\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"/**\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * Defining custom routes\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * The default prefix of this route is the uriKey (e.g. 'api/restify/posts'),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * The default namespace is AppNamespace/Http/Controllers\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * The default middlewares are the same from config('restify.middleware')\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" *\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * All options could be overrided by passing an $attributes argument and set $wrap to false\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" *\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\Illuminate\\Routing\\Router"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $router\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $attributes\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" */\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" routes"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\Illuminate\\Routing\\Router"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $router, $attributes "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [], $wrap "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $router"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'last-posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" () {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"makeModel"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"latest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"first"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $router"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'make-primary/{post}'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"static::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'makePrimary'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" makePrimary"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $post) \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Handle \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" response"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'Done'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's examine a more practical example. Let's use the Post repository we defined above:"}]},{"type":"element","tag":"alert","props":{},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Route wrapping: The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$wrap"}]},{"type":"text","value":" argument determines whether your route should be wrapped with the default "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"middlewares"}]},{"type":"text","value":",\n"},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"controllers namespace"}]},{"type":"text","value":", and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"prefix"}]},{"type":"text","value":" your routes with the repository's base (i.e., "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/"}]},{"type":"text","value":")."}]}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"use App\\Restify\\Repository;\n\nclass PostRepository extends Repository\n{\n public static function routes(\\Illuminate\\Routing\\Router $router, $attributes = [], $wrap = true)\n {\n $router->get('/{id}/kpi', 'PostController@kpi'); // /api/restify/posts/1/kpi\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" App\\Restify\\Repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" routes"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\Illuminate\\Routing\\Router"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $router, $attributes "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [], $wrap "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $router"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'/{id}/kpi'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'PostController@kpi'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// /api/restify/posts/1/kpi\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"At this moment Restify is building the new route as a child of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"posts"}]},{"type":"text","value":", so it has the following route for instance:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/posts/{id}/kpi\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/posts/{id}/kpi\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This route is pointing to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PostsController@kpi"}]},{"type":"text","value":". Let's define it:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"response();\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"response"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"route-prefix"},"children":[{"type":"text","value":"Route prefix"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As we saw in the example above, the route is a child of the current repository. However, you might want to\nhave a separate prefix occasionally, which could be outside the URI of the current repository. Restify provides an easy way to do this by\nadding a default value "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"prefix"}]},{"type":"text","value":" for the second "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$attributes"}]},{"type":"text","value":" argument:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"/**\n * @param \\Illuminate\\Routing\\Router $router\n * @param $options\n */\npublic static function routes(Router $router, $attributes = ['prefix' => 'api',], $wrap = true)\n{\n $router->get('hello-world', function () {\n return 'Hello World';\n });\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"/**\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\Illuminate\\Routing\\Router"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $router\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $options\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" */\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" routes"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Router"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $router, $attributes "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'prefix'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'api'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",], $wrap "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $router"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'hello-world'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" () {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'Hello World'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now, the generated route will look like this:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: '/api/hello-world\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: '/api/hello-world\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"With "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"api"}]},{"type":"text","value":" as a custom prefix."}]},{"type":"element","tag":"h3","props":{"id":"route-middleware"},"children":[{"type":"text","value":"Route middleware"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"All routes declared in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"routes"}]},{"type":"text","value":" method will have the same middlewares defined in your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"restify.middleware"}]},{"type":"text","value":"\nconfiguration file. Overriding default middlewares is straightforward with Restify:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"/**\n * @param \\Illuminate\\Routing\\Router $router\n * @param $attributes\n */\npublic static function routes(Router $router, $attributes = ['middleware' => [CustomMiddleware::class],], $wrap = true)\n{\n $router->get('hello-world', function () {\n return 'Hello World';\n });\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"/**\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\Illuminate\\Routing\\Router"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $router\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $attributes\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" */\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" routes"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Router"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $router, $attributes "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'middleware'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"CustomMiddleware"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"],], $wrap "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $router"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'hello-world'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" () {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'Hello World'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In that case, the single middleware of the route will be defined by the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"CustomMiddleware"}]},{"type":"text","value":" class."}]},{"type":"element","tag":"h3","props":{"id":"route-namespace"},"children":[{"type":"text","value":"Route Namespace"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By default, each route defined in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"routes"}]},{"type":"text","value":" method will have the namespace "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"AppRootNamespace\\Http\\Controllers"}]},{"type":"text","value":". You\ncan override it easily by using "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"namespace"}]},{"type":"text","value":" configuration key:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"/**\n * @param \\Illuminate\\Routing\\Router $router\n * @param $attributes\n */\npublic static function routes(Router $router, $attributes = ['namespace' => 'App\\Services',], $wrap = true)\n{\n $router->get('hello-world', 'WorldController@hello');\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"/**\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\Illuminate\\Routing\\Router"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $router\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $attributes\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" */\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" routes"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Router"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $router, $attributes "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'namespace'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'App\\Services'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",], $wrap "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $router"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'hello-world'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'WorldController@hello'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"alert","props":{"type":"warning"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Non-wrapped routes: When "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$wrap"}]},{"type":"text","value":" is false, your routes will only have the Route group "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$attributes"}]},{"type":"text","value":", which means that no\nprefix, middleware, or namespace will be applied automatically, even if you defined them as default arguments in\nthe "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"routes"}]},{"type":"text","value":" method. You should be careful about this behavior."}]}]},{"type":"element","tag":"h2","props":{"id":"repository-lifecycle"},"children":[{"type":"text","value":"Repository Lifecycle"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Each repository has several lifecycle methods. The most useful is "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"booted"}]},{"type":"text","value":", which is called as soon as the repository is loaded with the resource:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository.php\nprotected static function booted()\n{\n // \n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"protected"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" booted"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"query-builder","depth":2,"text":"Query Builder","children":[{"id":"main-query","depth":3,"text":"Main query"},{"id":"index-query","depth":3,"text":"Index query"},{"id":"show-query","depth":3,"text":"Show query"},{"id":"scout-query","depth":3,"text":"Scout query"},{"id":"query-method-hierarchy","depth":3,"text":"Query Method Hierarchy"},{"id":"complete-example-multi-tenant-blog-repository","depth":3,"text":"Complete Example: Multi-tenant Blog Repository"}]},{"id":"repository-prefix","depth":2,"text":"Repository prefix"},{"id":"repository-middleware","depth":2,"text":"Repository middleware"},{"id":"repository-registration","depth":2,"text":"Repository registration"},{"id":"dependency-injection","depth":2,"text":"Dependency injection","children":[{"id":"custom-crud","depth":3,"text":"Custom CRUD"},{"id":"index","depth":3,"text":"index"},{"id":"show","depth":3,"text":"show"},{"id":"store","depth":3,"text":"store"},{"id":"store-bulk","depth":3,"text":"store bulk"},{"id":"update","depth":3,"text":"update"},{"id":"update-bulk","depth":3,"text":"update bulk"},{"id":"destroy","depth":3,"text":"destroy"}]},{"id":"custom-routes","depth":2,"text":"Custom routes","children":[{"id":"route-prefix","depth":3,"text":"Route prefix"},{"id":"route-middleware","depth":3,"text":"Route middleware"},{"id":"route-namespace","depth":3,"text":"Route Namespace"}]},{"id":"repository-lifecycle","depth":2,"text":"Repository Lifecycle"}]}},"_type":"markdown","_id":"content:api:repositories-advanced.md","_source":"content","_file":"api/repositories-advanced.md","_stem":"api/repositories-advanced","_extension":"md"},"hash":"JDIFU6007q"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/api/repositories.md b/docs-v3/.nuxt/content-cache/parsed/content/api/repositories.md new file mode 100644 index 000000000..90ca339c2 --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/api/repositories.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/api/repositories","_dir":"api","_draft":false,"_partial":false,"_locale":"","title":"Repositories","description":"The Repository is the core of the Laravel Restify.","menuTitle":"Repositories","category":"API","position":6,"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The Repository is the core of the Laravel Restify."}]},{"type":"element","tag":"h2","props":{"id":"quick-start"},"children":[{"type":"text","value":"Quick start"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For convenience, Restify includes a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"restify:repository"}]},{"type":"text","value":" Artisan command. This command will create a repository\nin "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"app/Restify"}]},{"type":"text","value":" directory that is associated with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"App\\Models\\Post"}]},{"type":"text","value":" model:"}]},{"type":"element","tag":"pre","props":{"className":"language-shell shiki shiki-themes github-light github-dark","code":"php artisan restify:repository PostRepository\n","language":"shell","meta":"script","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" PostRepository\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The newly created repository will be placed in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"app/Restify/PostRepository.php"}]},{"type":"text","value":" file."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By default, the generation repository command doesn't require any option. However, you can specify "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--app"}]},{"type":"text","value":" option to\ninstruct Restify to generate the migrations, policy, and model (in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"app/Models"}]},{"type":"text","value":")."}]},{"type":"element","tag":"h2","props":{"id":"defining-repositories"},"children":[{"type":"text","value":"Defining Repositories"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The basic repository form looks like this using the modern attribute approach:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"namespace App\\Restify;\n\nuse App\\Models\\Post;\nuse App\\Restify\\Repository;\nuse Binaryk\\LaravelRestify\\Attributes\\Model;\n\n#[Model(Post::class)]\nclass PostRepository extends Repository\n{\n public function fields(RestifyRequest $request): array\n {\n return [];\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"namespace"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" App\\Restify"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" App\\Models\\Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" App\\Restify\\Repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Attributes\\Model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"#["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Or using the traditional static property approach:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"namespace App\\Restify;\n\nuse App\\Models\\Post;\nuse App\\Restify\\Repository;\n\nclass PostRepository extends Repository\n{\n public static string $model = Post::class;\n \n public function fields(RestifyRequest $request): array\n {\n return [];\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"namespace"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" App\\Restify"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" App\\Models\\Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" App\\Restify\\Repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"alert","props":{"type":"info"},"children":[{"type":"text","value":"\nIf you don't specify the model using an attribute or the $model property, Restify will try to guess the model automatically based on the repository class name.\n"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fields"}]},{"type":"text","value":" method returns the default set of attributes definitions that should be applied during API requests."}]},{"type":"element","tag":"h3","props":{"id":"model-repository-discovery-conventions"},"children":[{"type":"text","value":"Model & Repository Discovery Conventions"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify will discover recursively all classes from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"app\\Restify\\*"}]},{"type":"text","value":" directory that extend\nthe "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Binaryk\\LaravelRestify\\Repositories\\Repository"}]},{"type":"text","value":" class."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For model resolution, Restify follows this priority order:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"#[Model]"}]},{"type":"text","value":" attribute"}]},{"type":"text","value":" (highest priority)"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$model"}]},{"type":"text","value":" static property"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Auto-guessing"}]},{"type":"text","value":" from repository class name (lowest priority)"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When auto-guessing, Restify uses the prefix of the Repository name. For example, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"UserPostRepository"}]},{"type":"text","value":" class will try to find the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"UserPost"}]},{"type":"text","value":" model."}]},{"type":"element","tag":"h3","props":{"id":"actions-handled-by-the-repository"},"children":[{"type":"text","value":"Actions handled by the Repository"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Having this in place you're basically ready for the CRUD actions over posts. You now have available the following endpoints:"}]},{"type":"element","tag":"table","props":{},"children":[{"type":"element","tag":"thead","props":{},"children":[{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"th","props":{"align":"left"},"children":[{"type":"text","value":"Verb"}]},{"type":"element","tag":"th","props":{"align":"left"},"children":[{"type":"text","value":"URI"}]},{"type":"element","tag":"th","props":{"align":"left"},"children":[{"type":"text","value":"Action"}]}]}]},{"type":"element","tag":"tbody","props":{},"children":[{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"GET"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"index"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"GET"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/actions"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"display index actions"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"GET"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/getters"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"display index getters"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"GET"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/{post}"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"show"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"GET"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/{post}/actions"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"display individual actions"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"GET"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/{post}/getters"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"display individual getters"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"POST"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"store"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"POST"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/actions?action=actionName"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"perform index actions"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"GET"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/getters?getter=getterName"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"retrieve index getters"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"POST"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/bulk"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"store multiple"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"DELETE"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/bulk/delete"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"delete multiple"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"POST"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/bulk/update"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"update multiple"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"PATCH"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/{post}"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"partial update"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"PUT"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/{post}"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"full update"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"POST"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/{post}"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"partial of full update including attachments"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"POST"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/{post}/actions?action=actionName"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"perform individual actions"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"GET"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/{post}/getters?getter=getterName"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"retrieve individual getter"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"DELETE"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/{post}"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"destroy"}]}]}]}]},{"type":"element","tag":"alert","props":{},"children":[{"type":"text","value":" \n"},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As you can see, we provided 3 Verbs for the model update (PUT, PATCH, POST). The reason for that is\nbecause you just simply cannot send files via "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PATCH"}]},{"type":"text","value":" or "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PUT"}]},{"type":"text","value":" verbs, so we have "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"POST"}]},{"type":"text","value":" as a result. The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PUT"}]},{"type":"text","value":" or "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PATCH"}]},{"type":"text","value":" could be used\nfor full model update, and respectively partial update."}]}]},{"type":"element","tag":"h2","props":{"id":"model-definition"},"children":[{"type":"text","value":"Model Definition"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As we already noticed, each repository basically works as a wrapper over a specific resource. The fancy\nnaming "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"resource"}]},{"type":"text","value":" is nothing more than a database entity (posts, users etc.). To make the repository aware of the\nentity it should handle, we need to define the model associated with this resource."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Laravel Restify provides three ways to define the model, with the following priority order:"}]},{"type":"element","tag":"h3","props":{"id":"_1-modern-approach-php-attributes-recommended"},"children":[{"type":"text","value":"1. Modern Approach: PHP Attributes (Recommended)"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The most modern and clean approach uses PHP 8+ attributes:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"use Binaryk\\LaravelRestify\\Attributes\\Model;\n\n#[Model(Post::class)]\nclass PostRepository extends Repository\n{\n // Clean - no static property needed\n public function fields(RestifyRequest $request): array\n {\n return [\n field('title'),\n field('content'),\n ];\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Attributes\\Model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"#["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Clean - no static property needed\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'content'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can also use string class names:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"#[Model('App\\Models\\Post')]\nclass PostRepository extends Repository\n{\n // Fields...\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"#["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'App\\Models\\Post'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Fields...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Benefits of using attributes:"}]}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Modern, declarative approach"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Better IDE support and static analysis"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Cleaner code (no need for static properties)"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"More discoverable with reflection tools"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Type-safe when using "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"::class"}]},{"type":"text","value":" syntax"}]}]},{"type":"element","tag":"h3","props":{"id":"_2-traditional-approach-static-property"},"children":[{"type":"text","value":"2. Traditional Approach: Static Property"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The classic approach using static properties (still fully supported):"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PostRepository extends Repository\n{\n public static string $model = Post::class;\n \n // Or with string\n public static string $model = 'App\\\\Models\\\\Post';\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Or with string\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'App"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\\\"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"Models"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\\\"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"Post'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"_3-auto-guessing-fallback"},"children":[{"type":"text","value":"3. Auto-Guessing (Fallback)"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If neither attribute nor static property is defined, Restify will automatically guess the model from the repository class name:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"UserRepository"}]},{"type":"text","value":" → tries "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"App\\Models\\User"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BlogPostRepository"}]},{"type":"text","value":" → tries "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"App\\Models\\BlogPost"}]}]}]},{"type":"element","tag":"alert","props":{"type":"info"},"children":[{"type":"text","value":"\nThe attribute approach takes the highest priority, followed by the static property, and finally auto-guessing as a fallback.\n"}]},{"type":"element","tag":"h2","props":{"id":"public-repository"},"children":[{"type":"text","value":"Public repository"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Sometimes, you might find yourself facing the risk of exposing public information (allowing unauthenticated users to access it)."}]},{"type":"element","tag":"alert","props":{"type":"warning"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We highly recommend avoiding this kind of exposure. If you need to expose custom data, you can use the "},{"type":"element","tag":"a","props":{"href":"/api/serializer"},"children":[{"type":"text","value":"serializer"}]},{"type":"text","value":" to return a json:api format from any custom route/controller (still using the power of repositories)."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify allows you to define a public repository by adding the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$public"}]},{"type":"text","value":" property on true:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public static bool|array $public = true;\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"|"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $public "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When adding the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$public"}]},{"type":"text","value":" flag, the repository will expose ONLY GET requests publicly. These requests are:"}]},{"type":"element","tag":"table","props":{},"children":[{"type":"element","tag":"thead","props":{},"children":[{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"th","props":{"align":"left"},"children":[{"type":"text","value":"Verb"}]},{"type":"element","tag":"th","props":{"align":"left"},"children":[{"type":"text","value":"URI"}]},{"type":"element","tag":"th","props":{"align":"left"},"children":[{"type":"text","value":"Action"}]}]}]},{"type":"element","tag":"tbody","props":{},"children":[{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"GET"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"index"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"GET"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/getters"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"display index getters"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"GET"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/{post}"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"show"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"GET"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/{post}/getters"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"display individual getters"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"GET"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/getters?getter=getterName"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"retrieve index getters"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"GET"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/{post}/getters?getter=getterName"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"retrieve individual getter"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In order to get the public functionality you need to take a few extra steps to inform your setup that now it has public access."}]},{"type":"element","tag":"h3","props":{"id":"public-gate"},"children":[{"type":"text","value":"Public gate"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Make sure you allow your global gate a nullable user:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// app/Providers/RestifyApplicationServiceProvider.php\n\nprotected function gate(): void\n{\n Gate::define('viewRestify', function ($user = null) {\n if (is_null($user)) {\n return true;\n }\n \n return in_array($user->email, [...])\n });\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// app/Providers/RestifyApplicationServiceProvider.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"protected"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" gate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" void\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Gate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"define"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'viewRestify'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($user "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":") {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"is_null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($user)) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" in_array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"email, ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"..."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"])\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"public-policies"},"children":[{"type":"text","value":"Public Policies"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As we know, each model should be protected by a policy. The policy that corresponds to a public repository should also allow a nullable authenticated user:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// ie: PostPolicy\npublic function allowRestify(User $user = null): bool\n{\n return true;\n}\n\npublic function show(User $user = null, User $model): bool\n{\n return true;\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// ie: PostPolicy\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" allowRestify"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" show"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Having these configurations in place, you should be good to expose the repository publicly."}]},{"type":"element","tag":"h2","props":{"id":"repository-key"},"children":[{"type":"text","value":"Repository key"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The repository URI segment is automatically generated by using the repository's name. The php method that does that is:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public static function uriKey(): string\n{\n if (property_exists(static::class, 'uriKey') && is_string(static::$uriKey)) {\n return static::$uriKey;\n }\n\n $kebabWithoutRepository = Str::kebab(Str::replaceLast('Repository', '', class_basename(get_called_class())));\n\n /**\n * e.g. UserRepository => users\n * e.g. LaravelEntityRepository => laravel-entities.\n */\n return Str::plural($kebabWithoutRepository);\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" uriKey"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" string\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"property_exists"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"static::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'uriKey'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"&&"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" is_string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"static::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$uriKey)) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$uriKey;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $kebabWithoutRepository "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Str"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"kebab"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Str"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"replaceLast"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'Repository'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"''"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"class_basename"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"get_called_class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"())));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" /**\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * e.g. UserRepository => users\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * e.g. LaravelEntityRepository => laravel-entities.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" */\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Str"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"plural"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($kebabWithoutRepository);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As you can see, you can override this or define your own "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"public static string $uriKey"}]},{"type":"text","value":" to the repository, so you get a custom repository uri segment. For example, if we want to call our users as "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"members"}]},{"type":"text","value":" we will do as in the example below:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// UserRepository\n\npublic static string $uriKey = 'members';\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// UserRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $uriKey "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'members'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"So the request is:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: api/restify/members\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: api/restify/members\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"fields"},"children":[{"type":"text","value":"Fields"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Fields are the main component of the Repository definition. These fields represent the model's attributes that will be\nexposed through the repository's endpoints. A good practice for the API is to expose as minimum fields as you can, so\nyour API will be as private as possible."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To some extent, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fields"}]},{"type":"text","value":" are similar to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"toArray"}]},{"type":"text","value":" method from\nthe "},{"type":"element","tag":"a","props":{"href":"https://laravel.com/docs/eloquent-resources#concept-overview","rel":["nofollow"]},"children":[{"type":"text","value":"laravel resource"}]},{"type":"text","value":" concept."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's define some fields for our Post model:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"use Binaryk\\LaravelRestify\\Fields\\Field;\nuse Binaryk\\LaravelRestify\\Repositories\\Repository;\nuse Binaryk\\LaravelRestify\\Http\\Requests\\RestifyRequest;\n\nclass PostRepository extends Repository\n{\n public function fields(RestifyRequest $request) \n {\n return [\n field('title'),\n \n field('description'),\n ];\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Fields\\Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Repositories\\Repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Http\\Requests\\RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request) \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'description'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"alert","props":{},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Field class has many mutations, validators and interactions that you can use. These are documented "},{"type":"element","tag":"a","props":{"href":"/api/fields"},"children":[{"type":"text","value":"here"}]}]}]},{"type":"element","tag":"h2","props":{"id":"show-request"},"children":[{"type":"text","value":"Show request"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now, your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"GET"}]},{"type":"text","value":" endpoint will expose the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"title"}]},{"type":"text","value":" and the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"description"}]},{"type":"text","value":" of the Post. The json response of\nthe "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"api/restify/posts/1"}]},{"type":"text","value":" route:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"data\": {\n \"id\": \"1\",\n \"type\": \"posts\",\n \"attributes\": {\n \"title\": \"Amet ratione est quas quia ut nemo.\",\n \"description\": null\n },\n \"meta\": {\n \"authorizedToShow\": true,\n \"authorizedToStore\": true,\n \"authorizedToUpdate\": false,\n \"authorizedToDelete\": false\n }\n }\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"data\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"1\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"posts\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"title\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Amet ratione est quas quia ut nemo.\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"description\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"null\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToShow\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToStore\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToUpdate\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToDelete\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's explain each piece of the response and see how we can impact or modify it."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"id"}]},{"type":"text","value":" field by default is the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"id"}]},{"type":"text","value":" of the response (your table primary key). You can modify this by defining your\nown "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$id"}]},{"type":"text","value":" property into the repository:"}]},{"type":"element","tag":"h3","props":{"id":"id"},"children":[{"type":"text","value":"ID"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository.php\n \npublic static string $id = 'uuid';\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $id "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'uuid'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The next piece is the resource type and this is the table name. However, you can always change that by using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$type"}]},{"type":"text","value":" property:"}]},{"type":"element","tag":"h3","props":{"id":"type"},"children":[{"type":"text","value":"Type"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository.php\n \npublic static string $type = 'articles';\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $type "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'articles'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Then, we have the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"attributes"}]},{"type":"text","value":" that are defined into the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fields"}]},{"type":"text","value":" method."}]},{"type":"element","tag":"h3","props":{"id":"meta"},"children":[{"type":"text","value":"Meta"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The last piece would be the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"meta"}]},{"type":"text","value":", where we have some authorizations over the entity. Authorizations are\ncomputed based on the policy methods. For example, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"authorizedToShow"}]},{"type":"text","value":" represents the response of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"show"}]},{"type":"text","value":" method\nfrom the related policy (PostPolicy in our example)."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can customize the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"meta"}]},{"type":"text","value":" by creating your own "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"resolveShowMeta"}]},{"type":"text","value":" method:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":" // PostRepository.php\n\n public function resolveShowMeta($request)\n {\n return [\n 'is_published' => $this->model()->isPublished(),\n ];\n }\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // PostRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" resolveShowMeta"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'is_published'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isPublished"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]}]}]},{"type":"element","tag":"alert","props":{},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Keep in mind that you always have access to the current model in your not static methods of the repository. In the case above, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":" $this->model()"}]},{"type":"text","value":" represents the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Post"}]},{"type":"text","value":" model with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"id=1"}]},{"type":"text","value":", because we're looking for the route: "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/1"}]},{"type":"text","value":"."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As we saw before, there are many ways to partially modify the serialized response for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"show"}]},{"type":"text","value":" request, although you\nare free to customize the entire response at once by defining:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository.php\n\npublic function serializeForShow(RestifyRequest $request): array\n{\n return [\n //\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" serializeForShow"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"custom-show"},"children":[{"type":"text","value":"Custom show"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can take full control over the show method:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function show(RestifyRequest $request, $repositoryId)\n{\n return response($this->model());\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" show"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $repositoryId)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" response"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"());\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"index-request"},"children":[{"type":"text","value":"Index request"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Since we already understood how the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"show"}]},{"type":"text","value":" method works, let's take a closer look over the endpoint that returns all\nyour entities and how it actually authorizes and serializes them."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This is a standard index "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"api/restify/posts"}]},{"type":"text","value":" response:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"meta\": {\n \"current_page\": 1,\n \"from\": 1,\n \"last_page\": 4,\n \"path\": \"http://restify-app.test/api/restify/posts\",\n \"per_page\": 15,\n \"to\": 15,\n \"total\": 50\n },\n \"links\": {\n \"first\": \"http://restify-app.test/api/restify/posts?page=1\",\n \"last\": \"http://restify-app.test/api/restify/posts?page=4\",\n \"prev\": null,\n \"next\": \"http://restify-app.test/api/restify/posts?page=2\"\n },\n \"data\": [\n {\n \"id\": \"91ad2f77-e30c-4090-a79c-49417540fdaa\",\n \"type\": \"posts\",\n \"attributes\": {\n \"title\": \"Nihil assumenda sit pariatur.\",\n \"description\": null\n },\n \"meta\": {\n \"authorizedToShow\": true,\n \"authorizedToStore\": true,\n \"authorizedToUpdate\": false,\n \"authorizedToDelete\": false\n }\n },\n ...\n }\n ]\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"current_page\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"from\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"last_page\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"4"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"path\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"http://restify-app.test/api/restify/posts\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"per_page\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"15"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"to\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"15"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"total\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"50\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"links\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"first\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"http://restify-app.test/api/restify/posts?page=1\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"last\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"http://restify-app.test/api/restify/posts?page=4\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"prev\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"next\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"http://restify-app.test/api/restify/posts?page=2\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"data\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"91ad2f77-e30c-4090-a79c-49417540fdaa\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"posts\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"title\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Nihil assumenda sit pariatur.\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"description\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"null\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToShow\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToStore\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToUpdate\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToDelete\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic"},"children":[{"type":"text","value":" ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":35},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"alert","props":{"type":"warning"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"From Restify 7+, the meta on index requests will not be loaded anymore due to performance reasons. See "},{"type":"element","tag":"a","props":{"href":"/api/repositories#index-item-meta"},"children":[{"type":"text","value":"index item meta"}]},{"type":"text","value":" for more details."}]}]},{"type":"element","tag":"h3","props":{"id":"index-main-meta"},"children":[{"type":"text","value":"Index main meta"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"First, we have the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"meta"}]},{"type":"text","value":" object. By default this includes pagination information, so your frontend could adapt\naccordingly."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you want to modify it, you can easily do so in the following repository:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function resolveIndexMainMeta(RestifyRequest $request, Collection $items, array $paginationMeta): ?array\n{\n return array_merge($paginationMeta, [\n 'published_items_count' => $items->filter->isPublished()->count(),\n ]);\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" resolveIndexMainMeta"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Collection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $items, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $paginationMeta)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ?array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" array_merge"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($paginationMeta, [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'published_items_count'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $items"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"filter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isPublished"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"count"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"resolveIndexMainMeta"}]},{"type":"text","value":" you get as arguments - the Restify request, a collection of items (matching the current\nrequest) and the original pagination metadata information."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the previous example we appended the property "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"published_items_count"}]},{"type":"text","value":", which counts published posts. Let's see this meta:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"meta\": {\n \"current_page\": 1,\n \"from\": 1,\n \"last_page\": 4,\n \"path\": \"http://restify-app.test/api/restify/posts\",\n \"per_page\": 15,\n \"to\": 15,\n \"total\": 50,\n \"published_items_count\": 10\n },\n ...\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"current_page\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"from\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"last_page\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"4"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"path\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"http://restify-app.test/api/restify/posts\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"per_page\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"15"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"to\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"15"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"total\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"50"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"published_items_count\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"10\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic"},"children":[{"type":"text","value":" ...\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can return "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"null"}]},{"type":"text","value":" if you don't need meta information."}]},{"type":"element","tag":"h3","props":{"id":"index-links"},"children":[{"type":"text","value":"Index links"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Next, we get an object called "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"links"}]},{"type":"text","value":". This one contains navigation links that could be used in the frontend table\ncomponent."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can customize it as well:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function resolveIndexLinks(RestifyRequest $request, Collection $items, array $links): ?array\n{\n return $links;\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" resolveIndexLinks"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Collection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $items, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $links)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ?array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $links;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can return "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"null"}]},{"type":"text","value":" if you don't need "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"links"}]},{"type":"text","value":" information to be displayed at all."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The next important property is the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"data"}]},{"type":"text","value":". Here we have listed items matching the request query, filtered by\nthe "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"show"}]},{"type":"text","value":" authorization policy. So in terms of seeing a model, you should be authorized by the model policy "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"show"}]},{"type":"text","value":" method to do\nso, and if not, it will be filtered out from this response."}]},{"type":"element","tag":"h3","props":{"id":"index-item-meta"},"children":[{"type":"text","value":"Index item meta"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In order to optimize requests, Restify 7+ will not provide any meta information about the repositories (including nested relationships) for index requests (ie / "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"posts"}]},{"type":"text","value":"). You can enable them by editing the config "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"restify.repositories.serialize_index_meta"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Or you can specifically enable them per request by adding the query param "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"withMeta=true"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/posts?withMeta=true\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/posts?withMeta=true\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This also applies for any related information."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The individual item object format is pretty much the same as we have for the "},{"type":"element","tag":"a","props":{"href":"#show-request"},"children":[{"type":"text","value":"show"}]},{"type":"text","value":". However, you can\nspecify a custom metadata for these items by using:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function resolveIndexMeta($request)\n{\n return [\n //...\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" resolveIndexMeta"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"custom-index"},"children":[{"type":"text","value":"Custom index"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You're also free to define your own index method from scratch:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function index(RestifyRequest $request)\n{\n return response(Post::all());\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" index"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" response"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"all"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"());\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"index-fields"},"children":[{"type":"text","value":"Index fields"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By default, attributes used to serialize the index item are the same from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fields"}]},{"type":"text","value":" method. Nonetheless, you can define individual fields for the index:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function fieldsForIndex(RestifyRequest $request): array\n{\n return [\n field('title'),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fieldsForIndex"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"alert","props":{},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Specific fields per request type could be defined for other requests. For example: "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fieldsForIndex"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fieldsForShow"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fieldsForStore"}]},{"type":"text","value":"\nand "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fieldsForUpdate"}]},{"type":"text","value":"."}]}]},{"type":"element","tag":"h2","props":{"id":"store-request"},"children":[{"type":"text","value":"Store request"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Store is a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"post"}]},{"type":"text","value":" request that is usually used to create/store entities. Let's take a closer look at the fields list for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PostRepository"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":" public function fields(RestifyRequest $request) \n {\n return [\n field('title'),\n \n field('description'),\n ];\n }\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request) \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'description'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Well, for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"store"}]},{"type":"text","value":" request, Restify will use the same fields and will assign the value from the request matching the\nattribute name."}]},{"type":"element","tag":"alert","props":{"type":"warning"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Fillable Restify will fill your model's attributes (defined in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fields"}]},{"type":"text","value":" method) even if they are listed as "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$guarded"}]},{"type":"text","value":"."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Here is the payload:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"title\": \"Beautiful day!\",\n \"description\": \"Comming soon...\"\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"title\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Beautiful day!\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"description\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Comming soon...\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Then we have the request:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"POST: http://restify-app.test/api/restify/posts\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"POST: http://restify-app.test/api/restify/posts\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify will store the new post and will return an "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"201"}]},{"type":"text","value":" (created) status, a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Location"}]},{"type":"text","value":" header containing the URL to\nthe newly created entity: "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/1"}]},{"type":"text","value":", and a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"data"}]},{"type":"text","value":" object with the newly created entity:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"data\": {\n \"id\": \"91ad557d-5780-4e4b-bedc-c35d400d8594\",\n \"type\": \"posts\",\n \"attributes\": {\n \"title\": \"Beautiful day!\",\n \"description\": \"Comming soon...\"\n },\n \"meta\": {\n \"authorizedToShow\": true,\n \"authorizedToStore\": true,\n \"authorizedToUpdate\": false,\n \"authorizedToDelete\": false\n }\n }\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"data\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"91ad557d-5780-4e4b-bedc-c35d400d8594\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"posts\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"title\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Beautiful day!\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"description\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Comming soon...\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToShow\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToStore\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToUpdate\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToDelete\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"store-validation"},"children":[{"type":"text","value":"Store Validation"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In a normal Laravel application, you have a store method into a controller and you have to validate fields by using this request:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"$request->validate([\n 'description' => 'required',\n])\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"validate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"([\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'description'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"])\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To do this in Restify, you have to apply the Field's "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"storingRules"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"field('description')->storingRules('required'),\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'description'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"storingRules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The rules list will be applied for the underlining field."}]},{"type":"element","tag":"h3","props":{"id":"custom-store"},"children":[{"type":"text","value":"Custom store"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can always take ownership over the store method by overwriting it in the repository:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository.php\n\npublic function store(RestifyRequest $request)\n{\n //\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" store"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"alert","props":{"type":"info"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The validation and authorization are done according to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"store"}]},{"type":"text","value":" method. This method is called only if you have access and the field's validation passes."}]}]},{"type":"element","tag":"h2","props":{"id":"update-request"},"children":[{"type":"text","value":"Update request"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Update request is similar with the "},{"type":"element","tag":"a","props":{"href":"#store-request"},"children":[{"type":"text","value":"store"}]},{"type":"text","value":". Taking the payload:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"description\": \"Ready to be published!\"\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"description\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Ready to be published!\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"And the endpoint:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"PUT: http://restify-app.test/api/restify/posts/1\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"PUT: http://restify-app.test/api/restify/posts/1\n"}]}]}]}]},{"type":"element","tag":"alert","props":{"type":"warning"},"children":[{"type":"text","value":" \n"},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As we saw before, we were denied by the policy from updating the operation ( \"authorizedToUpdate\":\nfalse). Now, we have to update the policy "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"update"}]},{"type":"text","value":" method to return "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"true"}]},{"type":"text","value":"."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The Restify response contains the http 200 status and the following response:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"data\": {\n \"id\": \"91ad557d-5780-4e4b-bedc-c35d400d8594\",\n \"type\": \"posts\",\n \"attributes\": {\n \"title\": \"Beautiful day!\",\n \"description\": \"Ready to be published!\"\n },\n \"meta\": {\n \"authorizedToShow\": true,\n \"authorizedToStore\": true,\n \"authorizedToUpdate\": true,\n \"authorizedToDelete\": false\n }\n }\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"data\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"91ad557d-5780-4e4b-bedc-c35d400d8594\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"posts\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"title\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Beautiful day!\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"description\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Ready to be published!\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToShow\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToStore\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToUpdate\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToDelete\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"update-validation"},"children":[{"type":"text","value":"Update validation"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To validate certain fields, we can use the Field's "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"updatingRules"}]},{"type":"text","value":" method:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"field('description')->updatingRules('required'),\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'description'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"updatingRules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"custom-update"},"children":[{"type":"text","value":"Custom update"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can override the update method entirely:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function update(RestifyRequest $request, $repositoryId)\n{\n //\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" update"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $repositoryId)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Keep in mind that this method is called only when the policy authorization and fields validation pass."}]},{"type":"element","tag":"h2","props":{"id":"delete-request"},"children":[{"type":"text","value":"Delete request"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This request is a simple one (don't forget to allow the policy):"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"DELETE: http://restify-app.test/api/restify/posts/1\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"DELETE: http://restify-app.test/api/restify/posts/1\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you're allowed to delete the resource, you will get back a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"204 No content"}]},{"type":"text","value":" response."}]},{"type":"element","tag":"h3","props":{"id":"custom-destroy"},"children":[{"type":"text","value":"Custom destroy"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can override the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"destory"}]},{"type":"text","value":" method:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function destroy(RestifyRequest $request, $repositoryId)\n{\n //\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" destroy"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $repositoryId)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"soft-deletion"},"children":[{"type":"text","value":"Soft deletion"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now, Restify uses the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"->delete()"}]},{"type":"text","value":" eloquent method to delete the model. So if you're using soft deletion, it will softly delete it."}]},{"type":"element","tag":"h2","props":{"id":"store-bulk-flow"},"children":[{"type":"text","value":"Store bulk flow"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The bulk store means that you can create many entries at once. For example, if you have a list of invoice entries,\nusually you have to create those in a single Database Transaction. That's why we have this way to create so many entries at\nonce:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"POST: /api/restify/posts/bulk\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"POST: /api/restify/posts/bulk\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"With the payload:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"[\n {\n \"title\": \"Post 1\",\n \"description\": \"Description post 1\"\n },\n {\n \"title\": \"Post 2\",\n \"description\": \"Description post 2\"\n }\n]\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"[\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"title\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Post 1\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"description\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Description post 1\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"title\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Post 2\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"description\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Description post 2\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"bulk-store-field-validations"},"children":[{"type":"text","value":"Bulk store field validations"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Similar with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"store"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"update"}]},{"type":"text","value":" methods, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"bulk"}]},{"type":"text","value":" rules has their own field rule definition:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"->storeBulkRules('required', function () {}, Rule::in('posts:id'))\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"storeBulkRules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" () {}, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Rule"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"in"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'posts:id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"))\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The validation rules will be merged with the rules provided into the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rules()"}]},{"type":"text","value":" method. The validation will be performed\nby using a native Laravel validator, so you will have exactly the same experience. The validation "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"messages"}]},{"type":"text","value":" could still\nbe used as usual."}]},{"type":"element","tag":"h3","props":{"id":"unauthorize-to-bulk-store"},"children":[{"type":"text","value":"Unauthorize to bulk store"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PostPolicy"}]},{"type":"text","value":" you can define a method against the bulk store actions:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"/**\n * Determine whether the user can create multiple models at once.\n *\n * @param User $user\n * @return mixed\n */\npublic function storeBulk(User $user)\n{\n return true;\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"/**\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * Determine whether the user can create multiple models at once.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" *\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $user\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" mixed\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" */\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" storeBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"bulk-after-store"},"children":[{"type":"text","value":"Bulk after store"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"After storing an entity, the repository will call the static "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"storedBulk"}]},{"type":"text","value":" method from the repository, which you can\noverride:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public static function storedBulk(Collection $repositories, $request)\n{\n //\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" storedBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Collection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $repositories, $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"update-bulk-flow"},"children":[{"type":"text","value":"Update bulk flow"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Like store bulk, update bulk uses a DB transaction to perform the action. This ensures that if any entry fails, none will be updated."}]},{"type":"element","tag":"h3","props":{"id":"bulk-update-field-validations"},"children":[{"type":"text","value":"Bulk update field validations"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"->updateBulkRules('required', Rule::in('posts:id'))\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"updateBulkRules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Rule"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"in"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'posts:id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"))\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"bulk-update-payload"},"children":[{"type":"text","value":"Bulk update Payload"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The payload for a bulk update should contain an array of objects and each object should contain an "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"id"}]},{"type":"text","value":" key. Based on this,\nthe Laravel Restify will find the entity:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"POST: /api/restify/posts/bulk/update\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"POST: /api/restify/posts/bulk/update\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Payload:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"[\n {\n \"id\": 1,\n \"title\": \"First post\"\n },\n {\n \"id\": 2,\n \"title\": \"Second post\"\n }\n]\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"[\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"title\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"First post\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"2"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"title\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Second post\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"bulk-delete-flow"},"children":[{"type":"text","value":"Bulk delete flow"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The payload for a bulk delete should contain an array of primary keys for the models that you want to delete:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"[\n 1, 10, 15\n]\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"[\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" 1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"10"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"15\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"These models will be resolved from the database and checked for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"deleteBulk"}]},{"type":"text","value":" policy permission. If any of the models are not allowed to be deleted, no entries will be deleted."}]},{"type":"element","tag":"h2","props":{"id":"force-eager-loading"},"children":[{"type":"text","value":"Force eager loading"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Although Laravel Restify "},{"type":"element","tag":"a","props":{"href":"/search/"},"children":[{"type":"text","value":"provides eager"}]},{"type":"text","value":" loading based on the query "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"related"}]},{"type":"text","value":" property, you may want to force\neager load a relationship when using it in fields:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// UserRepository.php\n\npublic static $withs = ['posts'];\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// UserRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $withs "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"];\n"}]}]}]}]},{"type":"element","tag":"alert","props":{"type":"warning"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"withs"}]},{"type":"text","value":" is not a typo. Laravel uses the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" property on models, on repositories we use "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$withs"}]},{"type":"text","value":", it's not a typo."}]}]},{"type":"element","tag":"h2","props":{"id":"group-by"},"children":[{"type":"text","value":"Group by"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The group by filter is useful when you want to group the results by a certain column."}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PostRepository extends Repository\n{\n public static array $groupBy = ['user_id'];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $groupBy "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user_id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"repository-collections-and-transforms"},"children":[{"type":"text","value":"Repository Collections and Transforms"}]},{"type":"element","tag":"h3","props":{"id":"index-collection-transform"},"children":[{"type":"text","value":"Index Collection Transform"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can transform the collection of models before they are serialized for the index response:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function indexCollection(RestifyRequest $request, Collection $items): Collection\n{\n // Transform the entire collection\n return $items->filter(function ($post) {\n return $post->published_at <= now();\n });\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" indexCollection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Collection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $items)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Collection\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Transform the entire collection\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $items"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"filter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($post) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"published_at "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"<="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" now"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This method is called after the query is executed but before authorization and serialization."}]},{"type":"element","tag":"h2","props":{"id":"repository-labels-and-identifiers"},"children":[{"type":"text","value":"Repository Labels and Identifiers"}]},{"type":"element","tag":"h3","props":{"id":"custom-repository-label"},"children":[{"type":"text","value":"Custom Repository Label"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can customize how the repository appears in API documentation and admin interfaces:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PostRepository extends Repository\n{\n public static string $label = 'Blog Articles';\n \n // Or dynamically\n public static function label(): string\n {\n return __('repository.posts');\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $label "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'Blog Articles'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Or dynamically\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" label"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" string\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" __"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'repository.posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"title-field"},"children":[{"type":"text","value":"Title Field"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Specify which field should be used as the display title for the resource:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PostRepository extends Repository\n{\n public static string $title = 'title'; // Default is 'id'\n \n public function title(): string\n {\n return $this->title ?: $this->id;\n }\n \n public function subtitle(): ?string\n {\n return \"By {$this->author->name}\";\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $title "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"; "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Default is 'id'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" title"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" string\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"title "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"?:"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"id;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" subtitle"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ?string\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"By {"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"author"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"name"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"scout-integration"},"children":[{"type":"text","value":"Scout Integration"}]},{"type":"element","tag":"h3","props":{"id":"scout-configuration"},"children":[{"type":"text","value":"Scout Configuration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When your model uses Laravel Scout, configure search behavior:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PostRepository extends Repository\n{\n // Number of results for global search\n public static int $globalSearchResults = 5;\n \n // Number of results for Scout search\n public static int $scoutSearchResults = 200;\n \n // Whether this repository should appear in global search\n public static bool $globallySearchable = true;\n \n public static function usesScout(): bool\n {\n return true; // Detected automatically\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Number of results for global search\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" int"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $globalSearchResults "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" 5"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Number of results for Scout search\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" int"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $scoutSearchResults "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" 200"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Whether this repository should appear in global search\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $globallySearchable "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" usesScout"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"; "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Detected automatically\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"serialization-control"},"children":[{"type":"text","value":"Serialization Control"}]},{"type":"element","tag":"h3","props":{"id":"custom-serialization"},"children":[{"type":"text","value":"Custom Serialization"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Override serialization methods for complete control:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function serializeForIndex(RestifyRequest $request): array\n{\n return [\n 'id' => $this->id,\n 'title' => $this->title,\n 'excerpt' => Str::limit($this->content, 100),\n 'meta' => [\n 'word_count' => str_word_count(strip_tags($this->content))\n ]\n ];\n}\n\npublic function serializeForShow(RestifyRequest $request): array\n{\n $data = parent::serializeForShow($request);\n \n // Add custom data\n $data['computed'] = [\n 'reading_time' => ceil(str_word_count($this->content) / 200),\n 'related_posts' => $this->getRelatedPosts(3)\n ];\n \n return $data;\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" serializeForIndex"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"id,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"title,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'excerpt'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Str"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"limit"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"content, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"100"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'meta'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'word_count'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" str_word_count"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"strip_tags"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"content))\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" serializeForShow"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $data "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" parent::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"serializeForShow"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Add custom data\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $data["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'computed'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"] "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'reading_time'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" ceil"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"str_word_count"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"content) "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"/"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" 200"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'related_posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"getRelatedPosts"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"3"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $data;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"restifyjs-integration"},"children":[{"type":"text","value":"RestifyJS Integration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Configure how the repository appears in RestifyJS:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function restifyjsSerialize(RestifyRequest $request): array\n{\n return [\n 'uriKey' => static::uriKey(),\n 'related' => static::collectRelated(),\n 'sort' => static::collectFilters('sortables'),\n 'match' => static::collectFilters('matches'), \n 'searchables' => static::collectFilters('searchables'),\n 'actions' => $this->resolveActions($request)->values(),\n 'getters' => $this->resolveGetters($request)->values(),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" restifyjsSerialize"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'uriKey'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"uriKey"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'related'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"collectRelated"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'sort'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"collectFilters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'sortables'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'match'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"collectFilters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'matches'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"), \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'searchables'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"collectFilters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'searchables'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'actions'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"resolveActions"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"values"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'getters'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"resolveGetters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"values"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"repository-uri-and-routing"},"children":[{"type":"text","value":"Repository URI and Routing"}]},{"type":"element","tag":"h3","props":{"id":"custom-uri-key"},"children":[{"type":"text","value":"Custom URI Key"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Override the default URI generation:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PostRepository extends Repository\n{\n public static string $uriKey = 'articles'; // Instead of 'posts'\n \n // Or dynamically\n public static function uriKey(): string\n {\n return config('app.locale') === 'es' ? 'articulos' : 'articles';\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $uriKey "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'articles'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"; "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Instead of 'posts'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Or dynamically\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" uriKey"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" string\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" config"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'app.locale'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"==="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'es'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'articulos'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" :"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'articles'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"custom-routes"},"children":[{"type":"text","value":"Custom Routes"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Define custom routes within the repository context:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public static function routes(Router $router, array $attributes, $wrap = true)\n{\n $router->group($attributes, function () use ($router) {\n $router->get('trending', TrendingPostsController::class);\n $router->post('{post}/publish', [PostController::class, 'publish']);\n $router->get('stats', [PostStatsController::class, 'index']);\n });\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" routes"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Router"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $router, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $attributes, $wrap "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $router"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"group"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($attributes, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" () "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($router) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $router"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'trending'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"TrendingPostsController"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $router"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'{post}/publish'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"PostController"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'publish'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $router"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'stats'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"PostStatsController"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"These routes will be available at:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"GET /api/restify/posts/trending"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"POST /api/restify/posts/{post}/publish"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"GET /api/restify/posts/stats"}]}]}]},{"type":"element","tag":"h2","props":{"id":"middleware-and-security"},"children":[{"type":"text","value":"Middleware and Security"}]},{"type":"element","tag":"h3","props":{"id":"repository-middleware"},"children":[{"type":"text","value":"Repository Middleware"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Apply middleware to all repository routes:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PostRepository extends Repository\n{\n public static array $middleware = [\n 'throttle:60,1',\n 'verified',\n CustomMiddleware::class,\n ];\n \n public static function collectMiddlewares(RestifyRequest $request): Collection\n {\n $middleware = collect(static::$middleware);\n \n // Add conditional middleware\n if ($request->user()?->isGuest()) {\n $middleware->push('guest');\n }\n \n return $middleware;\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $middleware "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'throttle:60,1'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'verified'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" CustomMiddleware"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" collectMiddlewares"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Collection\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $middleware "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" collect"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"static::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$middleware);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Add conditional middleware\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"?->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isGuest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $middleware"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"push"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'guest'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $middleware;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"mcp-integration"},"children":[{"type":"text","value":"MCP Integration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Laravel Restify provides first-class support for Model Context Protocol (MCP), allowing AI agents to efficiently interact with your APIs. You can define MCP-specific field methods to optimize token usage and provide tailored data for AI consumption."}]},{"type":"element","tag":"h3","props":{"id":"mcp-field-methods"},"children":[{"type":"text","value":"MCP Field Methods"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"MCP field methods follow the same pattern as regular field methods but are prefixed with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fieldsForMcp"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PostRepository extends Repository\n{\n // Regular fields for human consumption\n public function fields(RestifyRequest $request): array\n {\n return [\n field('title'),\n field('content'),\n field('excerpt'),\n field('meta_description'),\n field('tags'),\n field('author_id'),\n field('published_at'),\n field('created_at'),\n field('updated_at'),\n ];\n }\n \n // Optimized fields for AI index requests (saves 60-70% tokens)\n public function fieldsForMcpIndex(RestifyRequest $request): array\n {\n return [\n field('id'),\n field('title'),\n field('excerpt'),\n field('published_at'),\n ];\n }\n \n // Focused fields for AI detail views (saves 40-50% tokens)\n public function fieldsForMcpShow(RestifyRequest $request): array\n {\n return [\n field('title'),\n field('content'),\n field('author', fn() => $this->author->name),\n field('tags'),\n field('published_at'),\n ];\n }\n \n // Fields AI agents can use for creation\n public function fieldsForMcpStore(RestifyRequest $request): array\n {\n return [\n field('title')->required(),\n field('content')->required(),\n field('excerpt'),\n field('tags'),\n ];\n }\n \n // Fields AI agents can modify\n public function fieldsForMcpUpdate(RestifyRequest $request): array\n {\n return [\n field('title'),\n field('content'),\n field('excerpt'),\n field('tags'),\n ];\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Regular fields for human consumption\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'content'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'excerpt'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'meta_description'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'author_id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'published_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'created_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'updated_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Optimized fields for AI index requests (saves 60-70% tokens)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fieldsForMcpIndex"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'excerpt'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'published_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Focused fields for AI detail views (saves 40-50% tokens)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fieldsForMcpShow"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":35},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'content'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":36},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'author'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"() => "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"author"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"name),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":37},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":38},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'published_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":39},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":40},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":41},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":42},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Fields AI agents can use for creation\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":43},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fieldsForMcpStore"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":44},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":45},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":46},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":47},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'content'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":48},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'excerpt'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":49},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":50},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":51},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":52},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":53},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Fields AI agents can modify\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":54},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fieldsForMcpUpdate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":55},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":56},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":57},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":58},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'content'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":59},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'excerpt'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":60},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":61},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":62},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":63},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"mcp-bulk-operations"},"children":[{"type":"text","value":"MCP Bulk Operations"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// Efficient AI bulk creation\npublic function fieldsForMcpStoreBulk(RestifyRequest $request): array\n{\n return [\n field('title')->required(),\n field('content')->required(),\n field('status')->value('draft'),\n ];\n}\n\n// Efficient AI bulk updates\npublic function fieldsForMcpUpdateBulk(RestifyRequest $request): array\n{\n return [\n field('title'),\n field('status'),\n field('published_at'),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Efficient AI bulk creation\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fieldsForMcpStoreBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'content'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'status'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'draft'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Efficient AI bulk updates\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fieldsForMcpUpdateBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'status'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'published_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"mcp-getters"},"children":[{"type":"text","value":"MCP Getters"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Provide analytical and computed fields specifically for AI consumption:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function fieldsForMcpGetter(RestifyRequest $request): array\n{\n return [\n field('word_count', fn() => str_word_count(strip_tags($this->content))),\n field('reading_time', fn() => ceil(str_word_count(strip_tags($this->content)) / 200)),\n field('sentiment_score', fn() => $this->calculateSentiment()),\n field('related_topics', fn() => $this->extractTopics()),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fieldsForMcpGetter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'word_count'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"() => "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"str_word_count"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"strip_tags"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"content))),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'reading_time'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"() => "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"ceil"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"str_word_count"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"strip_tags"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"content)) "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"/"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" 200"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'sentiment_score'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"() => "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"calculateSentiment"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'related_topics'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"() => "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"extractTopics"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"field-priority-for-mcp"},"children":[{"type":"text","value":"Field Priority for MCP"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When an MCP request is made, Restify follows this priority order:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"MCP-specific methods"}]},{"type":"text","value":" ("},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fieldsForMcpIndex"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fieldsForMcpShow"}]},{"type":"text","value":", etc.)"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Request-specific methods"}]},{"type":"text","value":" ("},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fieldsForIndex"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fieldsForShow"}]},{"type":"text","value":", etc.)"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Default fields method"}]},{"type":"text","value":" ("},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fields"}]},{"type":"text","value":")"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This allows you to provide optimized field sets for AI agents while maintaining full functionality for human users."}]},{"type":"element","tag":"h2","props":{"id":"repository-lifecycle-events"},"children":[{"type":"text","value":"Repository Lifecycle Events"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Laravel Restify provides several lifecycle hooks that allow you to perform actions at specific points during the repository's operations."}]},{"type":"element","tag":"h3","props":{"id":"single-resource-events"},"children":[{"type":"text","value":"Single Resource Events"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PostRepository extends Repository\n{\n // Called after a single resource is successfully stored\n public static function stored($model, $request)\n {\n // Log the creation\n Log::info(\"Post created: {$model->title}\");\n \n // Send notifications\n NotificationService::notifyNewPost($model);\n \n // Update caches\n cache()->forget('recent_posts');\n }\n \n // Called after a single resource is successfully updated\n public static function updated($model, $request)\n {\n // Log the update\n Log::info(\"Post updated: {$model->title}\");\n \n // Clear related caches\n cache()->forget(\"post_{$model->id}\");\n \n // Index for search\n $model->searchable();\n }\n \n // Called after a single resource is successfully deleted\n public static function deleted($status, $request)\n {\n // Log deletion\n Log::info(\"Post deleted, status: {$status}\");\n \n // Clean up related data\n if ($status) {\n cache()->flush();\n }\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Called after a single resource is successfully stored\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" stored"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($model, $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Log the creation\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Log"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"info"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Post created: {"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"title"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Send notifications\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" NotificationService"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"notifyNewPost"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($model);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Update caches\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" cache"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"forget"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'recent_posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Called after a single resource is successfully updated\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" updated"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($model, $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Log the update\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Log"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"info"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Post updated: {"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"title"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Clear related caches\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" cache"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"forget"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"post_{"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"id"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Index for search\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Called after a single resource is successfully deleted\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" deleted"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($status, $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Log deletion\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Log"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"info"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Post deleted, status: {"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$status"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":35},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Clean up related data\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":36},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($status) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":37},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" cache"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"flush"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":38},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":39},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":40},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"bulk-operation-events"},"children":[{"type":"text","value":"Bulk Operation Events"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PostRepository extends Repository\n{\n // Called after bulk store operation completes\n public static function storedBulk(Collection $models, $request)\n {\n Log::info(\"Bulk created {$models->count()} posts\");\n \n // Bulk index for search\n $models->searchable();\n \n // Send bulk notifications\n NotificationService::notifyBulkCreation($models);\n }\n \n // Called after bulk update operation completes \n public static function updatedBulk(Collection $models, $request)\n {\n Log::info(\"Bulk updated {$models->count()} posts\");\n \n // Clear caches\n cache()->tags(['posts'])->flush();\n }\n \n // Called after bulk save operation (both store and update bulk)\n public static function savedBulk(Collection $models, $request)\n {\n // Common logic for all bulk save operations\n SearchIndexService::updateBatch($models);\n }\n \n // Called after bulk delete operation completes\n public static function deletedBulk(Collection $models, $request)\n {\n Log::info(\"Bulk deleted {$models->count()} posts\");\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Called after bulk store operation completes\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" storedBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Collection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $models, $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Log"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"info"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Bulk created {"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$models"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"count"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"()} posts\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Bulk index for search\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $models"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Send bulk notifications\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" NotificationService"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"notifyBulkCreation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($models);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Called after bulk update operation completes \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" updatedBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Collection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $models, $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Log"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"info"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Bulk updated {"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$models"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"count"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"()} posts\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Clear caches\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" cache"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"tags"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"])"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"flush"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Called after bulk save operation (both store and update bulk)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" savedBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Collection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $models, $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Common logic for all bulk save operations\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" SearchIndexService"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"updateBatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($models);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Called after bulk delete operation completes\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" deletedBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Collection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $models, $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Log"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"info"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Bulk deleted {"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$models"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"count"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"()} posts\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":35},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":36},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"authorization-methods"},"children":[{"type":"text","value":"Authorization Methods"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Override authorization logic for fine-grained control:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PostRepository extends Repository\n{\n // Control if user can view the resource\n public function allowToShow($request): self\n {\n if (!$this->model()->isPublished() && !$request->user()->isAdmin()) {\n throw new AuthorizationException('Cannot view unpublished post');\n }\n \n return $this;\n }\n \n // Control if user can create resources\n public function allowToStore(RestifyRequest $request, $payload = null): self\n {\n if ($request->user()->posts()->today()->count() >= 10) {\n throw new AuthorizationException('Daily post limit reached');\n }\n \n return $this;\n }\n \n // Control if user can update this resource\n public function allowToUpdate(RestifyRequest $request, $payload = null): self\n {\n if ($this->model()->isPublished() && !$request->user()->isEditor()) {\n throw new AuthorizationException('Cannot edit published posts');\n }\n \n return $this;\n }\n \n // Control if user can delete this resource\n public function allowToDestroy(RestifyRequest $request): self\n {\n if ($this->model()->comments()->exists()) {\n throw new AuthorizationException('Cannot delete post with comments');\n }\n \n return $this;\n }\n \n // Control bulk operations\n public function allowToBulkStore(RestifyRequest $request, $payload = null, $row = null): self\n {\n if (count($payload) > 100) {\n throw new AuthorizationException('Cannot create more than 100 posts at once');\n }\n \n return $this;\n }\n \n public function allowToUpdateBulk(RestifyRequest $request, $payload = null): self\n {\n // Custom bulk update authorization\n return $this;\n }\n \n public function allowToDestroyBulk(RestifyRequest $request, $payload = null): self\n {\n // Custom bulk delete authorization \n return $this;\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Control if user can view the resource\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" allowToShow"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" self\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isPublished"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"() "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"&&"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" !"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isAdmin"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" throw"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" AuthorizationException"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'Cannot view unpublished post'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Control if user can create resources\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" allowToStore"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $payload "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" self\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"posts"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"today"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"count"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"() "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":">="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" 10"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":") {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" throw"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" AuthorizationException"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'Daily post limit reached'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Control if user can update this resource\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" allowToUpdate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $payload "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" self\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isPublished"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"() "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"&&"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" !"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isEditor"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" throw"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" AuthorizationException"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'Cannot edit published posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Control if user can delete this resource\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" allowToDestroy"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" self\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":35},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":36},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"comments"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"exists"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":37},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" throw"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" AuthorizationException"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'Cannot delete post with comments'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":38},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":39},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":40},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":41},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":42},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":43},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Control bulk operations\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":44},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" allowToBulkStore"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $payload "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", $row "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" self\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":45},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":46},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"count"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($payload) "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":">"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" 100"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":") {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":47},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" throw"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" AuthorizationException"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'Cannot create more than 100 posts at once'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":48},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":49},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":50},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":51},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":52},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":53},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" allowToUpdateBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $payload "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" self\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":54},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":55},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Custom bulk update authorization\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":56},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":57},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":58},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":59},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" allowToDestroyBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $payload "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" self\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":60},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":61},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Custom bulk delete authorization \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":62},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":63},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":64},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"relationship-authorization"},"children":[{"type":"text","value":"Relationship Authorization"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PostRepository extends Repository\n{\n public function allowToAttach(RestifyRequest $request, Collection $attachers): self\n {\n // Validate attaching related models\n $methodGuesser = 'attach'.Str::studly($request->relatedRepository);\n \n $attachers->each(function ($model) use ($request, $methodGuesser) {\n $this->authorizeToAttach($request, $methodGuesser, $model);\n });\n \n return $this;\n }\n \n public function allowToSync(RestifyRequest $request, Collection $attachers): self\n {\n // Validate syncing relationships\n return $this;\n }\n \n public function allowToDetach(RestifyRequest $request, Collection $attachers): self\n {\n // Validate detaching related models\n return $this;\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" allowToAttach"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Collection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $attachers)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" self\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Validate attaching related models\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $methodGuesser "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'attach'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Str"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"studly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"relatedRepository);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $attachers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"each"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($model) "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($request, $methodGuesser) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"authorizeToAttach"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request, $methodGuesser, $model);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" allowToSync"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Collection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $attachers)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" self\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Validate syncing relationships\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" allowToDetach"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Collection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $attachers)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" self\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Validate detaching related models\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"event-usage-examples"},"children":[{"type":"text","value":"Event Usage Examples"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"These lifecycle methods are perfect for:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Logging and Auditing"}]},{"type":"text","value":": Track all changes to your resources"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Cache Management"}]},{"type":"text","value":": Clear or update caches when data changes"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Search Indexing"}]},{"type":"text","value":": Update search indexes after modifications"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Notifications"}]},{"type":"text","value":": Send emails, push notifications, or webhooks"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Data Validation"}]},{"type":"text","value":": Perform complex business rule validation"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"External API Integration"}]},{"type":"text","value":": Sync changes with third-party services"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"File Cleanup"}]},{"type":"text","value":": Remove associated files when records are deleted"}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"quick-start","depth":2,"text":"Quick start"},{"id":"defining-repositories","depth":2,"text":"Defining Repositories","children":[{"id":"model-repository-discovery-conventions","depth":3,"text":"Model & Repository Discovery Conventions"},{"id":"actions-handled-by-the-repository","depth":3,"text":"Actions handled by the Repository"}]},{"id":"model-definition","depth":2,"text":"Model Definition","children":[{"id":"_1-modern-approach-php-attributes-recommended","depth":3,"text":"1. Modern Approach: PHP Attributes (Recommended)"},{"id":"_2-traditional-approach-static-property","depth":3,"text":"2. Traditional Approach: Static Property"},{"id":"_3-auto-guessing-fallback","depth":3,"text":"3. Auto-Guessing (Fallback)"}]},{"id":"public-repository","depth":2,"text":"Public repository","children":[{"id":"public-gate","depth":3,"text":"Public gate"},{"id":"public-policies","depth":3,"text":"Public Policies"}]},{"id":"repository-key","depth":2,"text":"Repository key"},{"id":"fields","depth":2,"text":"Fields"},{"id":"show-request","depth":2,"text":"Show request","children":[{"id":"id","depth":3,"text":"ID"},{"id":"type","depth":3,"text":"Type"},{"id":"meta","depth":3,"text":"Meta"},{"id":"custom-show","depth":3,"text":"Custom show"}]},{"id":"index-request","depth":2,"text":"Index request","children":[{"id":"index-main-meta","depth":3,"text":"Index main meta"},{"id":"index-links","depth":3,"text":"Index links"},{"id":"index-item-meta","depth":3,"text":"Index item meta"},{"id":"custom-index","depth":3,"text":"Custom index"},{"id":"index-fields","depth":3,"text":"Index fields"}]},{"id":"store-request","depth":2,"text":"Store request","children":[{"id":"store-validation","depth":3,"text":"Store Validation"},{"id":"custom-store","depth":3,"text":"Custom store"}]},{"id":"update-request","depth":2,"text":"Update request","children":[{"id":"update-validation","depth":3,"text":"Update validation"},{"id":"custom-update","depth":3,"text":"Custom update"}]},{"id":"delete-request","depth":2,"text":"Delete request","children":[{"id":"custom-destroy","depth":3,"text":"Custom destroy"},{"id":"soft-deletion","depth":3,"text":"Soft deletion"}]},{"id":"store-bulk-flow","depth":2,"text":"Store bulk flow","children":[{"id":"bulk-store-field-validations","depth":3,"text":"Bulk store field validations"},{"id":"unauthorize-to-bulk-store","depth":3,"text":"Unauthorize to bulk store"},{"id":"bulk-after-store","depth":3,"text":"Bulk after store"}]},{"id":"update-bulk-flow","depth":2,"text":"Update bulk flow","children":[{"id":"bulk-update-field-validations","depth":3,"text":"Bulk update field validations"},{"id":"bulk-update-payload","depth":3,"text":"Bulk update Payload"}]},{"id":"bulk-delete-flow","depth":2,"text":"Bulk delete flow"},{"id":"force-eager-loading","depth":2,"text":"Force eager loading"},{"id":"group-by","depth":2,"text":"Group by"},{"id":"repository-collections-and-transforms","depth":2,"text":"Repository Collections and Transforms","children":[{"id":"index-collection-transform","depth":3,"text":"Index Collection Transform"}]},{"id":"repository-labels-and-identifiers","depth":2,"text":"Repository Labels and Identifiers","children":[{"id":"custom-repository-label","depth":3,"text":"Custom Repository Label"},{"id":"title-field","depth":3,"text":"Title Field"}]},{"id":"scout-integration","depth":2,"text":"Scout Integration","children":[{"id":"scout-configuration","depth":3,"text":"Scout Configuration"}]},{"id":"serialization-control","depth":2,"text":"Serialization Control","children":[{"id":"custom-serialization","depth":3,"text":"Custom Serialization"},{"id":"restifyjs-integration","depth":3,"text":"RestifyJS Integration"}]},{"id":"repository-uri-and-routing","depth":2,"text":"Repository URI and Routing","children":[{"id":"custom-uri-key","depth":3,"text":"Custom URI Key"},{"id":"custom-routes","depth":3,"text":"Custom Routes"}]},{"id":"middleware-and-security","depth":2,"text":"Middleware and Security","children":[{"id":"repository-middleware","depth":3,"text":"Repository Middleware"}]},{"id":"mcp-integration","depth":2,"text":"MCP Integration","children":[{"id":"mcp-field-methods","depth":3,"text":"MCP Field Methods"},{"id":"mcp-bulk-operations","depth":3,"text":"MCP Bulk Operations"},{"id":"mcp-getters","depth":3,"text":"MCP Getters"},{"id":"field-priority-for-mcp","depth":3,"text":"Field Priority for MCP"}]},{"id":"repository-lifecycle-events","depth":2,"text":"Repository Lifecycle Events","children":[{"id":"single-resource-events","depth":3,"text":"Single Resource Events"},{"id":"bulk-operation-events","depth":3,"text":"Bulk Operation Events"},{"id":"authorization-methods","depth":3,"text":"Authorization Methods"},{"id":"relationship-authorization","depth":3,"text":"Relationship Authorization"},{"id":"event-usage-examples","depth":3,"text":"Event Usage Examples"}]}]}},"_type":"markdown","_id":"content:api:repositories.md","_source":"content","_file":"api/repositories.md","_stem":"api/repositories","_extension":"md"},"hash":"gvY7hwcX7I"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/api/repository-generation.md b/docs-v3/.nuxt/content-cache/parsed/content/api/repository-generation.md new file mode 100644 index 000000000..1eb84f332 --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/api/repository-generation.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/api/repository-generation","_dir":"api","_draft":false,"_partial":false,"_locale":"","title":"Repository Generation","description":"Laravel Restify provides powerful repository generation commands for both individual and bulk repository creation, with intelligent path detection and automatic relationship generation.","menuTitle":"Repository Generation","category":"API","position":11,"body":{"type":"root","children":[{"type":"element","tag":"h1","props":{"id":"repository-generation"},"children":[{"type":"text","value":"Repository Generation"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Laravel Restify provides powerful repository generation commands for both individual and bulk repository creation, with intelligent path detection and automatic relationship generation."}]},{"type":"element","tag":"h2","props":{"id":"intelligent-path-detection"},"children":[{"type":"text","value":"Intelligent Path Detection"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The repository generator now automatically detects your project's repository organization pattern and creates new repositories in the appropriate location."}]},{"type":"element","tag":"h3","props":{"id":"supported-patterns"},"children":[{"type":"text","value":"Supported Patterns"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Grouped by Model"}]},{"type":"text","value":" - "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"App/Restify/Users/UserRepository.php"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Domain Driven"}]},{"type":"text","value":" - "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"App/Restify/Domains/User/UserRepository.php"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Module Based"}]},{"type":"text","value":" - "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"App/Restify/Admin/UserRepository.php"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Flat Structure"}]},{"type":"text","value":" - "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"App/Restify/UserRepository.php"}]},{"type":"text","value":" (default)"}]}]},{"type":"element","tag":"h3","props":{"id":"how-it-works"},"children":[{"type":"text","value":"How It Works"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When you run:"}]},{"type":"element","tag":"pre","props":{"code":"php artisan restify:repository PostRepository\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" PostRepository\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The command will:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"First check the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"app/Restify"}]},{"type":"text","value":" directory for existing repositories"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"If none found in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"app/Restify"}]},{"type":"text","value":", scan the entire "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"app/"}]},{"type":"text","value":" directory"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Analyze the location patterns of found repositories"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Apply the same pattern to the new repository"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Display the detected pattern and target location"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This prioritization ensures that repositories in the standard "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"App/Restify"}]},{"type":"text","value":" location are preferred over other locations."}]},{"type":"element","tag":"h3","props":{"id":"example-output"},"children":[{"type":"text","value":"Example Output"}]},{"type":"element","tag":"pre","props":{"code":"$ php artisan restify:repository PostRepository\nDetected repository pattern: grouped-by-model\nRepository will be created in: App\\Restify\nRepository created successfully.\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" PostRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"Detected"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" pattern:"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" grouped-by-model\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"Repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" will"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" be"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" created"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" in:"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" App"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\R"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"estify\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"Repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" created"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" successfully.\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If your project has "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"UserRepository"}]},{"type":"text","value":" in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"App/Restify/Users/"}]},{"type":"text","value":", the new "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PostRepository"}]},{"type":"text","value":" will be created in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"App/Restify/Posts/"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h2","props":{"id":"automatic-relationship-detection"},"children":[{"type":"text","value":"Automatic Relationship Detection"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When you run the repository generation command:"}]},{"type":"element","tag":"pre","props":{"code":"php artisan restify:repository PostRepository\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" PostRepository\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The command will:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Analyze your database schema for foreign key columns"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Generate regular fields in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fields()"}]},{"type":"text","value":" method"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Generate BelongsTo and HasMany relationships in a separate "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"static include()"}]},{"type":"text","value":" method"}]}]},{"type":"element","tag":"h2","props":{"id":"generated-structure"},"children":[{"type":"text","value":"Generated Structure"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"posts"}]},{"type":"text","value":" table with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"user_id"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"category_id"}]},{"type":"text","value":" columns, and a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"comments"}]},{"type":"text","value":" table with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"post_id"}]},{"type":"text","value":", the generated repository will look like:"}]},{"type":"element","tag":"pre","props":{"code":"required(),\n field('content')->textarea()->required(),\n field('created_at')->datetime()->readonly(),\n field('updated_at')->datetime()->readonly(),\n ];\n }\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'content'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"textarea"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'created_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"datetime"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'updated_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"datetime"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"how-it-works-1"},"children":[{"type":"text","value":"How It Works"}]},{"type":"element","tag":"h3","props":{"id":"belongsto-detection"},"children":[{"type":"text","value":"BelongsTo Detection"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Columns ending with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_id"}]},{"type":"text","value":" (except "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"id"}]},{"type":"text","value":" itself) are detected as BelongsTo relationships"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"The relationship name is derived from the column name (e.g., "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"user_id"}]},{"type":"text","value":" → "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"user"}]},{"type":"text","value":")"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"The command attempts to find the related repository class automatically"}]}]},{"type":"element","tag":"h3","props":{"id":"hasmany-detection"},"children":[{"type":"text","value":"HasMany Detection"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"The command scans other tables for foreign keys pointing to the current model"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"For example, if "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"comments"}]},{"type":"text","value":" table has "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"post_id"}]},{"type":"text","value":", it generates "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"HasMany::make('comments')"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Repository classes are automatically resolved when possible"}]}]},{"type":"element","tag":"h3","props":{"id":"repository-resolution"},"children":[{"type":"text","value":"Repository Resolution"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The command searches for repository classes in these locations:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"App\\Restify\\{Model}Repository"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"App\\Http\\Restify\\{Model}Repository"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If a repository isn't found, the relationship is still generated without the repository parameter, allowing Laravel Restify to auto-resolve it."}]},{"type":"element","tag":"h2","props":{"id":"benefits"},"children":[{"type":"text","value":"Benefits"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Separation of Concerns"}]},{"type":"text","value":": Fields and relationships are kept in separate methods"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Clean Code"}]},{"type":"text","value":": Foreign key fields are not duplicated in the fields array"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Automatic Detection"}]},{"type":"text","value":": Reduces manual work when setting up repositories"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Follows Best Practices"}]},{"type":"text","value":": Uses the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"static include()"}]},{"type":"text","value":" method as recommended in Laravel Restify documentation"}]}]},{"type":"element","tag":"h2","props":{"id":"customization"},"children":[{"type":"text","value":"Customization"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can always modify the generated relationships after creation:"}]},{"type":"element","tag":"pre","props":{"code":"public static function include(): array\n{\n return [\n BelongsTo::make('user', UserRepository::class)->searchable('name'),\n BelongsTo::make('category')->nullable(),\n HasMany::make('comments')->sortable('created_at'),\n \n // Add more relationships manually\n MorphMany::make('tags'),\n BelongsToMany::make('subscribers')->withPivot('subscribed_at'),\n ];\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" include"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" BelongsTo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"searchable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" BelongsTo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'category'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"nullable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" HasMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'comments'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"sortable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'created_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Add more relationships manually\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" MorphMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" BelongsToMany"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'subscribers'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"withPivot"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'subscribed_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"override-confirmation"},"children":[{"type":"text","value":"Override Confirmation"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If a repository already exists at the target location, the command will ask for confirmation before overriding:"}]},{"type":"element","tag":"pre","props":{"code":"$ php artisan restify:repository UserRepository\nDetected repository pattern: flat\nRepository will be created in: App\\Restify\nRepository already exists at: /path/to/app/Restify/UserRepository.php\nDo you want to override it? (yes/no) [no]:\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" UserRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"Detected"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" pattern:"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" flat\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"Repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" will"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" be"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" created"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" in:"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" App"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\R"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"estify\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"Repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" already"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" exists"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" at:"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" /path/to/app/Restify/UserRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"Do"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" you"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" want"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" to"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" override"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" it?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" (yes/no) [no]:\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can skip this confirmation by using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--force"}]},{"type":"text","value":" option:"}]},{"type":"element","tag":"pre","props":{"code":"php artisan restify:repository UserRepository --force\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --force\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"disabling-automatic-generation"},"children":[{"type":"text","value":"Disabling Automatic Generation"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you prefer to handle relationships manually, use the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--no-fields"}]},{"type":"text","value":" option:"}]},{"type":"element","tag":"pre","props":{"code":"php artisan restify:repository PostRepository --no-fields\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --no-fields\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This will generate a repository with only the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"id()"}]},{"type":"text","value":" field and no relationships."}]},{"type":"element","tag":"h2","props":{"id":"bulk-repository-generation"},"children":[{"type":"text","value":"Bulk Repository Generation"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For new projects or when you need to generate repositories for multiple models at once, Laravel Restify provides a bulk generation command that can analyze all your models and create repositories automatically."}]},{"type":"element","tag":"h3","props":{"id":"basic-usage"},"children":[{"type":"text","value":"Basic Usage"}]},{"type":"element","tag":"pre","props":{"code":"php artisan restify:generate:repositories\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:generate:repositories\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This command will:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Discover all models"}]},{"type":"text","value":" in your application automatically"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Analyze database schema"}]},{"type":"text","value":" to generate appropriate field definitions"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Show a detailed preview"}]},{"type":"text","value":" of what will be generated"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Ask for confirmation"}]},{"type":"text","value":" before creating any files"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Generate repositories"}]},{"type":"text","value":" with proper field mappings"}]}]},{"type":"element","tag":"h3","props":{"id":"interactive-preview"},"children":[{"type":"text","value":"Interactive Preview"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Before generating any files, the command shows a comprehensive preview:"}]},{"type":"element","tag":"pre","props":{"code":"📋 Preview of repositories to be generated:\n═══════════════════════════════════════════════════════\n\n🔍 Found 3 models:\n • User (table: users, 8 fields)\n • Post (table: posts, 6 fields)\n • Comment (table: comments, 4 fields)\n\n📂 Repository configuration:\n Structure: flat\n Base namespace: App\\Restify\n Force overwrite: No\n\n📄 Repositories that will be generated:\n 1. app/Restify/UserRepository.php\n 2. app/Restify/PostRepository.php\n 3. app/Restify/CommentRepository.php\n\n📝 Sample repository preview:\n ┌─────────────────────────────────────────────────────┐\n │ class UserRepository extends Repository │\n │ { │\n │ public static string $model = User::class; │\n │ │\n │ public function fields(RestifyRequest $request) │\n │ { │\n │ return [ │\n │ id(), │\n │ field('name'), │\n │ field('email')->email(), │\n │ field('created_at')->datetime()->readonly(), │\n │ # ... 5 more fields │\n │ ]; │\n │ } │\n │ } │\n └─────────────────────────────────────────────────────┘\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"📋 Preview of repositories to be generated:\n═══════════════════════════════════════════════════════\n\n🔍 Found 3 models:\n • User (table: users, 8 fields)\n • Post (table: posts, 6 fields)\n • Comment (table: comments, 4 fields)\n\n📂 Repository configuration:\n Structure: flat\n Base namespace: App\\Restify\n Force overwrite: No\n\n📄 Repositories that will be generated:\n 1. app/Restify/UserRepository.php\n 2. app/Restify/PostRepository.php\n 3. app/Restify/CommentRepository.php\n\n📝 Sample repository preview:\n ┌─────────────────────────────────────────────────────┐\n │ class UserRepository extends Repository │\n │ { │\n │ public static string $model = User::class; │\n │ │\n │ public function fields(RestifyRequest $request) │\n │ { │\n │ return [ │\n │ id(), │\n │ field('name'), │\n │ field('email')->email(), │\n │ field('created_at')->datetime()->readonly(), │\n │ # ... 5 more fields │\n │ ]; │\n │ } │\n │ } │\n └─────────────────────────────────────────────────────┘\n"}]}]},{"type":"element","tag":"h3","props":{"id":"command-options"},"children":[{"type":"text","value":"Command Options"}]},{"type":"element","tag":"table","props":{},"children":[{"type":"element","tag":"thead","props":{},"children":[{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"th","props":{},"children":[{"type":"text","value":"Option"}]},{"type":"element","tag":"th","props":{},"children":[{"type":"text","value":"Description"}]},{"type":"element","tag":"th","props":{},"children":[{"type":"text","value":"Example"}]}]}]},{"type":"element","tag":"tbody","props":{},"children":[{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--force"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"Overwrite existing repositories"}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--force"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--skip-preview"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"Skip preview and generate immediately"}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--skip-preview"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--structure=flat|domains"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"Choose repository structure"}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--structure=domains"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--only=Model1,Model2"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"Only generate for specific models"}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--only=User,Post"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--except=Model1,Model2"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"Exclude specific models"}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--except=User,Post"}]}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"repository-structures"},"children":[{"type":"text","value":"Repository Structures"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The command supports two organizational patterns:"}]},{"type":"element","tag":"h4","props":{"id":"flat-structure-default"},"children":[{"type":"text","value":"Flat Structure (Default)"}]},{"type":"element","tag":"pre","props":{"code":"app/Restify/\n├── UserRepository.php\n├── PostRepository.php\n└── CommentRepository.php\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"app/Restify/\n├── UserRepository.php\n├── PostRepository.php\n└── CommentRepository.php\n"}]}]},{"type":"element","tag":"h4","props":{"id":"domains-structure"},"children":[{"type":"text","value":"Domains Structure"}]},{"type":"element","tag":"pre","props":{"code":"app/Restify/Domains/\n├── User/\n│ └── UserRepository.php\n├── Post/\n│ └── PostRepository.php\n└── Comment/\n └── CommentRepository.php\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"app/Restify/Domains/\n├── User/\n│ └── UserRepository.php\n├── Post/\n│ └── PostRepository.php\n└── Comment/\n └── CommentRepository.php\n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Choose the structure interactively or specify with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--structure"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"code":"# Interactive structure selection\nphp artisan restify:generate:repositories\n\n# Force domains structure\nphp artisan restify:generate:repositories --structure=domains\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"# Interactive structure selection\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:generate:repositories\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"# Force domains structure\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:generate:repositories"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --structure=domains\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"field-type-detection"},"children":[{"type":"text","value":"Field Type Detection"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The command automatically maps database columns to appropriate Restify fields:"}]},{"type":"element","tag":"table","props":{},"children":[{"type":"element","tag":"thead","props":{},"children":[{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"th","props":{},"children":[{"type":"text","value":"Database Type"}]},{"type":"element","tag":"th","props":{},"children":[{"type":"text","value":"Restify Field"}]},{"type":"element","tag":"th","props":{},"children":[{"type":"text","value":"Example"}]}]}]},{"type":"element","tag":"tbody","props":{},"children":[{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"string"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"varchar"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field()"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field('name')"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"Email columns"}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field()->email()"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field('email')->email()"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"Password columns"}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field()->password()->storable()"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field('password')->password()->storable()"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"text"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"longtext"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field()->textarea()"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field('description')->textarea()"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"integer"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"bigint"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field()->number()"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field('count')->number()"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"boolean"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"tinyint"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field()->boolean()"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field('is_active')->boolean()"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"date"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field()->date()"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field('birth_date')->date()"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"datetime"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"timestamp"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field()->datetime()"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field('created_at')->datetime()"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"decimal"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"float"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field()->number()"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field('price')->number()"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"json"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field()->json()"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field('metadata')->json()"}]}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"special-field-handling"},"children":[{"type":"text","value":"Special Field Handling"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Timestamps"}]},{"type":"text","value":": "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"created_at"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"updated_at"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"deleted_at"}]},{"type":"text","value":" → automatically marked as "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"readonly()"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Foreign Keys"}]},{"type":"text","value":": Columns ending with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_id"}]},{"type":"text","value":" are excluded (handled as relationships)"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Email Fields"}]},{"type":"text","value":": Columns containing \"email\" → mapped to "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"email()"}]},{"type":"text","value":" field"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Password Fields"}]},{"type":"text","value":": Columns containing \"password\" → mapped to "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"password()->storable()"}]}]}]},{"type":"element","tag":"h3","props":{"id":"filtering-models"},"children":[{"type":"text","value":"Filtering Models"}]},{"type":"element","tag":"h4","props":{"id":"generate-only-specific-models"},"children":[{"type":"text","value":"Generate Only Specific Models"}]},{"type":"element","tag":"pre","props":{"code":"php artisan restify:generate:repositories --only=User,Post\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:generate:repositories"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --only=User,Post\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"exclude-specific-models"},"children":[{"type":"text","value":"Exclude Specific Models"}]},{"type":"element","tag":"pre","props":{"code":"php artisan restify:generate:repositories --except=User,Post\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:generate:repositories"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --except=User,Post\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This is useful when you want to exclude certain models like:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Third-party package models (Spatie permissions, etc.)"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Internal system models"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Models that don't need API endpoints"}]}]},{"type":"element","tag":"h3","props":{"id":"examples"},"children":[{"type":"text","value":"Examples"}]},{"type":"element","tag":"h4","props":{"id":"quick-setup-for-new-project"},"children":[{"type":"text","value":"Quick Setup for New Project"}]},{"type":"element","tag":"pre","props":{"code":"# Generate all repositories with preview\nphp artisan restify:generate:repositories\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"# Generate all repositories with preview\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:generate:repositories\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"production-setup-with-domains-structure"},"children":[{"type":"text","value":"Production Setup with Domains Structure"}]},{"type":"element","tag":"pre","props":{"code":"# Generate with domains structure, skip preview\nphp artisan restify:generate:repositories \\\n --structure=domains \\\n --skip-preview \\\n --force\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"# Generate with domains structure, skip preview\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:generate:repositories"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --structure=domains"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --skip-preview"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --force\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"selective-generation"},"children":[{"type":"text","value":"Selective Generation"}]},{"type":"element","tag":"pre","props":{"code":"# Only generate for core models\nphp artisan restify:generate:repositories \\\n --only=User,Post,Comment,Category \\\n --structure=flat\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"# Only generate for core models\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:generate:repositories"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --only=User,Post,Comment,Category"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --structure=flat\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"excluding-system-models"},"children":[{"type":"text","value":"Excluding System Models"}]},{"type":"element","tag":"pre","props":{"code":"# Generate all except system models\nphp artisan restify:generate:repositories \\\n --except=PersonalAccessToken,PasswordReset,Permission,Role\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"# Generate all except system models\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:generate:repositories"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --except=PersonalAccessToken,PasswordReset,Permission,Role\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"generated-repository-structure"},"children":[{"type":"text","value":"Generated Repository Structure"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Each generated repository includes:"}]},{"type":"element","tag":"pre","props":{"code":"email(),\n field('email_verified_at')->datetime()->readonly(),\n field('created_at')->datetime()->readonly(),\n field('updated_at')->datetime()->readonly(),\n ];\n }\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"email"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email_verified_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"datetime"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'created_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"datetime"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'updated_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"datetime"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"integration-with-individual-generation"},"children":[{"type":"text","value":"Integration with Individual Generation"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The bulk generation command works seamlessly with the individual repository command. You can:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Use bulk generation to create the initial repositories"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Use individual generation to add new repositories as needed"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Both commands respect the same path detection and organizational patterns"}]}]},{"type":"element","tag":"h3","props":{"id":"best-practices"},"children":[{"type":"text","value":"Best Practices"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Review Generated Files"}]},{"type":"text","value":": Always review generated repositories before committing"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Add Relationships"}]},{"type":"text","value":": The bulk generator focuses on fields; add relationships manually"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Configure Authorization"}]},{"type":"text","value":": Set up policies for the generated repositories"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Test Endpoints"}]},{"type":"text","value":": Verify that all generated endpoints work as expected"}]}]},{"type":"element","tag":"h3","props":{"id":"troubleshooting"},"children":[{"type":"text","value":"Troubleshooting"}]},{"type":"element","tag":"h4","props":{"id":"no-models-found"},"children":[{"type":"text","value":"No Models Found"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If the command reports \"No models found\", ensure:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Models are in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"app/Models"}]},{"type":"text","value":" directory (or "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"app/"}]},{"type":"text","value":" for older Laravel versions)"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Models extend "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Illuminate\\Database\\Eloquent\\Model"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Models are not in excluded paths ("},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Http"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Console"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Exceptions"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Providers"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Restify"}]},{"type":"text","value":")"}]}]},{"type":"element","tag":"h4","props":{"id":"field-detection-issues"},"children":[{"type":"text","value":"Field Detection Issues"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If fields are missing or incorrect:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Ensure database tables exist and are migrated"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Check that model "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$table"}]},{"type":"text","value":" property is set correctly"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Verify database connection is working"}]}]},{"type":"element","tag":"h4","props":{"id":"permission-errors"},"children":[{"type":"text","value":"Permission Errors"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you encounter permission errors during generation:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Ensure the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"app/Restify"}]},{"type":"text","value":" directory is writable"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Check file permissions in your Laravel application"}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"intelligent-path-detection","depth":2,"text":"Intelligent Path Detection","children":[{"id":"supported-patterns","depth":3,"text":"Supported Patterns"},{"id":"how-it-works","depth":3,"text":"How It Works"},{"id":"example-output","depth":3,"text":"Example Output"}]},{"id":"automatic-relationship-detection","depth":2,"text":"Automatic Relationship Detection"},{"id":"generated-structure","depth":2,"text":"Generated Structure"},{"id":"how-it-works-1","depth":2,"text":"How It Works","children":[{"id":"belongsto-detection","depth":3,"text":"BelongsTo Detection"},{"id":"hasmany-detection","depth":3,"text":"HasMany Detection"},{"id":"repository-resolution","depth":3,"text":"Repository Resolution"}]},{"id":"benefits","depth":2,"text":"Benefits"},{"id":"customization","depth":2,"text":"Customization"},{"id":"override-confirmation","depth":2,"text":"Override Confirmation"},{"id":"disabling-automatic-generation","depth":2,"text":"Disabling Automatic Generation"},{"id":"bulk-repository-generation","depth":2,"text":"Bulk Repository Generation","children":[{"id":"basic-usage","depth":3,"text":"Basic Usage"},{"id":"interactive-preview","depth":3,"text":"Interactive Preview"},{"id":"command-options","depth":3,"text":"Command Options"},{"id":"repository-structures","depth":3,"text":"Repository Structures"},{"id":"field-type-detection","depth":3,"text":"Field Type Detection"},{"id":"special-field-handling","depth":3,"text":"Special Field Handling"},{"id":"filtering-models","depth":3,"text":"Filtering Models"},{"id":"examples","depth":3,"text":"Examples"},{"id":"generated-repository-structure","depth":3,"text":"Generated Repository Structure"},{"id":"integration-with-individual-generation","depth":3,"text":"Integration with Individual Generation"},{"id":"best-practices","depth":3,"text":"Best Practices"},{"id":"troubleshooting","depth":3,"text":"Troubleshooting"}]}]}},"_type":"markdown","_id":"content:api:repository-generation.md","_source":"content","_file":"api/repository-generation.md","_stem":"api/repository-generation","_extension":"md"},"hash":"LUhlqPEMiz"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/api/rest-methods.md b/docs-v3/.nuxt/content-cache/parsed/content/api/rest-methods.md new file mode 100644 index 000000000..1e7919020 --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/api/rest-methods.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/api/rest-methods","_dir":"api","_draft":false,"_partial":false,"_locale":"","title":"REST Methods","description":"","menuTitle":"Controllers","category":"API","position":12,"body":{"type":"root","children":[{"type":"element","tag":"h2","props":{"id":"introduction"},"children":[{"type":"text","value":"Introduction"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The API response format must stay consistent throughout the application. Ideally, it would be good to follow a standard such as\nthe "},{"type":"element","tag":"a","props":{"href":"https://jsonapi.org/format/","rel":["nofollow"]},"children":[{"type":"text","value":"JSON:API"}]},{"type":"text","value":", so your frontend app could align with the API nicely."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify provides several different approaches to respond consistently to the application's incoming request. By default,\nRestify's base rest controller class uses a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"RestResponse"}]},{"type":"text","value":" structure which provides a convenient method to respond to\nthe HTTP request with a variety of handy magical methods."}]},{"type":"element","tag":"h2","props":{"id":"restify-response-quickstart"},"children":[{"type":"text","value":"Restify Response Quickstart"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To learn about Restify's helpful response, let's take a look at a complete example of responding to a request and returning the data\nback to the client."}]},{"type":"element","tag":"h3","props":{"id":"defining-the-route"},"children":[{"type":"text","value":"Defining The Route"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"First, let's assume we have the following routes defined in our "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"routes/api.php"}]},{"type":"text","value":" file:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"Route::post('users', 'UserController@store');\n\nRoute::get('users/{id}', 'UserController@show');\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Route"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'UserController@store'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Route"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users/{id}'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'UserController@show'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"GET"}]},{"type":"text","value":" route will return back a user for the given "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"id"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h3","props":{"id":"creating-the-controller"},"children":[{"type":"text","value":"Creating The Controller"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Next, let's take a closer look at a simple "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"API"}]},{"type":"text","value":" controller that handles this route. We'll leave the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"show"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"store"}]},{"type":"text","value":" methods\nempty for now:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"response(User::find($id));\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"/**\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * Display the user entity\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" *\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" int"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $id\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Response\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" */\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" show"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($id)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"response"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"find"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($id));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As you can see, we pass the desired data into the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"respond"}]},{"type":"text","value":" method. This method will wrap the passed data into a JSON\nobject and attach it to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"data"}]},{"type":"text","value":" response's property."}]},{"type":"element","tag":"h3","props":{"id":"receiving-api-response"},"children":[{"type":"text","value":"Receiving API Response"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Once the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"respond"}]},{"type":"text","value":" method wraps up the data, the HTTP request will receive back a response with the following structure:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"data\": {\n \"id\": 1,\n \"name\": \"User name\",\n \"email\": \"kshlerin.hertha@example.com\",\n \"email_verified_at\": \"2019-12-20 09:48:54\",\n \"created_at\": \"2019-12-20 09:48:54\",\n \"updated_at\": \"2020-01-10 12:01:17\"\n }\n}\n\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"data\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"User name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"email\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"kshlerin.hertha@example.com\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"email_verified_at\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"2019-12-20 09:48:54\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"created_at\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"2019-12-20 09:48:54\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"updated_at\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"2020-01-10 12:01:17\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"or:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"errors\": []\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"errors\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": []\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"response-factory"},"children":[{"type":"text","value":"Response factory"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In addition, the parent "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"RestController"}]},{"type":"text","value":" provides a powerful "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"response"}]},{"type":"text","value":" factory method. To understand this, let's return\nback to our "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"store"}]},{"type":"text","value":" method from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"UserController"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"/**\n * Store a newly created resource in storage.\n *\n * @param Request $request\n * @return Response\n */\npublic function store(Request $request)\n{\n return $this->response();\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"/**\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * Store a newly created resource in storage.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" *\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $request\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Response\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" */\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" store"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"response"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"response()"}]},{"type":"text","value":" method will be an instance of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Binaryk\\LaravelRestify\\Controllers\\RestResponse"}]},{"type":"text","value":". For more information\non working with this object instance,\n"},{"type":"element","tag":"a","props":{"href":"#rest-response-methods"},"children":[{"type":"text","value":"check out its documentation"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"$this->response()\n->data($user)\n->message('This is the first user');\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"response"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"data"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($user)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'This is the first user'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The response will look like:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"data\": {\n \"id\": 1,\n \"name\": \"User name\",\n \"email\": \"kshlerin.hertha@example.com\",\n \"email_verified_at\": \"2019-12-20 09:48:54\",\n \"created_at\": \"2019-12-20 09:48:54\",\n \"updated_at\": \"2020-01-10 12:01:17\"\n },\n \"meta\": {\n \"message\": \"This is the first user\"\n }\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"data\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"User name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"email\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"kshlerin.hertha@example.com\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"email_verified_at\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"2019-12-20 09:48:54\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"created_at\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"2019-12-20 09:48:54\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"updated_at\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"2020-01-10 12:01:17\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"message\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"This is the first user\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"displaying-response-errors"},"children":[{"type":"text","value":"Displaying Response Errors"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As we saw above, the response always contains an "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"errors"}]},{"type":"text","value":" property. This can be either an empty array or a list with\nerrors. For example, what if the incoming request parameters can not pass the given validation rules? This can be handled\nby the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"errors"}]},{"type":"text","value":" proxy method:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"/**\n * Store a newly created resource in storage.\n *\n * @param Request $request\n * @return Response\n */\npublic function store(Request $request)\n{\n try {\n $this->validate($request, [\n 'title' => 'required|unique:users|max:255',\n ]);\n\n // The user is valid\n } catch (ValidationException $exception) {\n // The user is not valid\n return $this->errors($exception->errors());\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"/**\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * Store a newly created resource in storage.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" *\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $request\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Response\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" */\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" store"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" try"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"validate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request, [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'required|unique:users|max:255'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // The user is valid\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"catch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"ValidationException"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $exception) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // The user is not valid\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"errors"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($exception"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"errors"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"());\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The returned "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"API"}]},{"type":"text","value":" response will have the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"400"}]},{"type":"text","value":" HTTP code and the following format:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"errors\": {\n \"title\": [\n \"The title field is required.\"\n ]\n }\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"errors\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"title\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"The title field is required.\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"custom-header"},"children":[{"type":"text","value":"Custom Header"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Sometimes you may need to respond with a custom header, according to "},{"type":"element","tag":"a","props":{"href":"https://jsonapi.org/format/#crud-creating-responses-201","rel":["nofollow"]},"children":[{"type":"text","value":"JSON:API"}]},{"type":"text","value":".\nAfter storing an entity, we should respond with a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Location"}]},{"type":"text","value":" header that has the value endpoint to the resource:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"return $this->response()\n ->header('Location', 'api/users/1')\n ->data($user);\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"response"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"header"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'Location'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'api/users/1'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"data"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($user);\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"optional-attributes"},"children":[{"type":"text","value":"Optional Attributes"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Therefore, Restify returns the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"data"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"errors"}]},{"type":"text","value":" attributes in the API's response. It also wraps the message into a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"meta"}]},{"type":"text","value":"\nobject. But what if we have to send some custom attributes? In addition to generating the default fields, you can add extra\nfields to the response by using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"setMeta"}]},{"type":"text","value":" method from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"RestResponse"}]},{"type":"text","value":" object:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"return $this->response()\n ->data($user)\n ->setMeta('related', [ 'William Shakespeare', 'Agatha Christie', 'Leo Tolstoy' ]);\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"response"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"data"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($user)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"setMeta"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'related'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", [ "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'William Shakespeare'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'Agatha Christie'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'Leo Tolstoy'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]);\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"hiding-default-attribute"},"children":[{"type":"text","value":"Hiding Default Attribute"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify has a list of predefined attributes, such as: "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"'line', 'file', 'stack', 'data', 'errors', 'meta'"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Some of these are hidden in production though: "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"'line', 'file', 'stack'"}]},{"type":"text","value":", since they are only used for tracking exceptions."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you would like the API's response to not contain any of these fields (or hide a specific one like "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"errors"}]},{"type":"text","value":", for example),\nthis action can be done by setting in the application provider the:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"RestResponse::$RESPONSE_DEFAULT_ATTRIBUTES = ['data', 'meta'];\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestResponse"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$RESPONSE_DEFAULT_ATTRIBUTES "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'data'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'meta'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"];\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"rest-response-methods"},"children":[{"type":"text","value":"Rest Response Methods"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$this->response()"}]},{"type":"text","value":" returns an instance of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Binaryk\\LaravelRestify\\Controllers\\RestResponse"}]},{"type":"text","value":". This exposes multiple\nmagical methods for your consistent API response."}]},{"type":"element","tag":"h3","props":{"id":"attach-data"},"children":[{"type":"text","value":"Attach data"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As we have already seen, attaching data to the response can be done by using:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"->data($info)\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"data"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($info)\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"headers-setup"},"children":[{"type":"text","value":"Headers setup"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The header could be set by using "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"header"}]},{"type":"text","value":" method, as it accepts only two arguments - the header's name and header's value:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"->header('Location', 'api/users/1')\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"header"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'Location'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'api/users/1'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"meta-information"},"children":[{"type":"text","value":"Meta information"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In addition to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"data"}]},{"type":"text","value":", you may want to send some extra attributes to the client. A message would be a good example, or even anything\nelse for that matter:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"->setMeta('name', 'Eduard Lupacescu')\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"setMeta"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'Eduard Lupacescu'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]}]}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"->message(__('Silence is golden.'))\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"__"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'Silence is golden.'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"))\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"response-code-modifiers"},"children":[{"type":"text","value":"Response code modifiers"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Oftentimes, we have to send an informative response code. The following methods are used for setting the code's response:"}]},{"type":"element","tag":"h3","props":{"id":"refresh-103"},"children":[{"type":"text","value":"Refresh 103"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"->refresh()\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"refresh"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"success-200"},"children":[{"type":"text","value":"Success 200"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"->success()\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"success"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"created-201"},"children":[{"type":"text","value":"Created 201"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"->created()\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"created"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"deleted-no-content-204"},"children":[{"type":"text","value":"Deleted (No Content) 204"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"->deleted()\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"deleted"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]}]}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"->blank()\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"blank"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"invalid-400"},"children":[{"type":"text","value":"Invalid 400"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"->invalid()\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"invalid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"unauthorized-401"},"children":[{"type":"text","value":"Unauthorized 401"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"->unauthorized()\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"unauthorized"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"forbidden-403"},"children":[{"type":"text","value":"Forbidden 403"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"->forbidden()\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"forbidden"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"missing-404"},"children":[{"type":"text","value":"Missing 404"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"->missing()\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"missing"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"throttle-429"},"children":[{"type":"text","value":"Throttle 429"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"->throttle()\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"throttle"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"unavailable-503"},"children":[{"type":"text","value":"Unavailable 503"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"->unavailable()\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"unavailable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"debugging"},"children":[{"type":"text","value":"Debugging"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The following methods could be used to debug some information in the dev mode:"}]},{"type":"element","tag":"h3","props":{"id":"line-debugging"},"children":[{"type":"text","value":"Line debugging"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"$lineNumber = 201;\n$this->line($lineNumber)\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$lineNumber "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" 201"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"line"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($lineNumber)\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"debug-to-file"},"children":[{"type":"text","value":"Debug to file"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This could be used for debugging the file's name"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"$this->file($exception->getFile())\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"file"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($exception"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"getFile"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"())\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"stack-traces"},"children":[{"type":"text","value":"Stack traces"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"With this you can log the exception stach trace"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"$this->stack($exception->getTraceAsString())\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"stack"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($exception"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"getTraceAsString"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"())\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"errors-methods"},"children":[{"type":"text","value":"Errors methods"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The following methods could be used for adding errors to the response:"}]},{"type":"element","tag":"h3","props":{"id":"adding-multiple-errors"},"children":[{"type":"text","value":"Adding multiple errors"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Adding a set of errors at once:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"$this->errors([ 'Something went wrong' ])\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"errors"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"([ "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'Something went wrong'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ])\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"adderror-function"},"children":[{"type":"text","value":"addError function"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Adding error by error in a response's instance:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"$this->addError('Something went wrong')\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"$this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"addError"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'Something went wrong'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"custom-paginator"},"children":[{"type":"text","value":"Custom Paginator"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Every so often you have a customed paginator collection. You want to keep the same response format, just as the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Repository"}]},{"type":"text","value":"does."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can use this static call:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":" $paginator = User::query()->paginate(5);\n\n $response = Binaryk\\LaravelRestify\\Controllers\\RestResponse::index(\n $paginator\n );\n\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $paginator "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"paginate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"5"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $response "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Controllers\\RestResponse"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"index"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $paginator\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$paginator"}]},{"type":"text","value":" argument should be an instance of: "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Illuminate\\Pagination\\AbstractPaginator"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The expected response will contain:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"meta\": {\n \"current_page\": 1,\n \"from\": 1,\n \"last_page\": 1,\n \"path\": \"http://localhost\",\n \"per_page\": 5,\n \"to\": 1,\n \"total\": 1\n },\n \"links\": {\n \"first\": \"http://localhost?page=1\",\n \"last\": \"http://localhost?page=1\",\n \"prev\": null,\n \"next\": null\n },\n \"data\": []\n}\n\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"current_page\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"from\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"last_page\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"path\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"http://localhost\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"per_page\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"5"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"to\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"total\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"links\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"first\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"http://localhost?page=1\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"last\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"http://localhost?page=1\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"prev\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"next\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"null\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"data\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": []\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"introduction","depth":2,"text":"Introduction"},{"id":"restify-response-quickstart","depth":2,"text":"Restify Response Quickstart","children":[{"id":"defining-the-route","depth":3,"text":"Defining The Route"},{"id":"creating-the-controller","depth":3,"text":"Creating The Controller"},{"id":"writing-the-api-response-logic","depth":3,"text":"Writing The API Response Logic"},{"id":"receiving-api-response","depth":3,"text":"Receiving API Response"}]},{"id":"response-factory","depth":2,"text":"Response factory","children":[{"id":"displaying-response-errors","depth":3,"text":"Displaying Response Errors"}]},{"id":"custom-header","depth":2,"text":"Custom Header"},{"id":"optional-attributes","depth":2,"text":"Optional Attributes"},{"id":"hiding-default-attribute","depth":2,"text":"Hiding Default Attribute"},{"id":"rest-response-methods","depth":2,"text":"Rest Response Methods","children":[{"id":"attach-data","depth":3,"text":"Attach data"},{"id":"headers-setup","depth":3,"text":"Headers setup"},{"id":"meta-information","depth":3,"text":"Meta information"}]},{"id":"response-code-modifiers","depth":2,"text":"Response code modifiers","children":[{"id":"refresh-103","depth":3,"text":"Refresh 103"},{"id":"success-200","depth":3,"text":"Success 200"},{"id":"created-201","depth":3,"text":"Created 201"},{"id":"deleted-no-content-204","depth":3,"text":"Deleted (No Content) 204"},{"id":"invalid-400","depth":3,"text":"Invalid 400"},{"id":"unauthorized-401","depth":3,"text":"Unauthorized 401"},{"id":"forbidden-403","depth":3,"text":"Forbidden 403"},{"id":"missing-404","depth":3,"text":"Missing 404"},{"id":"throttle-429","depth":3,"text":"Throttle 429"},{"id":"unavailable-503","depth":3,"text":"Unavailable 503"}]},{"id":"debugging","depth":2,"text":"Debugging","children":[{"id":"line-debugging","depth":3,"text":"Line debugging"},{"id":"debug-to-file","depth":3,"text":"Debug to file"},{"id":"stack-traces","depth":3,"text":"Stack traces"},{"id":"errors-methods","depth":3,"text":"Errors methods"},{"id":"adding-multiple-errors","depth":3,"text":"Adding multiple errors"},{"id":"adderror-function","depth":3,"text":"addError function"}]},{"id":"custom-paginator","depth":2,"text":"Custom Paginator"}]}},"_type":"markdown","_id":"content:api:rest-methods.md","_source":"content","_file":"api/rest-methods.md","_stem":"api/rest-methods","_extension":"md"},"hash":"UEOCtTPzxI"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/api/serializer.md b/docs-v3/.nuxt/content-cache/parsed/content/api/serializer.md new file mode 100644 index 000000000..471c99936 --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/api/serializer.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/api/serializer","_dir":"api","_draft":false,"_partial":false,"_locale":"","title":"Serializer","description":"","menuTitle":"Serializer","category":"API","position":12,"body":{"type":"root","children":[{"type":"element","tag":"h2","props":{"id":"introduction"},"children":[{"type":"text","value":"Introduction"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The API response format must stay consistent throughout the application. Ideally, it would be good to follow a standard as\nthe "},{"type":"element","tag":"a","props":{"href":"https://jsonapi.org/format/","rel":["nofollow"]},"children":[{"type":"text","value":"JSON:API"}]},{"type":"text","value":" so your frontend app could align with the API."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify provides a convenient way to quickly return a response in a consistent format."}]},{"type":"element","tag":"h2","props":{"id":"rest"},"children":[{"type":"text","value":"rest"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"return rest(Company::first())\n ->related('users')\n ->sortDesc('id');\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" rest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Company"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"first"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"())\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"related"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"sortDesc"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rest"}]},{"type":"text","value":" helper accepts a list of models and returns a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"\\Binaryk\\LaravelRestify\\Repositories\\Serializer"}]},{"type":"text","value":" instance, so you can call its fluent API."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Serializer"}]},{"type":"text","value":" will look for the repository associated with your models. If there is a repository associated with your Company (ie CompanyRepository), Serializer will use that repository to serialize your models accordingly:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"data\": {\n \"id\": \"1\",\n \"type\": \"companies\",\n \"attributes\": {\n \"name\": \"BinarCode\"\n },\n \"relationships\": {\n \"users\": [\n {\n \"id\": \"1\",\n \"type\": \"users\",\n \"attributes\": {\n \"name\": \"Eduard\",\n \"email\": \"eduard.lupacescu@binarcode.com\"\n },\n \"meta\": {\n \"authorizedToShow\": true,\n \"authorizedToStore\": true,\n \"authorizedToUpdate\": true,\n \"authorizedToDelete\": true\n },\n \"pivots\": {\n \"is_admin\": true\n }\n }\n ]\n },\n \"meta\": {\n \"authorizedToShow\": true,\n \"authorizedToStore\": true,\n \"authorizedToUpdate\": true,\n \"authorizedToDelete\": true\n }\n }\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"data\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"1\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"companies\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"BinarCode\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"relationships\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"users\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"1\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"users\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Eduard\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"email\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"eduard.lupacescu@binarcode.com\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToShow\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToStore\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToUpdate\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToDelete\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"pivots\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"is_admin\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToShow\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToStore\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToUpdate\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToDelete\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":35},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":36},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In case there isn't a repository associated with your models, the response will simply be a data object with models."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rest"}]},{"type":"text","value":" helper accepts a model as well as a list (collection) of models, and it'll serialize the response accordingly:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"rest(Post::all())\n ->related('user')\n ->sortDesc('id')\n ->perPage(20)\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"all"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"())\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"related"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"sortDesc"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"perPage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"20"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"data"},"children":[{"type":"text","value":"data"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"data(User::first(), 200)\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"data"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"first"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(), "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"200"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This helper simply wraps the provided data into an object with a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"data"}]},{"type":"text","value":" key:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"data\": {\n \"id\": 1,\n \"name\": \"User name\",\n \"email\": \"kshlerin.hertha@example.com\"\n }\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"data\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"User name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"email\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"kshlerin.hertha@example.com\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"ok"},"children":[{"type":"text","value":"ok"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"ok('All good!')\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"ok"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'All good!'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ok"}]},{"type":"text","value":" helper accepts an optional message as argument, so you can return a successful response with a custom message."}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"message\": \"All good!\"\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"message\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"All good!\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"introduction","depth":2,"text":"Introduction"},{"id":"rest","depth":2,"text":"rest"},{"id":"data","depth":2,"text":"data","children":[{"id":"ok","depth":3,"text":"ok"}]}]}},"_type":"markdown","_id":"content:api:serializer.md","_source":"content","_file":"api/serializer.md","_stem":"api/serializer","_extension":"md"},"hash":"xeTMOzUSoI"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/api/validation-methods.md b/docs-v3/.nuxt/content-cache/parsed/content/api/validation-methods.md new file mode 100644 index 000000000..e69f019e9 --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/api/validation-methods.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/api/validation-methods","_dir":"api","_draft":false,"_partial":false,"_locale":"","title":"Validation Methods","description":"Laravel Restify provides a fluent API for adding validation rules to fields, similar to Laravel Nova. This makes it easy to chain validation methods for cleaner and more readable code.","menuTitle":"Validation Methods","category":"API","position":9,"body":{"type":"root","children":[{"type":"element","tag":"h1","props":{"id":"fluent-validation-methods"},"children":[{"type":"text","value":"Fluent Validation Methods"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Laravel Restify provides a fluent API for adding validation rules to fields, similar to Laravel Nova. This makes it easy to chain validation methods for cleaner and more readable code."}]},{"type":"element","tag":"h2","props":{"id":"basic-usage"},"children":[{"type":"text","value":"Basic Usage"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Instead of using the traditional "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rules()"}]},{"type":"text","value":" method with string rules, you can now use fluent validation methods:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// Traditional approach\nfield('email')->rules('required', 'email', 'unique:users');\n\n// Fluent approach\nfield('email')->required()->email()->unique('users');\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Traditional approach\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'unique:users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Fluent approach\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"email"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"unique"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"available-validation-methods"},"children":[{"type":"text","value":"Available Validation Methods"}]},{"type":"element","tag":"h3","props":{"id":"common-validation-methods"},"children":[{"type":"text","value":"Common Validation Methods"}]},{"type":"element","tag":"h4","props":{"id":"required-and-nullable"},"children":[{"type":"text","value":"Required and Nullable"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"field('name')->required();\nfield('bio')->nullable();\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'bio'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"nullable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"type-validation"},"children":[{"type":"text","value":"Type Validation"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"field('email')->email();\nfield('age')->integer();\nfield('price')->numeric();\nfield('is_active')->boolean();\nfield('tags')->array();\nfield('description')->string();\nfield('metadata')->json();\nfield('website')->url();\nfield('uuid')->uuid();\nfield('birthday')->date();\nfield('created_at')->datetime();\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"email"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'age'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"integer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'price'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"numeric"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'is_active'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"boolean"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'description'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'metadata'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"json"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'website'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"url"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'uuid'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"uuid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'birthday'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"date"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'created_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"datetime"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"numeric-constraints"},"children":[{"type":"text","value":"Numeric Constraints"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"field('age')->integer()->min(18)->max(100);\nfield('price')->numeric()->between(0, 99999.99);\nfield('quantity')->integer()->min(0);\nfield('rating')->numeric()->between(1, 5);\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'age'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"integer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"min"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"18"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"max"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"100"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'price'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"numeric"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"between"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"99999.99"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'quantity'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"integer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"min"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'rating'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"numeric"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"between"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"5"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"string-constraints"},"children":[{"type":"text","value":"String Constraints"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"field('username')->string()->min(3)->max(20);\nfield('title')->string()->max(255);\nfield('code')->string()->size(6); // Exactly 6 characters\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'username'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"min"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"3"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"max"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"20"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"max"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"255"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'code'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"size"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"6"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Exactly 6 characters\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"password-validation"},"children":[{"type":"text","value":"Password Validation"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"field('password')->required()->password()->confirmed();\nfield('password')->required()->password(10); // Minimum 10 characters\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'password'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"password"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"confirmed"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'password'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"password"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"10"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Minimum 10 characters\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"unique-and-exists-validation"},"children":[{"type":"text","value":"Unique and Exists Validation"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// Basic unique validation\nfield('email')->unique('users');\n\n// Unique with custom column\nfield('slug')->unique('posts', 'slug');\n\n// Unique with ignore (useful for updates)\nfield('email')->unique('users', 'email', $userId);\n\n// Exists validation\nfield('category_id')->exists('categories', 'id');\nfield('user_id')->required()->exists('users');\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Basic unique validation\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"unique"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Unique with custom column\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'slug'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"unique"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'slug'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Unique with ignore (useful for updates)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"unique"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", $userId);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Exists validation\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'category_id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"exists"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'categories'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user_id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"exists"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"date-validation"},"children":[{"type":"text","value":"Date Validation"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"field('start_date')->date()->after('today');\nfield('end_date')->date()->afterOrEqual('start_date');\nfield('birth_date')->date()->before('today');\nfield('expired_at')->datetime()->beforeOrEqual('2024-12-31');\nfield('scheduled_at')->datetime()->dateFormat('Y-m-d H:i:s');\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'start_date'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"date"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"after"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'today'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'end_date'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"date"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"afterOrEqual"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'start_date'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'birth_date'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"date"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"before"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'today'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'expired_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"datetime"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"beforeOrEqual"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'2024-12-31'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'scheduled_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"datetime"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"dateFormat"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'Y-m-d H:i:s'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"file-validation"},"children":[{"type":"text","value":"File Validation"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"field('document')->isFile()->max(5120); // 5MB\nfield('avatar')->isImage()->max(2048); // 2MB\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'document'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isFile"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"max"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"5120"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// 5MB\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'avatar'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isImage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"max"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"2048"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// 2MB\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"pattern-validation"},"children":[{"type":"text","value":"Pattern Validation"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"field('phone')->regex('/^[0-9]{10}$/');\nfield('username')->alphaDash(); // Letters, numbers, dashes, underscores\nfield('name')->alpha(); // Letters only\nfield('code')->alphaNum(); // Letters and numbers only\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'phone'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"regex"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'/"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"^"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#DBEDFF"},"children":[{"type":"text","value":"[0-9]{10}"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"/'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'username'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"alphaDash"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Letters, numbers, dashes, underscores\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"alpha"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Letters only\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'code'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"alphaNum"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Letters and numbers only\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"ip-address-validation"},"children":[{"type":"text","value":"IP Address Validation"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"field('ip')->ip();\nfield('ipv4')->ipv4();\nfield('ipv6')->ipv6();\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'ip'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"ip"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'ipv4'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"ipv4"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'ipv6'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"ipv6"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"conditional-validation"},"children":[{"type":"text","value":"Conditional Validation"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// Required if another field has a specific value\nfield('phone')->requiredIf('contact_method', 'phone');\n\n// Required unless another field has a specific value\nfield('reason')->requiredUnless('status', 'approved');\n\n// Required with other fields\nfield('password_confirmation')->requiredWith('password');\n\n// Required with all specified fields\nfield('state')->requiredWithAll(['country', 'city']);\n\n// Required without other fields\nfield('email')->requiredWithout('phone');\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Required if another field has a specific value\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'phone'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"requiredIf"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'contact_method'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'phone'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Required unless another field has a specific value\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'reason'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"requiredUnless"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'status'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'approved'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Required with other fields\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'password_confirmation'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"requiredWith"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'password'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Required with all specified fields\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'state'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"requiredWithAll"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'country'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'city'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Required without other fields\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"requiredWithout"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'phone'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"innot-in-validation"},"children":[{"type":"text","value":"In/Not In Validation"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"field('status')->in(['pending', 'approved', 'rejected']);\nfield('role')->notIn(['admin', 'super-admin']);\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'status'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"in"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'pending'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'approved'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'rejected'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'role'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"notIn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'admin'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'super-admin'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]);\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"other-useful-methods"},"children":[{"type":"text","value":"Other Useful Methods"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// Field must be accepted (yes, on, 1, or true)\nfield('terms')->accepted();\n\n// Field must be confirmed (field_confirmation must exist)\nfield('email')->confirmed();\n\n// Field must be different from another field\nfield('new_password')->different('current_password');\n\n// Field must be the same as another field\nfield('password_confirmation')->same('password');\n\n// Field must match current user's password\nfield('current_password')->currentPassword();\n\n// Field must be filled if present\nfield('description')->filled();\n\n// Field must be present in request\nfield('token')->present();\n\n// String must start/end with specific values\nfield('url')->startsWith(['http://', 'https://']);\nfield('filename')->endsWith(['.jpg', '.png', '.pdf']);\n\n// Timezone validation\nfield('timezone')->timezone();\n\n// MAC address validation\nfield('mac')->macAddress();\n\n// Multiple of value\nfield('quantity')->integer()->multipleOf(5);\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Field must be accepted (yes, on, 1, or true)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'terms'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"accepted"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Field must be confirmed (field_confirmation must exist)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"confirmed"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Field must be different from another field\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'new_password'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"different"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'current_password'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Field must be the same as another field\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'password_confirmation'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"same"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'password'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Field must match current user's password\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'current_password'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"currentPassword"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Field must be filled if present\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'description'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"filled"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Field must be present in request\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'token'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"present"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// String must start/end with specific values\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'url'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"startsWith"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'http://'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'https://'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'filename'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"endsWith"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'.jpg'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'.png'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'.pdf'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Timezone validation\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'timezone'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"timezone"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// MAC address validation\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'mac'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"macAddress"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Multiple of value\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'quantity'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"integer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"multipleOf"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"5"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"complex-examples"},"children":[{"type":"text","value":"Complex Examples"}]},{"type":"element","tag":"h3","props":{"id":"user-registration-form"},"children":[{"type":"text","value":"User Registration Form"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function fields(RestifyRequest $request)\n{\n return [\n field('name')->required()->string()->min(2)->max(100),\n \n field('email')->required()->email()->unique('users'),\n \n field('username')\n ->required()\n ->string()\n ->min(3)\n ->max(20)\n ->alphaDash()\n ->unique('users'),\n \n field('password')\n ->required()\n ->password()\n ->confirmed(),\n \n field('age')->nullable()->integer()->min(13)->max(120),\n \n field('terms_accepted')->required()->accepted(),\n \n field('notification_email')\n ->requiredIf('receive_notifications', true)\n ->email(),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"min"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"2"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"max"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"100"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"email"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"unique"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'username'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"min"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"3"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"max"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"20"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"alphaDash"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"unique"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'password'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"password"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"confirmed"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'age'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"nullable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"integer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"min"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"13"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"max"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"120"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'terms_accepted'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"accepted"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'notification_email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"requiredIf"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'receive_notifications'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"email"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"product-form"},"children":[{"type":"text","value":"Product Form"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function fields(RestifyRequest $request)\n{\n return [\n field('name')->required()->string()->max(255),\n \n field('slug')->required()->string()->unique('products'),\n \n field('price')->required()->numeric()->min(0)->max(999999.99),\n \n field('sale_price')->nullable()->numeric()->between(0, 999999.99),\n \n field('sku')->required()->string()->size(8)->unique('products'),\n \n field('status')->required()->in(['draft', 'published', 'archived']),\n \n field('published_at')\n ->nullable()\n ->datetime()\n ->afterOrEqual('today'),\n \n field('category_id')->required()->exists('categories', 'id'),\n \n field('weight')->nullable()->numeric()->min(0),\n \n field('is_featured')->boolean(),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"max"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"255"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'slug'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"unique"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'products'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'price'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"numeric"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"min"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"max"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"999999.99"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'sale_price'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"nullable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"numeric"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"between"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"999999.99"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'sku'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"size"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"8"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"unique"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'products'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'status'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"in"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'draft'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'published'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'archived'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'published_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"nullable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"datetime"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"afterOrEqual"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'today'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'category_id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"exists"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'categories'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'weight'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"nullable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"numeric"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"min"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'is_featured'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"boolean"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"article-form-with-conditional-rules"},"children":[{"type":"text","value":"Article Form with Conditional Rules"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function fields(RestifyRequest $request)\n{\n return [\n field('title')->required()->string()->max(200),\n \n field('content')->required()->string()->min(100),\n \n field('excerpt')\n ->requiredUnless('auto_excerpt', true)\n ->string()\n ->max(500),\n \n field('featured_image')\n ->requiredIf('is_featured', true)\n ->isImage()\n ->max(5120),\n \n field('publish_date')\n ->requiredIf('status', 'published')\n ->date()\n ->afterOrEqual('today'),\n \n field('tags')->nullable()->array(),\n \n field('meta_description')\n ->nullable()\n ->string()\n ->between(50, 160),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"max"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"200"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'content'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"min"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"100"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'excerpt'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"requiredUnless"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'auto_excerpt'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"max"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"500"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'featured_image'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"requiredIf"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'is_featured'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isImage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"max"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"5120"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'publish_date'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"requiredIf"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'status'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'published'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"date"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"afterOrEqual"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'today'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"nullable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'meta_description'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"nullable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"between"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"50"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"160"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"combining-with-traditional-rules"},"children":[{"type":"text","value":"Combining with Traditional Rules"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can still combine fluent methods with the traditional "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rules()"}]},{"type":"text","value":" method when needed:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"field('email')\n ->required()\n ->email()\n ->rules('unique:users,email,' . $userId)\n ->rules(new CustomEmailRule);\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"email"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'unique:users,email,'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $userId)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" CustomEmailRule"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"custom-validation-messages"},"children":[{"type":"text","value":"Custom Validation Messages"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Validation methods can be combined with custom messages:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"field('email')\n ->required()\n ->email()\n ->unique('users')\n ->messages([\n 'required' => 'Email address is required.',\n 'email' => 'Please provide a valid email address.',\n 'unique' => 'This email is already registered.',\n ]);\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"email"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"unique"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"messages"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"([\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'Email address is required.'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'Please provide a valid email address.'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'unique'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'This email is already registered.'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]);\n"}]}]}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"basic-usage","depth":2,"text":"Basic Usage"},{"id":"available-validation-methods","depth":2,"text":"Available Validation Methods","children":[{"id":"common-validation-methods","depth":3,"text":"Common Validation Methods"}]},{"id":"complex-examples","depth":2,"text":"Complex Examples","children":[{"id":"user-registration-form","depth":3,"text":"User Registration Form"},{"id":"product-form","depth":3,"text":"Product Form"},{"id":"article-form-with-conditional-rules","depth":3,"text":"Article Form with Conditional Rules"}]},{"id":"combining-with-traditional-rules","depth":2,"text":"Combining with Traditional Rules"},{"id":"custom-validation-messages","depth":2,"text":"Custom Validation Messages"}]}},"_type":"markdown","_id":"content:api:validation-methods.md","_source":"content","_file":"api/validation-methods.md","_stem":"api/validation-methods","_extension":"md"},"hash":"57hIqML1Ji"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/auth/authentication.md b/docs-v3/.nuxt/content-cache/parsed/content/auth/authentication.md new file mode 100644 index 000000000..dba36a015 --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/auth/authentication.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/auth/authentication","_dir":"auth","_draft":false,"_partial":false,"_locale":"","title":"Authentication setup","description":"Laravel Restify has the support for a facile authentication with Laravel Sanctum.","menuTitle":"Authentication","category":"Auth","position":1,"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Laravel Restify has the support for a facile authentication with "},{"type":"element","tag":"a","props":{"href":"https://laravel.com/docs/sanctum#api-token-authentication","rel":["nofollow"]},"children":[{"type":"text","value":"Laravel Sanctum"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now you can finally enjoy the auth setup ("},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"register"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"login"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"forgot"}]},{"type":"text","value":", and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"reset password"}]},{"type":"text","value":")."}]},{"type":"element","tag":"h2","props":{"id":"quick-start"},"children":[{"type":"text","value":"Quick start"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"tl;dr:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you run on Laravel 10 or higher, you can use this command that will do all the setup for you:"}]},{"type":"element","tag":"pre","props":{"className":"language-shell shiki shiki-themes github-light github-dark","code":"php artisan restify:setup-auth\n","language":"shell","meta":"script","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:setup-auth\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This command will:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"ensures"}]},{"type":"text","value":" that "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Sanctum"}]},{"type":"text","value":" is installed and configured as the authentication provider in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"config/restify.php"}]},{"type":"text","value":" file"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"appends"}]},{"type":"text","value":" the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Route::restifyAuth();"}]},{"type":"text","value":" line to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"routes/api.php"}]},{"type":"text","value":" file to add the authentication routes"}]}]},{"type":"element","tag":"h2","props":{"id":"prerequisites"},"children":[{"type":"text","value":"Prerequisites"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Migrate the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"users"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"password_resets"}]},{"type":"text","value":" table (they already exist into a fresh Laravel app)."}]},{"type":"element","tag":"alert","props":{"type":"success"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Laravel 10 automatically ships with Sanctum, so you don't have to install it."}]}]},{"type":"element","tag":"h3","props":{"id":"install-sanctum"},"children":[{"type":"text","value":"Install sanctum"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"See the docs "},{"type":"element","tag":"a","props":{"href":"https://laravel.com/docs/sanctum#installation","rel":["nofollow"]},"children":[{"type":"text","value":"here"}]},{"type":"text","value":". You don't need to add "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"\\Laravel\\Sanctum\\Http\\Middleware\\EnsureFrontendRequestsAreStateful::class,"}]},{"type":"text","value":" in your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"'api'"}]},{"type":"text","value":" middleware group."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You only have to run these 3 commands:"}]},{"type":"element","tag":"pre","props":{"className":"language-shell shiki shiki-themes github-light github-dark","code":"composer require laravel/sanctum\nphp artisan vendor:publish --provider=\"Laravel\\Sanctum\\SanctumServiceProvider\"\nphp artisan migrate\n","language":"shell","meta":"script","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"composer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" require"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" laravel/sanctum\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" vendor:publish"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --provider="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Laravel\\Sanctum\\SanctumServiceProvider\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" migrate\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"define-auth-model"},"children":[{"type":"text","value":"Define auth model"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Define your authenticatable class in the config file:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// config/restify.php\n\n'auth' => [\n ...\n 'user_model' => \\App\\Models\\User::class,\n]\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// config/restify.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'auth'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'user_model'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\App\\Models\\User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"User"}]},{"type":"text","value":" model should extend the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Illuminate\\Foundation\\Auth\\User"}]},{"type":"text","value":" class or implement the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Illuminate\\Contracts\\Auth\\Authenticatable"}]},{"type":"text","value":" interface."}]},{"type":"element","tag":"alert","props":{"type":"info"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Make sure you have the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"\\Laravel\\Sanctum\\HasApiTokens"}]},{"type":"text","value":" trait to your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"User"}]},{"type":"text","value":" model.\nLaravel 10 will automatically add this trait to your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"User"}]},{"type":"text","value":" model."}]}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// User.php\n\nuse Illuminate\\Foundation\\Auth\\User as Authenticatable;\nuse Laravel\\Sanctum\\HasApiTokens;\n\nclass User extends Authenticatable\n{\n use HasApiTokens;\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// User.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Foundation\\Auth\\User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Authenticatable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Laravel\\Sanctum\\HasApiTokens"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Authenticatable\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" HasApiTokens"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"define-routes"},"children":[{"type":"text","value":"Define routes"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify provides you a simple way to add all of your auth routes prepared. Simply add in your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"routes/api.php"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"Route::restifyAuth();\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Route"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"restifyAuth"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"And voilà, now you have auth routes ready to be used."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"These are the default routes provided by restify:"}]},{"type":"element","tag":"table","props":{},"children":[{"type":"element","tag":"thead","props":{},"children":[{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"th","props":{"align":"left"},"children":[{"type":"text","value":"Verb"}]},{"type":"element","tag":"th","props":{"align":"left"},"children":[{"type":"text","value":"URI"}]},{"type":"element","tag":"th","props":{"align":"left"},"children":[{"type":"text","value":"Action"}]}]}]},{"type":"element","tag":"tbody","props":{},"children":[{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"POST"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/register"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"register"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"POST"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/login"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"login"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"POST"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/forgotPassword"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"forgotPassword"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"POST"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/resetPassword"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"resetPassword"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"POST"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/verify/{id}/{emailHash}"}]}]},{"type":"element","tag":"td","props":{"align":"left"},"children":[{"type":"text","value":"verifyEmail"}]}]}]}]},{"type":"element","tag":"alert","props":{"type":"info"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"register"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"login"}]},{"type":"text","value":" routes are outside the base "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"restify"}]},{"type":"text","value":" prefix because they don't have to follow the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"auth"}]},{"type":"text","value":" middleware defined in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"config/restify.php"}]},{"type":"text","value":" config file."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can also pass an "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"actions"}]},{"type":"text","value":" argument, which is an array of actions you want to register. For example:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"Route::restifyAuth(actions: ['login', 'register']);\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Route"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"restifyAuth"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"actions"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'login'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'register'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]);\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"actions"}]},{"type":"text","value":" argument, only the specified routes will be registered. If no "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"actions"}]},{"type":"text","value":" argument is passed, Restify will register all the routes by default."}]},{"type":"element","tag":"h2","props":{"id":"sanctum-middleware"},"children":[{"type":"text","value":"Sanctum Middleware"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Next, add the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"auth:sanctum"}]},{"type":"text","value":" middleware after the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"api"}]},{"type":"text","value":" middleware in your config file to protect all the restify's routes:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"/config/restify.php\n 'middleware' => [\n 'api',\n 'auth:sanctum',\n ...\n ],\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"/"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"config"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"/"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"restify"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'middleware'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'api'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'auth:sanctum'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ],\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"login"},"children":[{"type":"text","value":"Login"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's ensure the authentication is working correctly. Create a user in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DatabaseSeeder"}]},{"type":"text","value":" class:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// DatabaseSeeder.php\n\\App\\Models\\User::factory()->create([\n 'name' => 'Test User',\n 'email' => 'test@example.com',\n 'password' => \\Illuminate\\Support\\Facades\\Hash::make('password'),\n]);\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// DatabaseSeeder.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\App\\Models\\User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"factory"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"create"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"([\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'Test User'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'test@example.com'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'password'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\Illuminate\\Support\\Facades\\Hash"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'password'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]);\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Seed it:"}]},{"type":"element","tag":"pre","props":{"className":"language-shell shiki shiki-themes github-light github-dark","code":"php artisan db:seed\n","language":"shell","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" db:seed\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now you can test the login with Curl or Postman:"}]},{"type":"element","tag":"pre","props":{"className":"language-shell shiki shiki-themes github-light github-dark","code":"curl -X POST \"http://restify-app.test/api/login\" \\\n -H \"Accept: application/json\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"email\": \"test@example.com\",\n \"password\": \"password\"\n }'\n","language":"shell","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"curl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" -X"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" POST"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"http://restify-app.test/api/login\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" -H"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"Accept: application/json\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" -H"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"Content-Type: application/json\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" -d"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" '{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"email\": \"test@example.com\",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"password\": \"password\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" }'\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"So you should see the response like this:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"id\": \"11\",\n \"type\": \"users\",\n \"attributes\": {\n \"name\": \"Test User\",\n \"email\": \"test@example.com\"\n },\n \"meta\": {\n \"authorizedToShow\": true,\n \"authorizedToStore\": false,\n \"authorizedToUpdate\": false,\n \"authorizedToDelete\": false,\n \"token\": \"1|f7D1qkALtM9GKDkjREKpwMRKTZg2ZnFqDZTSe53k\"\n }\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"11\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"users\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Test User\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"email\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"test@example.com\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToShow\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToStore\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToUpdate\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToDelete\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"token\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"1|f7D1qkALtM9GKDkjREKpwMRKTZg2ZnFqDZTSe53k\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"authorization"},"children":[{"type":"text","value":"Authorization"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We will discuss the authorization in more details here "},{"type":"element","tag":"a","props":{"href":"/auth/authorization"},"children":[{"type":"text","value":"Authorization"}]},{"type":"text","value":". But for now let's see a simple example."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"After a successful login, you will receive an authentication token. You should include this token as a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Bearer"}]},{"type":"text","value":" token in the Authorization header for your subsequent API requests using "},{"type":"element","tag":"a","props":{"href":"https://learning.postman.com/docs/sending-requests/authorization/#bearer-token","rel":["nofollow"]},"children":[{"type":"text","value":"Postman"}]},{"type":"text","value":", axios library, or cURL."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Here's an axios example for retrieving the user's profile with the generated token:"}]},{"type":"element","tag":"pre","props":{"className":"language-js shiki shiki-themes github-light github-dark","code":"import axios from 'axios';\n\nconst token = '1|f7D1qkALtM9GKDkjREKpwMRKTZg2ZnFqDZTSe53k';\n\naxios.get('http://restify-app.test/api/restify/profile', {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/json'\n }\n})\n.then(response => {\n console.log(response.data);\n})\n.catch(error => {\n console.error(error);\n});\n","language":"js","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" axios "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'axios'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" token"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" '1|f7D1qkALtM9GKDkjREKpwMRKTZg2ZnFqDZTSe53k'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"axios."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'http://restify-app.test/api/restify/profile'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" headers: {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'Authorization'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"`Bearer ${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"token"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}`"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'Accept'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'application/json'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"})\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"then"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E36209;--shiki-dark:#FFAB70"},"children":[{"type":"text","value":"response"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" console."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"log"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(response.data);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"})\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"catch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E36209;--shiki-dark:#FFAB70"},"children":[{"type":"text","value":"error"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" console."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"error"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(error);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"});\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Here's a cURL example for retrieving the user's profile with the generated token:"}]},{"type":"element","tag":"pre","props":{"className":"language-bash shiki shiki-themes github-light github-dark","code":"curl -X GET \"http://restify-app.test/api/restify/profile\" \\\n -H \"Accept: application/json\" \\\n -H \"Authorization: Bearer 1|f7D1qkALtM9GKDkjREKpwMRKTZg2ZnFqDZTSe53k\"\n","language":"bash","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"curl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" -X"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" GET"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"http://restify-app.test/api/restify/profile\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" -H"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"Accept: application/json\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" -H"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"Authorization: Bearer 1|f7D1qkALtM9GKDkjREKpwMRKTZg2ZnFqDZTSe53k\"\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Replace "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"http://restify-app.test"}]},{"type":"text","value":" with your actual domain and use the authentication token you received after logging in."}]},{"type":"element","tag":"h2","props":{"id":"register"},"children":[{"type":"text","value":"Register"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's see how to register a new user in the application. You can test the registration using Curl or Postman."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Use the following endpoint for registration:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"http://restify-app.test/api/register"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"And send this payload:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"name\": \"John Doe\",\n \"email\": \"demo@restify.com\",\n \"password\": \"secret!\",\n \"password_confirmation\": \"secret!\"\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"John Doe\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"email\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"demo@restify.com\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"password\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"secret!\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"password_confirmation\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"secret!\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Note: Email and password fields are required."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now, you can send a POST request with Curl:"}]},{"type":"element","tag":"pre","props":{"className":"language-shell shiki shiki-themes github-light github-dark","code":"curl -X POST \"http://restify-app.test/api/register\" \\\n -H \"Accept: application/json\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"name\": \"John Doe\",\n \"email\": \"demo@restify.com\",\n \"password\": \"secret!\",\n \"password_confirmation\": \"secret!\"\n }'\n","language":"shell","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"curl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" -X"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" POST"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"http://restify-app.test/api/register\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" -H"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"Accept: application/json\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" -H"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"Content-Type: application/json\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" -d"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" '{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"name\": \"John Doe\",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"email\": \"demo@restify.com\",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"password\": \"secret!\",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"password_confirmation\": \"secret!\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" }'\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You should see the response like this:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"id\": \"12\",\n \"type\": \"users\",\n \"attributes\": {\n \"name\": \"John Doe\",\n \"email\": \"demo@restify.com\"\n },\n \"meta\": {\n \"authorizedToShow\": true,\n \"authorizedToStore\": false,\n \"authorizedToUpdate\": false,\n \"authorizedToDelete\": false,\n \"token\": \"2|z8D2rkBLtN8GKDkjREKpwMRKTZg2ZnFqDZTSe53k\"\n }\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"12\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"users\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"John Doe\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"email\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"demo@restify.com\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToShow\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToStore\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToUpdate\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToDelete\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"token\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"2|z8D2rkBLtN8GKDkjREKpwMRKTZg2ZnFqDZTSe53k\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"forgot-password"},"children":[{"type":"text","value":"Forgot Password"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To initiate the password reset process, use the following endpoint:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"{{host}}/api/forgotPassword"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"And send this payload:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"email\": \"demo@restify.com\"\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"email\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"demo@restify.com\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"After making a POST request to this endpoint, an email will be sent to the provided email address containing a link to reset the password. The link looks like this:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"'password_reset_url' => env('FRONTEND_APP_URL').'/password/reset?token={token}&email={email}',"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This configuration can be found in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"config/restify.php"}]},{"type":"text","value":" file. The FRONTEND_APP_URL should be set to the URL of your frontend app, where the user lands when they click the action button in the email. The \"token\" is a variable that will be used to reset the password later on."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To view the email content during development, you can change the following configuration in your .env file:"}]},{"type":"element","tag":"pre","props":{"className":"language-dotenv shiki shiki-themes github-light github-dark","code":"MAIL_MAILER=log\n","language":"dotenv","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"MAIL_MAILER=log\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This will log the email content to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"laravel.log"}]},{"type":"text","value":" file, allowing you to see the password reset email without actually sending it."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now, you can send a POST request with Curl:"}]},{"type":"element","tag":"pre","props":{"className":"language-shell shiki shiki-themes github-light github-dark","code":"curl -X POST \"http://restify-app.test/api/forgotPassword\" \\\n -H \"Accept: application/json\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"email\": \"demo@restify.com\"\n }'\n","language":"shell","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"curl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" -X"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" POST"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"http://restify-app.test/api/forgotPassword\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" -H"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"Accept: application/json\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" -H"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"Content-Type: application/json\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" -d"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" '{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"email\": \"demo@restify.com\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" }'\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If the email is successfully sent, you'll receive a response similar to the following:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"message\": \"Reset password link sent to your email.\"\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"message\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Reset password link sent to your email.\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now, the user can follow the link in the email to reset their password."}]},{"type":"element","tag":"h2","props":{"id":"reset-password"},"children":[{"type":"text","value":"Reset Password"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"After the user has received the password reset email from the Forgot Password process, they can reset their password using the following endpoint:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"http://restify-app.test/api/resetPassword"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The payload should include the token and email received from the password reset email:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"token\": \"7e474bb9118e736306de27126343644a7cb0ecdaec558fdef30946d15225bc07\",\n \"email\": \"demo@restify.com\",\n \"password\": \"new_password\",\n \"password_confirmation\": \"new_password\"\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"token\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"7e474bb9118e736306de27126343644a7cb0ecdaec558fdef30946d15225bc07\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"email\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"demo@restify.com\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"password\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"new_password\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"password_confirmation\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"new_password\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now, you can send a POST request with Curl:"}]},{"type":"element","tag":"pre","props":{"className":"language-shell shiki shiki-themes github-light github-dark","code":"curl -X POST \"http://restify-app.test/api/resetPassword\" \\\n -H \"Accept: application/json\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"token\": \"0d20b6cfa48f2bbbb83bf913d5e329207149f74d7b22d59a383d321c7af7fd5e\",\n \"email\": \"demo@restify.com\",\n \"password\": \"new_password\",\n \"password_confirmation\": \"new_password\"\n }'\n","language":"shell","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"curl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" -X"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" POST"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"http://restify-app.test/api/resetPassword\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" -H"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"Accept: application/json\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" -H"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"Content-Type: application/json\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" -d"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" '{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"token\": \"0d20b6cfa48f2bbbb83bf913d5e329207149f74d7b22d59a383d321c7af7fd5e\",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"email\": \"demo@restify.com\",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"password\": \"new_password\",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"password_confirmation\": \"new_password\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" }'\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If the password reset is successful, you should receive a response similar to the following:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"message\": \"Your password has been successfully reset.\"\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"message\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Your password has been successfully reset.\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now the user's password has been successfully reset, and they can log in with their new password."}]},{"type":"element","tag":"h2","props":{"id":"customizing-authentication-controllers"},"children":[{"type":"text","value":"Customizing Authentication Controllers"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can publish the authentication controllers from the Restify package to your own application, allowing you to customize their behavior as needed. To publish the controllers, run the following command:"}]},{"type":"element","tag":"pre","props":{"className":"language-shell shiki shiki-themes github-light github-dark","code":"php artisan restify:auth\n","language":"shell","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:auth\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This command will copy the authentication controllers to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"app/Http/Controllers/Restify"}]},{"type":"text","value":" directory in your Laravel project."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The command accepts an optional "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--actions"}]},{"type":"text","value":" parameter, which allows you to specify which controllers you want to publish. If no action is passed, the command will publish all controllers and the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ForgotPasswordNotification"}]},{"type":"text","value":". For example, to publish only the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"login"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"register"}]},{"type":"text","value":" controllers, run:"}]},{"type":"element","tag":"pre","props":{"className":"language-shell shiki shiki-themes github-light github-dark","code":"php artisan restify:auth --actions=login,register\n","language":"shell","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:auth"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --actions=login,register\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now, you can make any necessary changes to these controllers to fit your specific requirements."}]},{"type":"element","tag":"h3","props":{"id":"customizing-the-register-route"},"children":[{"type":"text","value":"Customizing the Register Route"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In a real-world scenario, you might need to customize only the register route. To do this, you can use the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"restify:auth"}]},{"type":"text","value":" command with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--actions"}]},{"type":"text","value":" option to publish only the register controller:"}]},{"type":"element","tag":"pre","props":{"className":"language-shell shiki shiki-themes github-light github-dark","code":"php artisan restify:auth --actions=register\n","language":"shell","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:auth"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --actions=register\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"After running the command, the register controller will be published to your application, and you can modify it to fit your requirements."}]},{"type":"element","tag":"alert","props":{"type":"warning"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Important Note: If you want to publish other actions in the future, you'll need to manually update the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"routes/api.php"}]},{"type":"text","value":" file before running the restify:auth command again. Remove any previously published Restify routes, and keep the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Route::restifyAuth();"}]},{"type":"text","value":" line so that the new routes can be correctly published."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For example, if you previously published the register route, your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"routes/api.php"}]},{"type":"text","value":" file might look like this:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// ...\n\nRoute::restifyAuth(actions: [\"login\", \"resetPassword\", \"forgotPassword\", \"verifyEmail\"]);\n\n// ...\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Route"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"restifyAuth"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"actions"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"login\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"resetPassword\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"forgotPassword\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"verifyEmail\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// ...\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Before running the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"restify:auth"}]},{"type":"text","value":" command again, revert the file to its original state:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// ...\n\nRoute::restifyAuth();\n\n// ...\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Route"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"restifyAuth"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// ...\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now you can run the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"restify:auth"}]},{"type":"text","value":" command with other actions, and the routes will be published correctly."}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"quick-start","depth":2,"text":"Quick start"},{"id":"prerequisites","depth":2,"text":"Prerequisites","children":[{"id":"install-sanctum","depth":3,"text":"Install sanctum"},{"id":"define-auth-model","depth":3,"text":"Define auth model"}]},{"id":"define-routes","depth":2,"text":"Define routes"},{"id":"sanctum-middleware","depth":2,"text":"Sanctum Middleware"},{"id":"login","depth":2,"text":"Login","children":[{"id":"authorization","depth":3,"text":"Authorization"}]},{"id":"register","depth":2,"text":"Register"},{"id":"forgot-password","depth":2,"text":"Forgot Password"},{"id":"reset-password","depth":2,"text":"Reset Password"},{"id":"customizing-authentication-controllers","depth":2,"text":"Customizing Authentication Controllers","children":[{"id":"customizing-the-register-route","depth":3,"text":"Customizing the Register Route"}]}]}},"_type":"markdown","_id":"content:auth:authentication.md","_source":"content","_file":"auth/authentication.md","_stem":"auth/authentication","_extension":"md"},"hash":"IFUrQVnfR8"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/auth/authorization.md b/docs-v3/.nuxt/content-cache/parsed/content/auth/authorization.md new file mode 100644 index 000000000..1ae2b2c56 --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/auth/authorization.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/auth/authorization","_dir":"auth","_draft":false,"_partial":false,"_locale":"","title":"Authorization","description":"After setting up the Restify configuration and the authentication, the next logical step is to protect your API Repositories against unauthorized users.","menuTitle":"Authorization","category":"Auth","position":1,"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"After setting up the Restify configuration and the authentication, the next logical step is to protect your API Repositories against unauthorized users."}]},{"type":"element","tag":"h2","props":{"id":"request-lifecycle"},"children":[{"type":"text","value":"Request lifecycle"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Before diving into details about authorization, it is important for you to understand what is the actual lifecycle of the request. On that account, you can know what to expect and how to debug your app at any point."}]},{"type":"element","tag":"h3","props":{"id":"booting"},"children":[{"type":"text","value":"Booting"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When you run a request (ie via Postman), it hits the Laravel application. Laravel will load every single Service Provider it has defined into "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"config/app.php"}]},{"type":"text","value":" and "},{"type":"element","tag":"a","props":{"href":"https://laravel.com/docs/packages#package-discovery","rel":["nofollow"]},"children":[{"type":"text","value":"auto discovered "}]},{"type":"text","value":" providers as well."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify injects the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"RestifyApplicationServiceProvider"}]},{"type":"text","value":" in your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"config/app.php"}]},{"type":"text","value":" and it also has an auto discovered provider called "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"\\Binaryk\\LaravelRestify\\LaravelRestifyServiceProvider"}]},{"type":"text","value":"."}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"LaravelRestifyServiceProvider"}]},{"type":"text","value":" is booted first. This will basically push the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"RestifyInjector"}]},{"type":"text","value":" middleware at the end of the middleware stack."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Then, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"RestifyApplicationServiceProvider"}]},{"type":"text","value":" is booted. This will define the gate, will load repositories and make the auth routes macro. You now have full control over this provider."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"RestifyInjector"}]},{"type":"text","value":" will be handled. It will register all the routes."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"On each request, if the requested route is a Restify route, Laravel will handle other middlewares defined in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"restify.php"}]},{"type":"text","value":" -> "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"middleware"}]},{"type":"text","value":". Here is where you should have the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"auth:sanctum"}]},{"type":"text","value":" middleware to protect your API against unauthenticated users."}]}]},{"type":"element","tag":"h2","props":{"id":"prerequisites"},"children":[{"type":"text","value":"Prerequisites"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Before we dive into the details of authorization, we need to make sure that you have a basic understanding of how Laravel's authorization works. If you are not familiar with it, we highly recommend reading the "},{"type":"element","tag":"a","props":{"href":"https://laravel.com/docs/authorization","rel":["nofollow"]},"children":[{"type":"text","value":"documentation"}]},{"type":"text","value":" before you move forward."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You may also visit the "},{"type":"element","tag":"a","props":{"href":"/auth/authentication#authorization"},"children":[{"type":"text","value":"Authentication/login"}]},{"type":"text","value":" section to learn how to login and use the Bearer token."}]},{"type":"element","tag":"h2","props":{"id":"view-restify"},"children":[{"type":"text","value":"View Restify"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Since we are now aware of how Restify boots itself, let's see how to guard it."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's take a closer look at the package's global gate:"}]},{"type":"element","tag":"alert","props":{},"children":[{"type":"text","value":"\n This gate is only active in a non-local environment. \n"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// app/Providers/RestifyServiceProvider.php\n\nprotected function gate()\n{\n Gate::define('viewRestify', function ($user) {\n return in_array($user->email, [\n //\n ]);\n });\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// app/Providers/RestifyServiceProvider.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"protected"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" gate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Gate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"define"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'viewRestify'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($user) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" in_array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"email, [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This is the first gate to access the Restify repositories. In a real-life project, you may allow every authenticated user to have access to repositories and just after that, by using policies you can restrict certain specific actions. To do so:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"Gate::define('viewRestify', function ($user) {\n return true;\n});\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Gate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"define"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'viewRestify'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($user) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"});\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you want to allow unauthenticated users to be authorized to see the restify routes, you can nullify the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$user"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"Gate::define('viewRestify', function ($user = null) {\n return true;\n});\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Gate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"define"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'viewRestify'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($user "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":") {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"});\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"From this point, it's highly recommended to have a policy for each model exposed via Restify. Otherwise, users may access unauthorized resources, which is not what we want."}]},{"type":"element","tag":"h2","props":{"id":"policies"},"children":[{"type":"text","value":"Policies"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you are not aware of what a policy is, we highly recommend reading the "},{"type":"element","tag":"a","props":{"href":"https://laravel.com/docs/authorization#creating-policies","rel":["nofollow"]},"children":[{"type":"text","value":"documentation"}]},{"type":"text","value":" before you move forward."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can use the Laravel command for generating a policy. It is greatly recommended to generate a policy using the Restify command because it will scaffold Restify's CRUD authorization methods for you:"}]},{"type":"element","tag":"pre","props":{"className":"language-shell shiki shiki-themes github-light github-dark","code":"php artisan restify:policy UserPolicy\n","language":"shell","meta":"script","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:policy"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" UserPolicy\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"It will automatically detect the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"User"}]},{"type":"text","value":" model (the word before "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Policy"}]},{"type":"text","value":"). However, you can set out the following example:"}]},{"type":"element","tag":"pre","props":{"className":"language-shell shiki shiki-themes github-light github-dark","code":"php artisan restify:policy PostPolicy --model=Post\n","language":"shell","meta":"script","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:policy"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" PostPolicy"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --model=Post\n"}]}]}]}]},{"type":"element","tag":"alert","props":{},"children":[{"type":"text","value":"\nIt will ultimately be considered that the model lives into the `app/Models` directory.\n"}]},{"type":"element","tag":"alert","props":{"type":"warning"},"children":[{"type":"text","value":"\nBy default, Restify will unauthorize any requests if there isn't a defined policy method associated to the request's endpoint. Or, if you don't have a policy at all, all requests from that repository will be unauthorized.\n"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you already have a policy, here is the Restify default scaffolded one so you can apply these methods on your own:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"namespace App\\Policies;\n\nuse App\\Models\\Post;\nuse App\\Models\\User;\nuse Illuminate\\Auth\\Access\\HandlesAuthorization;\n\nclass PostPolicy\n{\n use HandlesAuthorization;\n\n public function allowRestify(User $user = null): bool\n {\n //\n }\n\n public function show(User $user, Post $model): bool\n {\n //\n }\n\n public function store(User $user): bool\n {\n //\n }\n\n public function storeBulk(User $user): bool\n {\n //\n }\n\n public function update(User $user, Post $model): bool\n {\n //\n }\n\n public function updateBulk(User $user, Post $model): bool\n {\n //\n }\n\n public function delete(User $user, Post $model): bool\n {\n //\n }\n\n public function deleteBulk(User $user, Post $model): bool\n {\n //\n }\n\n public function restore(User $user, Post $model): bool\n {\n //\n }\n\n public function forceDelete(User $user, Post $model): bool\n {\n //\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"namespace"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" App\\Policies"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" App\\Models\\Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" App\\Models\\User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Auth\\Access\\HandlesAuthorization"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostPolicy\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" HandlesAuthorization"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" allowRestify"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" show"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" store"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" storeBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" update"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":35},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":36},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" updateBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":37},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":38},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":39},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":40},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":41},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" delete"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":42},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":43},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":44},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":45},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":46},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" deleteBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":47},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":48},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":49},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":50},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":51},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" restore"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":52},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":53},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":54},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":55},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":56},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" forceDelete"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":57},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":58},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":59},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":60},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"alert","props":{"type":"info"},"children":[{"type":"text","value":"\nFor the examples below, we will consider PostRepository as being a pertinent example.\n"}]},{"type":"element","tag":"h3","props":{"id":"allow-restify"},"children":[{"type":"text","value":"Allow restify"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Just after Restify detects the repository class, it will invoke this method to check if the given user can load this repository in any manner. You can also check if the user is an admin for some specific repositories, such as:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostPolicy\n/**\n * Determine whether the user can use restify feature for each CRUD operation.\n * So if this is not allowed, all operations will be disabled\n * @param User $user\n * @return mixed\n */\npublic function allowRestify(User $user)\n{\n return $user->isAdmin();\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostPolicy\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"/**\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * Determine whether the user can use restify feature for each CRUD operation.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * So if this is not allowed, all operations will be disabled\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $user\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" mixed\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" */\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" allowRestify"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isAdmin"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"allow-show"},"children":[{"type":"text","value":"Allow show"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"From here, each policy corresponds to an exposed Restify route."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In addition, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"show"}]},{"type":"text","value":" method, corresponds to the following routes:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"POST: /api/restify/posts // it will filter out the entities you don't have access to from the pagination\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"POST: /api/restify/posts // it will filter out the entities you don't have access to from the pagination\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"and:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"POST: /api/restify/posts/{id} // it will give a 403 Forbidden status if you don't have access to the resource\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"POST: /api/restify/posts/{id} // it will give a 403 Forbidden status if you don't have access to the resource\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Definition:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"/**\n * Determine whether the user can get the model.\n *\n * @param User $user\n * @param Post $model\n * @return mixed\n */\npublic function show(User $user, Post $model)\n{\n //\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"/**\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * Determine whether the user can get the model.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" *\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $user\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $model\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" mixed\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" */\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" show"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"allow-store"},"children":[{"type":"text","value":"Allow store"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Determine if a specific user has access to the POST's route in order to create an entity."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"store"}]},{"type":"text","value":" method, corresponds to the following route:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"POST: /api/restify/posts\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"POST: /api/restify/posts\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Definition:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"/**\n * Determine whether the user can create models.\n *\n * @param User $user\n * @return mixed\n */\npublic function store(User $user)\n{\n //\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"/**\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * Determine whether the user can create models.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" *\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $user\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" mixed\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" */\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" store"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"allow-storebulk"},"children":[{"type":"text","value":"Allow storeBulk"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Determine if the user can store multiple entities at once."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"storeBulk"}]},{"type":"text","value":" method corresponds to the following route:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"POST: api/posts/bulk\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"POST: api/posts/bulk\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Definition:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"/**\n * Determine whether the user can create multiple models at once.\n *\n * @param User $user\n * @return mixed\n */\npublic function storeBulk(User $user)\n{\n //\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"/**\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * Determine whether the user can create multiple models at once.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" *\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $user\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" mixed\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" */\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" storeBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"allow-update"},"children":[{"type":"text","value":"Allow update"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Determine if the user can update a specific model."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"update"}]},{"type":"text","value":" method corresponds to the following routes:"}]},{"type":"element","tag":"code-group","props":{},"children":[{"type":"text","value":"\n "},{"type":"element","tag":"code-block","props":{"label":"Full Update","active":""},"children":[{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"PUT: api/restify/posts/{id}\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"PUT: api/restify/posts/{id}\n"}]}]}]}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "},{"type":"element","tag":"code-block","props":{"label":"Partial Update"},"children":[{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"PATCH: api/restify/posts/{id}\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"PATCH: api/restify/posts/{id}\n"}]}]}]}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "},{"type":"element","tag":"code-block","props":{"label":"File uploads"},"children":[{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"POST: api/restify/posts/{id}\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"POST: api/restify/posts/{id}\n"}]}]}]}]},{"type":"text","value":"\n "}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Definition:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"/**\n * Determine whether the user can update the model.\n *\n * @param User $user\n * @param Post $model\n * @return mixed\n */\npublic function update(User $user, Post $model)\n{\n //\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"/**\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * Determine whether the user can update the model.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" *\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $user\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $model\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" mixed\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" */\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" update"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"allow-updatebulk"},"children":[{"type":"text","value":"Allow updateBulk"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Determine if the user can update multiple entities at once. When you bulk update, this method will be invoked for each entity you're trying to update. If at least one will return false - none will be updated. The reason behind that is that the bulk update is a DB transaction."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"updateBulk"}]},{"type":"text","value":" method, corresponds to the following route:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"POST: api/restify/posts/bulk/update\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"POST: api/restify/posts/bulk/update\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Definition:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"/**\n * Determine whether the user can update bulk the model.\n *\n * @param User $user\n * @param Post $model\n * @return mixed\n */\npublic function updateBulk(User $user = null, Post $model)\n{\n return true;\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"/**\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * Determine whether the user can update bulk the model.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" *\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $user\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $model\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" mixed\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" */\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" updateBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"allow-delete"},"children":[{"type":"text","value":"Allow delete"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The delete endpoint policy."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"delete"}]},{"type":"text","value":" method, corresponds to the following route:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"DELETE: api/restify/posts/{id}\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"DELETE: api/restify/posts/{id}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Definition:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"/**\n * Determine whether the user can delete the model.\n *\n * @param User $user\n * @param Post $model\n * @return mixed\n */\npublic function delete(User $user, Post $model)\n{\n //\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"/**\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * Determine whether the user can delete the model.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" *\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $user\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $model\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" mixed\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" */\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" delete"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"allow-deletebulk"},"children":[{"type":"text","value":"Allow deleteBulk"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Determine if the user can delete multiple entities at once. When performing bulk deletion, this method will be invoked for each entity you're trying to delete."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The deleteBulk method corresponds to the following route:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"DELETE: api/restify/posts/bulk/delete\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"DELETE: api/restify/posts/bulk/delete\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Definition:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"/**\n * Determine whether the user can delete multiple models at once.\n *\n * @param User $user\n * @param Post $model\n * @return mixed\n */\npublic function deleteBulk(User $user, Post $model)\n{\n //\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"/**\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * Determine whether the user can delete multiple models at once.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" *\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $user\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $model\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" mixed\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" */\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" deleteBulk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"allow-attach"},"children":[{"type":"text","value":"Allow Attach"}]},{"type":"element","tag":"alert","props":{"type":"warning"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Here is where we're talking about pivot tables. Many to many relationships."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When attaching a model to another, we should check if the user is also able to do that. For example, attaching posts to a user:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"POST: api/restify/users/{id}/attach/posts\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"POST: api/restify/users/{id}/attach/posts\n"}]}]}]}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{ \"posts\": [1, 2, 3] }\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{ "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\"posts\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"2"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"3"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"] }\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify will guess the policy's name by the related entity. For this reason, it will be "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"attachPost"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// UserPolicy.php\n\n/**\n * Determine if the post could be attached to the user.\n *\n * @param User $user\n * @param Post $model\n * @return mixed\n */\npublic function attachPost(User $user, Post $model)\n{\n return $user->is($model->creator()->first());\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// UserPolicy.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"/**\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * Determine if the post could be attached to the user.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" *\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $user\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $model\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" mixed\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" */\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" attachPost"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"is"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"creator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"first"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"());\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"attachPost"}]},{"type":"text","value":" method will be called for each individual post."}]},{"type":"element","tag":"h3","props":{"id":"allow-detach"},"children":[{"type":"text","value":"Allow Detach"}]},{"type":"element","tag":"alert","props":{"type":"warning"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Here we're talking about pivot tables. Many to many relationships."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When detaching a model from another, we should check if the user is also able to do that. For example, detaching posts from a user:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"POST: api/restify/users/{id}/detach/posts\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"POST: api/restify/users/{id}/detach/posts\n"}]}]}]}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{ \"posts\": [1, 2, 3] }\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{ "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\"posts\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"2"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"3"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"] }\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify will guess the policy's name by the related entity. For this reason, it will be "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"detachPost"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"/**\n * Determine if the post could be attached to the user.\n *\n * @param User $user\n * @param Post $model\n * @return mixed\n */\npublic function detachPost(User $user, Post $model)\n{\n return $user->is($model->creator()->first());\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"/**\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * Determine if the post could be attached to the user.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" *\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $user\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@param"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" $model\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" * "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"@return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" mixed\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" */\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" detachPost"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"User"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"is"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"creator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"first"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"());\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"detachPost"}]},{"type":"text","value":" method, will be called for each post in part."}]},{"type":"element","tag":"h2","props":{"id":"register-policy"},"children":[{"type":"text","value":"Register Policy"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"A common mistake is that sometimes you may define a policy, but you don't attach it to a model in your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"app/Providers/AuthServiceProvider.php"}]},{"type":"text","value":". Make sure you have it figured out here."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"See "},{"type":"element","tag":"a","props":{"href":"https://laravel.com/docs/authorization#registering-policies","rel":["nofollow"]},"children":[{"type":"text","value":"documentation"}]},{"type":"text","value":"."}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"request-lifecycle","depth":2,"text":"Request lifecycle","children":[{"id":"booting","depth":3,"text":"Booting"}]},{"id":"prerequisites","depth":2,"text":"Prerequisites"},{"id":"view-restify","depth":2,"text":"View Restify"},{"id":"policies","depth":2,"text":"Policies","children":[{"id":"allow-restify","depth":3,"text":"Allow restify"},{"id":"allow-show","depth":3,"text":"Allow show"},{"id":"allow-store","depth":3,"text":"Allow store"},{"id":"allow-storebulk","depth":3,"text":"Allow storeBulk"},{"id":"allow-update","depth":3,"text":"Allow update"},{"id":"allow-updatebulk","depth":3,"text":"Allow updateBulk"},{"id":"allow-delete","depth":3,"text":"Allow delete"},{"id":"allow-deletebulk","depth":3,"text":"Allow deleteBulk"},{"id":"allow-attach","depth":3,"text":"Allow Attach"},{"id":"allow-detach","depth":3,"text":"Allow Detach"}]},{"id":"register-policy","depth":2,"text":"Register Policy"}]}},"_type":"markdown","_id":"content:auth:authorization.md","_source":"content","_file":"auth/authorization.md","_stem":"auth/authorization","_extension":"md"},"hash":"fcBzkZoQcG"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/auth/profile.md b/docs-v3/.nuxt/content-cache/parsed/content/auth/profile.md new file mode 100644 index 000000000..0221e617d --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/auth/profile.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/auth/profile","_dir":"auth","_draft":false,"_partial":false,"_locale":"","title":"User Profile","description":"","menuTitle":"Profile","category":"Auth","position":1,"body":{"type":"root","children":[{"type":"element","tag":"h2","props":{"id":"prerequisites"},"children":[{"type":"text","value":"Prerequisites"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Make sure you followed the "},{"type":"element","tag":"a","props":{"href":"/docs/auth/authentication"},"children":[{"type":"text","value":"Authentication"}]},{"type":"text","value":" guide before, because one common mistake is that people do not add this middleware:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// config/restify.php\n'middleware' => [\n// ...\n 'auth:sanctum',\n// ...\n]\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// config/restify.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'middleware'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'auth:sanctum'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"get-profile"},"children":[{"type":"text","value":"Get profile"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Before retrieving the user's profile, you need to log in and obtain an authentication token. You can refer to the "},{"type":"element","tag":"a","props":{"href":"/auth/authentication#login"},"children":[{"type":"text","value":"login documentation"}]},{"type":"text","value":" for details on how to authenticate a user. Make sure to include the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Bearer {$token}"}]},{"type":"text","value":" in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Authorization"}]},{"type":"text","value":" header for the subsequent API requests, either using Postman or cURL."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When retrieving the user's profile, it is serialized by using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"UserRepository"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/profile\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/profile\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Here's an example of a cURL request for retrieving the user's profile with a random token:"}]},{"type":"element","tag":"pre","props":{"className":"language-bash shiki shiki-themes github-light github-dark","code":"curl -X GET \"http://your-domain.com/api/restify/profile\" \\\n -H \"Accept: application/json\" \\\n -H \"Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...\"\n","language":"bash","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"curl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" -X"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" GET"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"http://your-domain.com/api/restify/profile\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" -H"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"Accept: application/json\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" -H"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...\"\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Replace "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"http://your-domain.com"}]},{"type":"text","value":" with your actual domain and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9..."}]},{"type":"text","value":" with the authentication token you obtained after logging in."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This is what we have for a basic profile:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"id\": \"7\",\n \"type\": \"users\",\n \"attributes\": {\n \"name\": \"Eduard\",\n \"email\": \"interstelar@me.com\"\n },\n \"meta\": {\n \"authorizedToShow\": true,\n \"authorizedToStore\": true,\n \"authorizedToUpdate\": true,\n \"authorizedToDelete\": true\n }\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"7\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"users\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Eduard\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"email\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"interstelar@me.com\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToShow\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToStore\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToUpdate\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToDelete\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can add more "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fields"}]},{"type":"text","value":" in your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"UserRepository"}]},{"type":"text","value":" if you want to display them."}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function fields(RestifyRequest $request): array\n{\n return [\n field('name')->rules('required'),\n\n field('email')->rules('required')->storingRules('unique:users'),\n\n field('age')\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"storingRules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'unique:users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'age'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Since the profile is nicely set on by using the UserRepository, you can now benefit from the power of the related entities. For example,\nif you want to return user roles:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"//UserRepository\n\npublic static array $related = [\n 'roles',\n];\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"//UserRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $related "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'roles'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"];\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Also, make sure that the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"User"}]},{"type":"text","value":" model has this method that returns a relationship from another table. You can do that or you can simply\nreturn an array:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"//User.php\n\npublic function roles(): array\n{\n // In a real project, here you will get this information from the database.\n return [\n 'owner',\n 'admin'\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"//User.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" roles"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // In a real project, here you will get this information from the database.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'owner'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'admin'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now, let's get the profile by using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"roles"}]},{"type":"text","value":" relationship:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/profile?include=roles\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/profile?include=roles\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The result will look like this:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"id\": \"7\",\n \"type\": \"users\",\n \"attributes\": {\n \"name\": \"Eduard\",\n \"email\": \"interstelar@me.com\"\n },\n \"relationships\": {\n \"roles\": [\n \"owner\",\n \"admin\"\n ]\n },\n \"meta\": {\n \"authorizedToShow\": true,\n \"authorizedToStore\": true,\n \"authorizedToUpdate\": true,\n \"authorizedToDelete\": true\n }\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"7\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"users\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Eduard\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"email\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"interstelar@me.com\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"relationships\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"roles\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"owner\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"admin\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToShow\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToStore\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToUpdate\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToDelete\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"without-repository"},"children":[{"type":"text","value":"Without repository"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In some cases, you might choose not to use the repository for the profile serialization. Afterwards, you should add the\ntrait "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Binaryk\\LaravelRestify\\Repositories\\UserProfile"}]},{"type":"text","value":" into your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"UserRepository"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// UserProfile\n\nuse Binaryk\\LaravelRestify\\Repositories\\UserProfile;\n\nclass UserRepository extends Repository\n{\n use UserProfile;\n\n public static $model = 'App\\\\Models\\\\User';\n \n //...\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// UserProfile\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Repositories\\UserProfile"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" UserProfile"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'App"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\\\"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"Models"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\\\"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"User'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The profile will return the model directly:"}]},{"type":"element","tag":"h3","props":{"id":"relations"},"children":[{"type":"text","value":"Relations"}]},{"type":"element","tag":"alert","props":{"type":"warning"},"children":[{"type":"text","value":" \n"},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Note that when you're not using the repository, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"?include"}]},{"type":"text","value":" will not work anymore."}]}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"/api/restify/profile\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"/api/restify/profile\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You will get:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"data\": {\n \"id\": 7,\n \"name\": \"Eduard\",\n \"email\": \"interstelar@me.com\",\n \"email_verified_at\": null,\n \"created_at\": \"2020-12-24T08:49:30.000000Z\",\n \"updated_at\": \"2020-12-24T08:52:37.000000Z\"\n }\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"data\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"7"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Eduard\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"email\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"interstelar@me.com\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"email_verified_at\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"created_at\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"2020-12-24T08:49:30.000000Z\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"updated_at\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"2020-12-24T08:52:37.000000Z\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"conditionally-use-repository"},"children":[{"type":"text","value":"Conditionally use repository"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In rare cases you may want to utilize the repository only for non admin users. Make sure to serialize\nspecific fields for the users:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"use Binaryk\\LaravelRestify\\Fields\\Field;\nuse Binaryk\\LaravelRestify\\Http\\Requests\\RestifyRequest;\nuse Binaryk\\LaravelRestify\\Repositories\\UserProfile;\nuse Illuminate\\Http\\Request;\n\nclass UserRepository extends Repository\n{\n use UserProfile;\n\n public static $model = 'App\\\\Models\\\\User';\n\n public static function canUseForProfile(Request $request)\n {\n return $request->user()->isAdmin();\n }\n \n public function fields(RestifyRequest $request)\n {\n return [\n field('name')->rules('required'),\n\n field('email')->rules('required')\n ->storingRules('unique:users')->messages([\n 'required' => 'This field is required.',\n ]),\n ];\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Fields\\Field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Http\\Requests\\RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Repositories\\UserProfile"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Http\\Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" UserProfile"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $model "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'App"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\\\"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"Models"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\\\"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"User'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" canUseForProfile"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isAdmin"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"storingRules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'unique:users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"messages"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"([\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'This field is required.'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Thus, you instruct Restify to only use the repository for users who are admins of your application."}]},{"type":"element","tag":"h2","props":{"id":"update-profile-using-repository"},"children":[{"type":"text","value":"Update Profile using repository"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By default, Restify will validate and fill only the fields presented in your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"UserRepository"}]},{"type":"text","value":" for updating the user's\nprofile. Let's get as an example the following repository fields:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// UserRepository\n\npublic function fields(RestifyRequest $request)\n{\n return [\n field('name')->rules('required'),\n\n field('email')->storingRules('required', 'unique:users')->messages([\n 'required' => 'This field is required.',\n ]),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// UserRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"storingRules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'unique:users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"messages"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"([\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'This field is required.'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If we will try to call the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PUT"}]},{"type":"text","value":" method to update the profile without data:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We will get back a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"4xx"}]},{"type":"text","value":" validation:"}]},{"type":"element","tag":"alert","props":{"type":"warning"},"children":[{"type":"text","value":" \n"},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Accept header if you test it via Postman (or other HTTP client) and make sure you always pass the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Accept"}]},{"type":"text","value":"\nheader "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"application/json"}]},{"type":"text","value":". This will instruct Laravel to return you back the json formatted data:"}]}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"message\": \"The given data was invalid.\",\n \"errors\": {\n \"name\": [\n \"The name field is required.\"\n ]\n }\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"message\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"The given data was invalid.\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"errors\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"The name field is required.\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's say we have to populate the user "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"name"}]},{"type":"text","value":" in the payload:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"name\": \"Eduard Lupacescu\"\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Eduard Lupacescu\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Since the payload is valid now, Restify will update the user's profile (a name, in our case):"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"id\": \"7\",\n \"type\": \"users\",\n \"attributes\": {\n \"name\": \"Eduard Lupacescu\",\n \"email\": \"interstelar@me.com\"\n },\n \"meta\": {\n \"authorizedToShow\": true,\n \"authorizedToStore\": true,\n \"authorizedToUpdate\": true,\n \"authorizedToDelete\": true\n }\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"7\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"users\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"attributes\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Eduard Lupacescu\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"email\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"interstelar@me.com\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToShow\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToStore\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToUpdate\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"authorizedToDelete\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"update-without-repository"},"children":[{"type":"text","value":"Update without repository"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you "},{"type":"element","tag":"a","props":{"href":"./#get-profile-using-repository"},"children":[{"type":"text","value":"don't use the repository"}]},{"type":"text","value":" for the user's profile, Restify will only\nupdate the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fillable"}]},{"type":"text","value":" user attributes that are present in the request payload: "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$request->only($user->getFillable())"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"PUT: /api/restify/profile\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"PUT: /api/restify/profile\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Payload:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"name\": \"Eduard Lupacescu\"\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Eduard Lupacescu\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The response will be the updated user:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"data\": {\n \"id\": 7,\n \"name\": \"Eduard\",\n \"email\": \"interstelar@me.com\",\n \"email_verified_at\": null,\n \"created_at\": \"2020-12-24T08:49:30.000000Z\",\n \"updated_at\": \"2020-12-24T09:34:48.000000Z\"\n }\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"data\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"id\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"7"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Eduard\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"email\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"interstelar@me.com\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"email_verified_at\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"created_at\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"2020-12-24T08:49:30.000000Z\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"updated_at\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"2020-12-24T09:34:48.000000Z\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"user-avatar"},"children":[{"type":"text","value":"User avatar"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To prepare your users for avatars, you can add the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"avatar"}]},{"type":"text","value":" column in your users' table:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// Migration\npublic function up()\n{\n Schema::table('users', function( Blueprint $t) {\n $t->string('avatar')->nullable();\n });\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Migration\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" up"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Schema"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"table"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"( "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Blueprint"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $t) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $t"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'avatar'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"nullable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now, you should specify in the user repository that the user has an avatar file:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"use Binaryk\\LaravelRestify\\Fields\\Image;\n\npublic function fields(RestifyRequest $request)\n{\n return [\n field('name')->rules('required'),\n\n field('avatar')->image()->storeAs('avatar.jpg')\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Fields\\Image"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'avatar'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"image"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"storeAs"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'avatar.jpg'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can use the Restify's profile update and give the avatar as an image."}]},{"type":"element","tag":"h3","props":{"id":"post-request"},"children":[{"type":"text","value":"Post request"}]},{"type":"element","tag":"alert","props":{"type":"warning"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You cannot upload a file by using PUT or PATCH verbs, so we should use a POST request instead."}]}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"POST: /api/restify/profile\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"POST: /api/restify/profile\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The payload should be a form-data, with an image under the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"avatar"}]},{"type":"text","value":" key:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"avatar\": \"binary image in form data request\"\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"avatar\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"binary image in form data request\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you have to customize the path or disk of the storage file, check the "},{"type":"element","tag":"a","props":{"href":"../repository-pattern/field.html#file-fields"},"children":[{"type":"text","value":"image field"}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"prerequisites","depth":2,"text":"Prerequisites"},{"id":"get-profile","depth":2,"text":"Get profile","children":[{"id":"without-repository","depth":3,"text":"Without repository"},{"id":"relations","depth":3,"text":"Relations"},{"id":"conditionally-use-repository","depth":3,"text":"Conditionally use repository"}]},{"id":"update-profile-using-repository","depth":2,"text":"Update Profile using repository","children":[{"id":"update-without-repository","depth":3,"text":"Update without repository"}]},{"id":"user-avatar","depth":2,"text":"User avatar","children":[{"id":"post-request","depth":3,"text":"Post request"}]}]}},"_type":"markdown","_id":"content:auth:profile.md","_source":"content","_file":"auth/profile.md","_stem":"auth/profile","_extension":"md"},"hash":"1QTi4ilI7S"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/boost/boost.md b/docs-v3/.nuxt/content-cache/parsed/content/boost/boost.md new file mode 100644 index 000000000..0077ac67b --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/boost/boost.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/boost/boost","_dir":"boost","_draft":false,"_partial":false,"_locale":"","title":"Model Context Protocol (MCP)","description":"","menuTitle":"Restify Boost","category":"Boost","position":20,"body":{"type":"root","children":[{"type":"element","tag":"h2","props":{"id":"mcp-server-for-laravel-restify-developers"},"children":[{"type":"text","value":"MCP Server for Laravel Restify Developers"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify Boost provides a dedicated "},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"MCP server for developers"}]},{"type":"text","value":" that enhances the development experience when working with Laravel Restify APIs."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Repository"}]},{"type":"text","value":": "},{"type":"element","tag":"a","props":{"href":"https://github.com/BinarCode/laravel-restify-boost","rel":["nofollow"]},"children":[{"type":"text","value":"https://github.com/BinarCode/laravel-restify-boost"}]}]},{"type":"element","tag":"h3","props":{"id":"developer-mcp-server-features"},"children":[{"type":"text","value":"Developer MCP Server Features"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The Laravel Restify MCP server provides AI agents with powerful development tools:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"📚 Documentation Access"}]},{"type":"text","value":": Query Laravel Restify documentation directly from your AI agent"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"🏗️ Repository Generation"}]},{"type":"text","value":": Create new repositories with proper structure and conventions"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"⚡ Action Creation"}]},{"type":"text","value":": Generate custom actions for your API resources with validation and best practices"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"🔍 Getter Development"}]},{"type":"text","value":": Build custom getters for specialized data retrieval operations"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"💡 Code Examples"}]},{"type":"text","value":": Get contextual code examples and implementation guidance"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"🎯 Best Practices"}]},{"type":"text","value":": Receive Laravel Restify best practices and architectural guidance"}]}]},{"type":"element","tag":"h3","props":{"id":"installation-setup"},"children":[{"type":"text","value":"Installation & Setup"}]},{"type":"element","tag":"h4","props":{"id":"install-the-mcp-server"},"children":[{"type":"text","value":"Install the MCP Server"}]},{"type":"element","tag":"pre","props":{"code":"composer require --dev binarcode/laravel-restify-boost\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"composer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" require"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --dev"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" binarcode/laravel-restify-boost\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"configure-ai-agents"},"children":[{"type":"text","value":"Configure AI Agents"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Configure your AI agent (Claude Desktop, Cursor, etc.) to use the MCP server:"}]},{"type":"element","tag":"pre","props":{"code":"{\n \"mcpServers\": {\n \"laravel-restify\": {\n \"command\": \"php\",\n \"args\": [\n \"artisan\",\n \"restify-boost:start\"\n ]\n }\n }\n}\n","language":"json","meta":"","className":"language-json shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"mcpServers\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"laravel-restify\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"command\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"php\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"args\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"artisan\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" \"restify-boost:start\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"usage-examples"},"children":[{"type":"text","value":"Usage Examples"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Once configured, your AI agent can help with:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Creating Repositories:"}]}]},{"type":"element","tag":"pre","props":{"code":"AI: Create a PostRepository with title, content, and author fields\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"AI: Create a PostRepository with title, content, and author fields\n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Generating Actions:"}]}]},{"type":"element","tag":"pre","props":{"code":"AI: Create a PublishPostAction that validates publish dates and notifies subscribers\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"AI: Create a PublishPostAction that validates publish dates and notifies subscribers\n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Building Getters:"}]}]},{"type":"element","tag":"pre","props":{"code":"AI: Generate a PostAnalyticsGetter that returns engagement metrics for date ranges\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"AI: Generate a PostAnalyticsGetter that returns engagement metrics for date ranges\n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Documentation Queries:"}]}]},{"type":"element","tag":"pre","props":{"code":"AI: How do I implement field validation in Laravel Restify?\nAI: Show me examples of custom repository authorization\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"AI: How do I implement field validation in Laravel Restify?\nAI: Show me examples of custom repository authorization\n"}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"mcp-server-for-laravel-restify-developers","depth":2,"text":"MCP Server for Laravel Restify Developers","children":[{"id":"developer-mcp-server-features","depth":3,"text":"Developer MCP Server Features"},{"id":"installation-setup","depth":3,"text":"Installation & Setup"}]}]}},"_type":"markdown","_id":"content:boost:boost.md","_source":"content","_file":"boost/boost.md","_stem":"boost/boost","_extension":"md"},"hash":"ID8ythy2Oe"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/graphql/graphql-generation.md b/docs-v3/.nuxt/content-cache/parsed/content/graphql/graphql-generation.md new file mode 100644 index 000000000..734245c30 --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/graphql/graphql-generation.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/graphql/graphql-generation","_dir":"graphql","_draft":false,"_partial":false,"_locale":"","title":"GraphQL Schema Generation","description":"Laravel Restify can automatically generate GraphQL schemas and resolvers from your existing Restify repositories, allowing you to quickly add GraphQL capabilities to your API.","menuTitle":"Schema Generation","category":"GraphQL","position":17,"body":{"type":"root","children":[{"type":"element","tag":"h1","props":{"id":"graphql-schema-generation"},"children":[{"type":"text","value":"GraphQL Schema Generation"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Laravel Restify can automatically generate GraphQL schemas and resolvers from your existing Restify repositories, allowing you to quickly add GraphQL capabilities to your API."}]},{"type":"element","tag":"h2","props":{"id":"overview"},"children":[{"type":"text","value":"Overview"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The GraphQL generation feature analyzes your Restify repositories and creates:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"GraphQL Type Definitions"}]},{"type":"text","value":" - Based on your repository fields"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Query Operations"}]},{"type":"text","value":" - For fetching individual resources and collections"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Mutation Operations"}]},{"type":"text","value":" - For creating, updating, and deleting resources"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Input Types"}]},{"type":"text","value":" - For mutation operations"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Resolver Classes"}]},{"type":"text","value":" - PHP classes that handle GraphQL operations (optional)"}]}]},{"type":"element","tag":"h2","props":{"id":"installation"},"children":[{"type":"text","value":"Installation"}]},{"type":"element","tag":"h3","props":{"id":"_1-install-lighthouse-graphql"},"children":[{"type":"text","value":"1. Install Lighthouse GraphQL"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"First, install the Lighthouse GraphQL package:"}]},{"type":"element","tag":"pre","props":{"code":"composer require pusher/pusher-php-server lighthouse/lighthouse\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"composer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" require"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" pusher/pusher-php-server"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" lighthouse/lighthouse\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"_2-publish-lighthouse-configuration"},"children":[{"type":"text","value":"2. Publish Lighthouse Configuration"}]},{"type":"element","tag":"pre","props":{"code":"php artisan vendor:publish --tag=lighthouse-config\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" vendor:publish"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --tag=lighthouse-config\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"basic-usage"},"children":[{"type":"text","value":"Basic Usage"}]},{"type":"element","tag":"h3","props":{"id":"generate-graphql-schema"},"children":[{"type":"text","value":"Generate GraphQL Schema"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The simplest way to generate a GraphQL schema from your repositories:"}]},{"type":"element","tag":"pre","props":{"code":"php artisan restify:graphql:generate\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:graphql:generate\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This command will:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Analyze all registered Restify repositories"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Show a preview of what will be generated"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Ask for confirmation before proceeding"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Generate a GraphQL schema file at "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"app/GraphQL/schema.graphql"}]}]}]},{"type":"element","tag":"h3","props":{"id":"generate-with-resolvers"},"children":[{"type":"text","value":"Generate with Resolvers"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To also generate PHP resolver classes:"}]},{"type":"element","tag":"pre","props":{"code":"php artisan restify:graphql:generate --resolvers\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:graphql:generate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --resolvers\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This creates resolver classes in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"app/GraphQL/Resolvers/"}]},{"type":"text","value":" that handle the GraphQL operations."}]},{"type":"element","tag":"h2","props":{"id":"command-options"},"children":[{"type":"text","value":"Command Options"}]},{"type":"element","tag":"h3","props":{"id":"basic-options"},"children":[{"type":"text","value":"Basic Options"}]},{"type":"element","tag":"table","props":{},"children":[{"type":"element","tag":"thead","props":{},"children":[{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"th","props":{},"children":[{"type":"text","value":"Option"}]},{"type":"element","tag":"th","props":{},"children":[{"type":"text","value":"Description"}]}]}]},{"type":"element","tag":"tbody","props":{},"children":[{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--force"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"Overwrite existing files without prompting"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--skip-preview"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"Skip the preview and generate files immediately"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--resolvers"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"Generate PHP resolver classes"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"output-configuration"},"children":[{"type":"text","value":"Output Configuration"}]},{"type":"element","tag":"table","props":{},"children":[{"type":"element","tag":"thead","props":{},"children":[{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"th","props":{},"children":[{"type":"text","value":"Option"}]},{"type":"element","tag":"th","props":{},"children":[{"type":"text","value":"Description"}]},{"type":"element","tag":"th","props":{},"children":[{"type":"text","value":"Default"}]}]}]},{"type":"element","tag":"tbody","props":{},"children":[{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--output-path"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"Directory for generated files"}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"app/GraphQL"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--schema-file"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"Name of the schema file"}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"schema.graphql"}]}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"examples"},"children":[{"type":"text","value":"Examples"}]},{"type":"element","tag":"pre","props":{"code":"# Generate to custom directory\nphp artisan restify:graphql:generate --output-path=resources/graphql\n\n# Use custom schema filename\nphp artisan restify:graphql:generate --schema-file=api-schema.graphql\n\n# Generate everything without prompts\nphp artisan restify:graphql:generate --resolvers --force --skip-preview\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"# Generate to custom directory\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:graphql:generate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --output-path=resources/graphql\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"# Use custom schema filename\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:graphql:generate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --schema-file=api-schema.graphql\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"# Generate everything without prompts\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:graphql:generate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --resolvers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --force"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --skip-preview\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"generated-schema-structure"},"children":[{"type":"text","value":"Generated Schema Structure"}]},{"type":"element","tag":"h3","props":{"id":"type-definitions"},"children":[{"type":"text","value":"Type Definitions"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"UserRepository"}]},{"type":"text","value":", the command generates:"}]},{"type":"element","tag":"pre","props":{"code":"type User {\n id: ID!\n name: String\n email: String\n created_at: String\n updated_at: String\n}\n\ninput UserInput {\n name: String\n email: String\n}\n","language":"graphql","meta":"","className":"language-graphql shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"type User {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" id: ID!\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" name: String\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" email: String\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" created_at: String\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" updated_at: String\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"}\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"input UserInput {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" name: String\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" email: String\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"query-operations"},"children":[{"type":"text","value":"Query Operations"}]},{"type":"element","tag":"pre","props":{"code":"type Query {\n user(id: ID!): User\n userList(first: Int = 15, page: Int = 1): [User!]!\n}\n","language":"graphql","meta":"","className":"language-graphql shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"type Query {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" user(id: ID!): User\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" userList(first: Int = 15, page: Int = 1): [User!]!\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"mutation-operations"},"children":[{"type":"text","value":"Mutation Operations"}]},{"type":"element","tag":"pre","props":{"code":"type Mutation {\n createUser(input: UserInput!): User!\n updateUser(id: ID!, input: UserInput!): User!\n deleteUser(id: ID!): Boolean!\n}\n","language":"graphql","meta":"","className":"language-graphql shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"type Mutation {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" createUser(input: UserInput!): User!\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" updateUser(id: ID!, input: UserInput!): User!\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" deleteUser(id: ID!): Boolean!\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"field-type-mapping"},"children":[{"type":"text","value":"Field Type Mapping"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Laravel Restify fields are automatically mapped to GraphQL types:"}]},{"type":"element","tag":"table","props":{},"children":[{"type":"element","tag":"thead","props":{},"children":[{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"th","props":{},"children":[{"type":"text","value":"Restify Field"}]},{"type":"element","tag":"th","props":{},"children":[{"type":"text","value":"GraphQL Type"}]}]}]},{"type":"element","tag":"tbody","props":{},"children":[{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Field"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Text"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Textarea"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"String"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Number"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Integer"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Int"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Float"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Decimal"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Float"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Boolean"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Toggle"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Boolean"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Date"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DateTime"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"String"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Json"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"JSON"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"MultiSelect"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"[String!]"}]}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BelongsTo"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ID"}]},{"type":"text","value":" (input) / "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"String"}]},{"type":"text","value":" (output)"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"HasMany"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"[ID!]"}]},{"type":"text","value":" (input) / "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"[String!]"}]},{"type":"text","value":" (output)"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"generated-resolvers"},"children":[{"type":"text","value":"Generated Resolvers"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When using "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--resolvers"}]},{"type":"text","value":", the command creates resolver classes with standard CRUD operations:"}]},{"type":"element","tag":"pre","props":{"code":"findOrFail($args['id']);\n\n return $repository->setModel($model)\n ->serializeForShow(RestifyRequest::createFrom(request()));\n }\n\n public function index($root, array $args, $context, $info)\n {\n $repository = new UserRepository();\n $query = $repository::newModel()->query();\n\n $page = $args['page'] ?? 1;\n $perPage = $args['first'] ?? 15;\n\n return $query->paginate($perPage, ['*'], 'page', $page)->items();\n }\n\n public function create($root, array $args, $context, $info)\n {\n $repository = new UserRepository();\n $request = RestifyRequest::createFrom(request());\n $request->merge($args['input']);\n\n return $repository->store($request);\n }\n\n public function update($root, array $args, $context, $info)\n {\n $repository = new UserRepository();\n $request = RestifyRequest::createFrom(request());\n $request->merge($args['input']);\n\n return $repository->update($request, $args['id']);\n }\n\n public function delete($root, array $args, $context, $info)\n {\n $repository = new UserRepository();\n $request = RestifyRequest::createFrom(request());\n\n $repository->destroy($request, $args['id']);\n\n return true;\n }\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"findOrFail"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($args["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"setModel"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($model)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"serializeForShow"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"createFrom"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" index"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($root, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $args, $context, $info)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $repository "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"newModel"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $page "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $args["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'page'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"] "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"??"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" 1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $perPage "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $args["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'first'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"] "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"??"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" 15"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"paginate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($perPage, ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'*'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"], "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'page'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", $page)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"items"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" create"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($root, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $args, $context, $info)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $repository "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"createFrom"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"());\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"merge"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($args["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'input'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":35},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":36},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"store"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":37},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":38},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":39},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" update"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($root, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $args, $context, $info)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":40},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":41},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $repository "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":42},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"createFrom"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"());\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":43},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"merge"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($args["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'input'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":44},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":45},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"update"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request, $args["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":46},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":47},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":48},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" delete"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($root, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $args, $context, $info)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":49},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":50},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $repository "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":51},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"createFrom"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"());\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":52},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":53},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"destroy"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request, $args["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":54},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":55},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":56},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":57},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"configuration"},"children":[{"type":"text","value":"Configuration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The generation process can be customized using the configuration file:"}]},{"type":"element","tag":"pre","props":{"code":"php artisan vendor:publish --tag=restify-graphql-config\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" vendor:publish"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --tag=restify-graphql-config\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This publishes "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"config/restify-graphql.php"}]},{"type":"text","value":" where you can configure:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Field type mappings"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Schema generation options"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Repository filtering"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Output formatting preferences"}]}]},{"type":"element","tag":"h2","props":{"id":"preview-mode"},"children":[{"type":"text","value":"Preview Mode"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By default, the command shows a detailed preview before generating files:"}]},{"type":"element","tag":"pre","props":{"code":"📋 Preview of files to be generated:\n═══════════════════════════════════════════════════════\n\n🔍 Found 3 repositories:\n • UserRepository\n • PostRepository\n • CompanyRepository\n\n📂 Output configuration:\n Output directory: app/GraphQL\n Schema file: schema.graphql\n Generate resolvers: Yes\n Force overwrite: No\n\n📄 Files that will be generated:\n 1. app/GraphQL/schema.graphql\n 2. Resolvers directory: app/GraphQL/Resolvers/\n 3. app/GraphQL/Resolvers/UserResolver.php\n 4. app/GraphQL/Resolvers/PostResolver.php\n 5. app/GraphQL/Resolvers/CompanyResolver.php\n\n📝 Sample GraphQL schema preview:\n ┌─────────────────────────────────────────────────────┐\n │ type User { │\n │ id: ID! │\n │ name: String │\n │ email: String │\n │ created_at: String │\n │ updated_at: String │\n │ } │\n │ │\n │ type Query { │\n │ user(id: ID!): User │\n │ userList(first: Int, page: Int): [User!]! │\n │ } │\n │ │\n │ type Mutation { │\n │ createUser(input: UserInput!): User! │\n │ updateUser(id: ID!, input: UserInput!): User! │\n │ deleteUser(id: ID!): Boolean! │\n │ } │\n │ │\n │ # ... plus 2 more types │\n └─────────────────────────────────────────────────────┘\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"📋 Preview of files to be generated:\n═══════════════════════════════════════════════════════\n\n🔍 Found 3 repositories:\n • UserRepository\n • PostRepository\n • CompanyRepository\n\n📂 Output configuration:\n Output directory: app/GraphQL\n Schema file: schema.graphql\n Generate resolvers: Yes\n Force overwrite: No\n\n📄 Files that will be generated:\n 1. app/GraphQL/schema.graphql\n 2. Resolvers directory: app/GraphQL/Resolvers/\n 3. app/GraphQL/Resolvers/UserResolver.php\n 4. app/GraphQL/Resolvers/PostResolver.php\n 5. app/GraphQL/Resolvers/CompanyResolver.php\n\n📝 Sample GraphQL schema preview:\n ┌─────────────────────────────────────────────────────┐\n │ type User { │\n │ id: ID! │\n │ name: String │\n │ email: String │\n │ created_at: String │\n │ updated_at: String │\n │ } │\n │ │\n │ type Query { │\n │ user(id: ID!): User │\n │ userList(first: Int, page: Int): [User!]! │\n │ } │\n │ │\n │ type Mutation { │\n │ createUser(input: UserInput!): User! │\n │ updateUser(id: ID!, input: UserInput!): User! │\n │ deleteUser(id: ID!): Boolean! │\n │ } │\n │ │\n │ # ... plus 2 more types │\n └─────────────────────────────────────────────────────┘\n"}]}]},{"type":"element","tag":"h2","props":{"id":"lighthouse-integration"},"children":[{"type":"text","value":"Lighthouse Integration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"After generating your schema and resolvers, configure Lighthouse to use them:"}]},{"type":"element","tag":"h3","props":{"id":"_1-update-lighthouse-config"},"children":[{"type":"text","value":"1. Update Lighthouse Config"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Edit "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"config/lighthouse.php"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"code":"'schema' => [\n 'register' => app_path('GraphQL/schema.graphql'),\n],\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'schema'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'register'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" app_path"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'GraphQL/schema.graphql'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"],\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"_2-register-resolvers"},"children":[{"type":"text","value":"2. Register Resolvers"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you generated resolver classes, register them in your GraphQL schema by adding directives:"}]},{"type":"element","tag":"pre","props":{"code":"type Query {\n user(id: ID!): User @field(resolver: \"App\\\\GraphQL\\\\Resolvers\\\\UserResolver@show\")\n userList(first: Int = 15, page: Int = 1): [User!]! @field(resolver: \"App\\\\GraphQL\\\\Resolvers\\\\UserResolver@index\")\n}\n\ntype Mutation {\n createUser(input: UserInput!): User! @field(resolver: \"App\\\\GraphQL\\\\Resolvers\\\\UserResolver@create\")\n updateUser(id: ID!, input: UserInput!): User! @field(resolver: \"App\\\\GraphQL\\\\Resolvers\\\\UserResolver@update\")\n deleteUser(id: ID!): Boolean! @field(resolver: \"App\\\\GraphQL\\\\Resolvers\\\\UserResolver@delete\")\n}\n","language":"graphql","meta":"","className":"language-graphql shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"type Query {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" user(id: ID!): User @field(resolver: \"App\\\\GraphQL\\\\Resolvers\\\\UserResolver@show\")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" userList(first: Int = 15, page: Int = 1): [User!]! @field(resolver: \"App\\\\GraphQL\\\\Resolvers\\\\UserResolver@index\")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"}\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"type Mutation {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" createUser(input: UserInput!): User! @field(resolver: \"App\\\\GraphQL\\\\Resolvers\\\\UserResolver@create\")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" updateUser(id: ID!, input: UserInput!): User! @field(resolver: \"App\\\\GraphQL\\\\Resolvers\\\\UserResolver@update\")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" deleteUser(id: ID!): Boolean! @field(resolver: \"App\\\\GraphQL\\\\Resolvers\\\\UserResolver@delete\")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"_3-add-graphql-route"},"children":[{"type":"text","value":"3. Add GraphQL Route"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Add the GraphQL endpoint to your routes:"}]},{"type":"element","tag":"pre","props":{"code":"// routes/web.php or routes/api.php\nRoute::middleware(['api'])->group(function () {\n Route::post('/graphql', \\Nuwave\\Lighthouse\\Http\\GraphQLController::class);\n});\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// routes/web.php or routes/api.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Route"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"middleware"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'api'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"])"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"group"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" () {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Route"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'/graphql'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\Nuwave\\Lighthouse\\Http\\GraphQLController"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"});\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"authentication-context"},"children":[{"type":"text","value":"Authentication Context"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The GraphQL generation command automatically handles authentication mocking in console context. This ensures that repositories with permission checks (like "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$request->user()->can()"}]},{"type":"text","value":") work properly during schema generation."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The mock user created during generation:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Always returns "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"true"}]},{"type":"text","value":" for permission checks"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Provides basic user properties ("},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"id: 1"}]},{"type":"text","value":")"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Handles any authentication-related method calls"}]}]},{"type":"element","tag":"h2","props":{"id":"next-steps"},"children":[{"type":"text","value":"Next Steps"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"After generating your GraphQL schema:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Install Lighthouse"}]},{"type":"text","value":" if not already installed"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Configure Lighthouse"}]},{"type":"text","value":" to use the generated schema"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Register resolvers"}]},{"type":"text","value":" in your GraphQL setup"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Test your GraphQL endpoint"}]},{"type":"text","value":" using tools like GraphQL Playground"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Customize the schema"}]},{"type":"text","value":" as needed for your specific requirements"}]}]},{"type":"element","tag":"h2","props":{"id":"troubleshooting"},"children":[{"type":"text","value":"Troubleshooting"}]},{"type":"element","tag":"h3","props":{"id":"field-collection-issues"},"children":[{"type":"text","value":"Field Collection Issues"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If some fields are missing from the generated schema, ensure your repository's "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fields()"}]},{"type":"text","value":" method is properly implemented and doesn't have complex conditional logic that prevents field collection."}]},{"type":"element","tag":"h3","props":{"id":"permission-errors"},"children":[{"type":"text","value":"Permission Errors"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The command includes authentication mocking, but if you encounter permission-related errors, check that your repositories handle the mock authentication context properly."}]},{"type":"element","tag":"h3","props":{"id":"custom-field-types"},"children":[{"type":"text","value":"Custom Field Types"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you have custom field types that aren't mapped correctly, you can extend the type mapping in the configuration file or modify the generated schema manually."}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"overview","depth":2,"text":"Overview"},{"id":"installation","depth":2,"text":"Installation","children":[{"id":"_1-install-lighthouse-graphql","depth":3,"text":"1. Install Lighthouse GraphQL"},{"id":"_2-publish-lighthouse-configuration","depth":3,"text":"2. Publish Lighthouse Configuration"}]},{"id":"basic-usage","depth":2,"text":"Basic Usage","children":[{"id":"generate-graphql-schema","depth":3,"text":"Generate GraphQL Schema"},{"id":"generate-with-resolvers","depth":3,"text":"Generate with Resolvers"}]},{"id":"command-options","depth":2,"text":"Command Options","children":[{"id":"basic-options","depth":3,"text":"Basic Options"},{"id":"output-configuration","depth":3,"text":"Output Configuration"},{"id":"examples","depth":3,"text":"Examples"}]},{"id":"generated-schema-structure","depth":2,"text":"Generated Schema Structure","children":[{"id":"type-definitions","depth":3,"text":"Type Definitions"},{"id":"query-operations","depth":3,"text":"Query Operations"},{"id":"mutation-operations","depth":3,"text":"Mutation Operations"}]},{"id":"field-type-mapping","depth":2,"text":"Field Type Mapping"},{"id":"generated-resolvers","depth":2,"text":"Generated Resolvers"},{"id":"configuration","depth":2,"text":"Configuration"},{"id":"preview-mode","depth":2,"text":"Preview Mode"},{"id":"lighthouse-integration","depth":2,"text":"Lighthouse Integration","children":[{"id":"_1-update-lighthouse-config","depth":3,"text":"1. Update Lighthouse Config"},{"id":"_2-register-resolvers","depth":3,"text":"2. Register Resolvers"},{"id":"_3-add-graphql-route","depth":3,"text":"3. Add GraphQL Route"}]},{"id":"authentication-context","depth":2,"text":"Authentication Context"},{"id":"next-steps","depth":2,"text":"Next Steps"},{"id":"troubleshooting","depth":2,"text":"Troubleshooting","children":[{"id":"field-collection-issues","depth":3,"text":"Field Collection Issues"},{"id":"permission-errors","depth":3,"text":"Permission Errors"},{"id":"custom-field-types","depth":3,"text":"Custom Field Types"}]}]}},"_type":"markdown","_id":"content:graphql:graphql-generation.md","_source":"content","_file":"graphql/graphql-generation.md","_stem":"graphql/graphql-generation","_extension":"md"},"hash":"HGmdWSs7Dw"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/graphql/graphql.md b/docs-v3/.nuxt/content-cache/parsed/content/graphql/graphql.md new file mode 100644 index 000000000..9c8886e3f --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/graphql/graphql.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/graphql/graphql","_dir":"graphql","_draft":false,"_partial":false,"_locale":"","title":"GraphQL Integration","description":"Laravel Restify provides powerful GraphQL integration, allowing you to automatically generate GraphQL schemas and resolvers from your existing Restify repositories. This enables you to quickly add GraphQL capabilities to your API without rewriting your business logic.","menuTitle":"GraphQL","category":"GraphQL","position":16,"body":{"type":"root","children":[{"type":"element","tag":"h1","props":{"id":"graphql-integration"},"children":[{"type":"text","value":"GraphQL Integration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Laravel Restify provides powerful GraphQL integration, allowing you to automatically generate GraphQL schemas and resolvers from your existing Restify repositories. This enables you to quickly add GraphQL capabilities to your API without rewriting your business logic."}]},{"type":"element","tag":"h2","props":{"id":"overview"},"children":[{"type":"text","value":"Overview"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The GraphQL integration in Laravel Restify provides:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Automatic Schema Generation"}]},{"type":"text","value":" - Convert your Restify repositories into GraphQL type definitions"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Resolver Generation"}]},{"type":"text","value":" - Create PHP resolver classes for handling GraphQL operations"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Field Mapping"}]},{"type":"text","value":" - Intelligent mapping from Restify fields to GraphQL types"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"CRUD Operations"}]},{"type":"text","value":" - Full Create, Read, Update, Delete operations via GraphQL"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Authentication Context"}]},{"type":"text","value":" - Proper handling of authentication in console/generation context"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Preview Mode"}]},{"type":"text","value":" - See what will be generated before creating files"}]}]},{"type":"element","tag":"h2","props":{"id":"quick-start"},"children":[{"type":"text","value":"Quick Start"}]},{"type":"element","tag":"h3","props":{"id":"_1-install-dependencies"},"children":[{"type":"text","value":"1. Install Dependencies"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"First, install the required GraphQL packages:"}]},{"type":"element","tag":"pre","props":{"className":"language-bash shiki shiki-themes github-light github-dark","code":"composer require pusher/pusher-php-server lighthouse/lighthouse\n","language":"bash","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"composer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" require"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" pusher/pusher-php-server"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" lighthouse/lighthouse\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"_2-generate-your-schema"},"children":[{"type":"text","value":"2. Generate Your Schema"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Use the Artisan command to generate GraphQL schema from your repositories:"}]},{"type":"element","tag":"pre","props":{"className":"language-bash shiki shiki-themes github-light github-dark","code":"php artisan restify:graphql:generate --resolvers\n","language":"bash","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:graphql:generate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --resolvers\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This command will:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Analyze your Restify repositories"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Generate GraphQL type definitions"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Create resolver classes (if "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--resolvers"}]},{"type":"text","value":" flag is used)"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Show a preview before generating files"}]}]},{"type":"element","tag":"h3","props":{"id":"_3-configure-lighthouse"},"children":[{"type":"text","value":"3. Configure Lighthouse"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Update your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"config/lighthouse.php"}]},{"type":"text","value":" to use the generated schema:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"'schema' => [\n 'register' => app_path('GraphQL/schema.graphql'),\n],\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'schema'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'register'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" app_path"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'GraphQL/schema.graphql'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"],\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"_4-add-graphql-endpoint"},"children":[{"type":"text","value":"4. Add GraphQL Endpoint"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Add the GraphQL route to your application:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// routes/api.php\nRoute::middleware(['api'])->group(function () {\n Route::post('/graphql', \\Nuwave\\Lighthouse\\Http\\GraphQLController::class);\n});\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// routes/api.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Route"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"middleware"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'api'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"])"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"group"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" () {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Route"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'/graphql'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\Nuwave\\Lighthouse\\Http\\GraphQLController"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"});\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"example-generated-schema"},"children":[{"type":"text","value":"Example Generated Schema"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"UserRepository"}]},{"type":"text","value":" with fields like "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"name"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"email"}]},{"type":"text","value":", and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"created_at"}]},{"type":"text","value":", the generator creates:"}]},{"type":"element","tag":"pre","props":{"className":"language-graphql shiki shiki-themes github-light github-dark","code":"type User {\n id: ID!\n name: String\n email: String\n created_at: String\n updated_at: String\n}\n\ninput UserInput {\n name: String\n email: String\n}\n\ntype Query {\n user(id: ID!): User\n userList(first: Int = 15, page: Int = 1): [User!]!\n}\n\ntype Mutation {\n createUser(input: UserInput!): User!\n updateUser(id: ID!, input: UserInput!): User!\n deleteUser(id: ID!): Boolean!\n}\n","language":"graphql","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"type User {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" id: ID!\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" name: String\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" email: String\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" created_at: String\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" updated_at: String\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"}\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"input UserInput {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" name: String\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" email: String\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"}\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"type Query {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" user(id: ID!): User\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" userList(first: Int = 15, page: Int = 1): [User!]!\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"}\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"type Mutation {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" createUser(input: UserInput!): User!\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" updateUser(id: ID!, input: UserInput!): User!\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" deleteUser(id: ID!): Boolean!\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"benefits"},"children":[{"type":"text","value":"Benefits"}]},{"type":"element","tag":"h3","props":{"id":"rapid-development"},"children":[{"type":"text","value":"Rapid Development"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Generate complete GraphQL APIs from existing Restify repositories"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"No need to manually write type definitions or resolvers"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Maintain consistency between REST and GraphQL APIs"}]}]},{"type":"element","tag":"h3","props":{"id":"automatic-type-safety"},"children":[{"type":"text","value":"Automatic Type Safety"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Field types are automatically mapped to appropriate GraphQL types"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Input validation leverages existing Restify field definitions"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Type safety maintained throughout the stack"}]}]},{"type":"element","tag":"h3","props":{"id":"seamless-integration"},"children":[{"type":"text","value":"Seamless Integration"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Uses existing Restify authorization and field visibility rules"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Leverages repository business logic and relationships"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Maintains consistency with REST API behavior"}]}]},{"type":"element","tag":"h2","props":{"id":"use-cases"},"children":[{"type":"text","value":"Use Cases"}]},{"type":"element","tag":"h3","props":{"id":"api-unification"},"children":[{"type":"text","value":"API Unification"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Convert your REST API to also support GraphQL without duplicating logic:"}]},{"type":"element","tag":"pre","props":{"className":"language-bash shiki shiki-themes github-light github-dark","code":"# Generate GraphQL from existing repositories\nphp artisan restify:graphql:generate --resolvers --force\n","language":"bash","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"# Generate GraphQL from existing repositories\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:graphql:generate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --resolvers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --force\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"mobile-app-backend"},"children":[{"type":"text","value":"Mobile App Backend"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Provide GraphQL for mobile apps while maintaining REST for web clients:"}]},{"type":"element","tag":"pre","props":{"className":"language-bash shiki shiki-themes github-light github-dark","code":"# Generate to mobile-specific directory\nphp artisan restify:graphql:generate --output-path=app/GraphQL/Mobile --resolvers\n","language":"bash","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"# Generate to mobile-specific directory\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:graphql:generate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --output-path=app/GraphQL/Mobile"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --resolvers\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"third-party-integrations"},"children":[{"type":"text","value":"Third-Party Integrations"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Create GraphQL schemas for external services that prefer GraphQL:"}]},{"type":"element","tag":"pre","props":{"className":"language-bash shiki shiki-themes github-light github-dark","code":"# Generate with custom schema naming\nphp artisan restify:graphql:generate --schema-file=external-api.graphql\n","language":"bash","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"# Generate with custom schema naming\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:graphql:generate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --schema-file=external-api.graphql\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"next-steps"},"children":[{"type":"text","value":"Next Steps"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"/graphql/graphql-generation"},"children":[{"type":"text","value":"Schema Generation"}]}]},{"type":"text","value":" - Learn about the schema generation command and its options"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://lighthouse-php.com/","rel":["nofollow"]},"children":[{"type":"text","value":"Lighthouse Documentation"}]}]},{"type":"text","value":" - Explore advanced GraphQL features"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/graphql/graphql-playground","rel":["nofollow"]},"children":[{"type":"text","value":"GraphQL Playground"}]}]},{"type":"text","value":" - Test your GraphQL API interactively"}]}]},{"type":"element","tag":"h2","props":{"id":"configuration"},"children":[{"type":"text","value":"Configuration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The GraphQL generation process can be customized through the configuration file. Publish it using:"}]},{"type":"element","tag":"pre","props":{"className":"language-bash shiki shiki-themes github-light github-dark","code":"php artisan vendor:publish --tag=restify-graphql-config\n","language":"bash","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" vendor:publish"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --tag=restify-graphql-config\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This allows you to customize:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Field type mappings"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Repository filtering"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Output formatting preferences"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Schema generation options"}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"overview","depth":2,"text":"Overview"},{"id":"quick-start","depth":2,"text":"Quick Start","children":[{"id":"_1-install-dependencies","depth":3,"text":"1. Install Dependencies"},{"id":"_2-generate-your-schema","depth":3,"text":"2. Generate Your Schema"},{"id":"_3-configure-lighthouse","depth":3,"text":"3. Configure Lighthouse"},{"id":"_4-add-graphql-endpoint","depth":3,"text":"4. Add GraphQL Endpoint"}]},{"id":"example-generated-schema","depth":2,"text":"Example Generated Schema"},{"id":"benefits","depth":2,"text":"Benefits","children":[{"id":"rapid-development","depth":3,"text":"Rapid Development"},{"id":"automatic-type-safety","depth":3,"text":"Automatic Type Safety"},{"id":"seamless-integration","depth":3,"text":"Seamless Integration"}]},{"id":"use-cases","depth":2,"text":"Use Cases","children":[{"id":"api-unification","depth":3,"text":"API Unification"},{"id":"mobile-app-backend","depth":3,"text":"Mobile App Backend"},{"id":"third-party-integrations","depth":3,"text":"Third-Party Integrations"}]},{"id":"next-steps","depth":2,"text":"Next Steps"},{"id":"configuration","depth":2,"text":"Configuration"}]}},"_type":"markdown","_id":"content:graphql:graphql.md","_source":"content","_file":"graphql/graphql.md","_stem":"graphql/graphql","_extension":"md"},"hash":"SI8i0vwRaC"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/index.md b/docs-v3/.nuxt/content-cache/parsed/content/index.md new file mode 100644 index 000000000..2c7e6ce1f --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/index.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/","_dir":"","_draft":false,"_partial":false,"_locale":"","title":"Introduction","description":"One Codebase. REST for Humans, MCP for AI Agents.","menuTitle":"Introduction","category":"Getting Started","body":{"type":"root","children":[{"type":"element","tag":"h1","props":{"id":"unified-laravel-api-layer-for-humans-and-ai"},"children":[{"type":"text","value":"Unified Laravel API Layer for Humans and AI."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Laravel Restify turns your Eloquent models into both JSON:API endpoints and MCP servers -- automatically. Build once, and instantly serve APIs that work seamlessly for developers, apps, and AI agents."}]},{"type":"element","tag":"alert","props":{"type":"info"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"🚀 "},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Ready-Made API Starter Kits Available!"}]},{"type":"text","value":" - Looking to build production-ready APIs in minutes instead of weeks? Check out our complete API templates at "},{"type":"element","tag":"a","props":{"href":"https://restifytemplates.com","rel":["nofollow"]},"children":[{"type":"text","value":"RestifyPackages.com"}]},{"type":"text","value":". Get authentication, roles & permissions, team management, and more - all pre-built and ready to deploy. "},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Early adopters get free templates!"}]}]}]},{"type":"element","tag":"h2","props":{"id":"key-features"},"children":[{"type":"text","value":"Key Features"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"JSON:API"}]},{"type":"text","value":" endpoints from Laravel models"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"MCP Server"}]},{"type":"text","value":" generation for AI agents"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Authentication"}]},{"type":"text","value":" with Laravel Sanctum"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Search & Filtering"}]},{"type":"text","value":" with powerful query capabilities"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"GraphQL"}]},{"type":"text","value":" schema generation"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Authorization"}]},{"type":"text","value":" using Laravel policies"}]}]},{"type":"element","tag":"h2","props":{"id":"accelerate-your-development"},"children":[{"type":"text","value":"Accelerate Your Development"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Want to skip the boilerplate and launch faster? Our Restify Templates come with everything you need:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"🔐 Complete Authentication - Registration, login, password reset, email verification - all ready to go"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"👥 Teams & Permissions - Spatie's permissions package integrated with team management"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"✉️ Invitations System - Complete invitation workflow with approval system for platform onboarding"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"📸 Profile Photos - Full image upload with resizing, optimization and S3 integration"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"🤖 AI Error Handling - Smart error tracking with OpenAI-powered solutions and debugging hints"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"💬 MCP Client for Smart Chat - Pre-built chat interface that connects directly to your API via MCP protocol"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"🚀 CI/CD Pipeline - Complete GitHub Actions workflow with automated testing and deployment"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"🌱 Smart Seeders - Realistic data generation with interconnected profiles and demo content"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"⚡ Deploy in Minutes - Production-tested code with zero configuration needed"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"📦 Postman Collection - Test all endpoints instantly with our pre-configured collection"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://restifytemplates.com","rel":["nofollow"]},"children":[{"type":"text","value":"Get Started with Templates →"}]}]},{"type":"element","tag":"h2","props":{"id":"playground"},"children":[{"type":"text","value":"Playground"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can find a playground in the "},{"type":"element","tag":"a","props":{"href":"https://github.com/BinarCode/restify-demo","rel":["nofollow"]},"children":[{"type":"text","value":"Restify Demo GitHub repository"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h2","props":{"id":"videos"},"children":[{"type":"text","value":"Videos"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can find the "},{"type":"element","tag":"a","props":{"href":"https://www.binarcode.com/learn/restify","rel":["nofollow"]},"children":[{"type":"text","value":"full course here"}]},{"type":"text","value":" with many useful features and insights on how Laravel Restify works."}]},{"type":"element","tag":"iframe","props":{"src":"https://player.vimeo.com/video/501764861","width":640,"height":480},"children":[]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"key-features","depth":2,"text":"Key Features"},{"id":"accelerate-your-development","depth":2,"text":"Accelerate Your Development"},{"id":"playground","depth":2,"text":"Playground"},{"id":"videos","depth":2,"text":"Videos"}]}},"_type":"markdown","_id":"content:index.md","_source":"content","_file":"index.md","_stem":"index","_extension":"md"},"hash":"kINI92zys1"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/mcp/mcp.md b/docs-v3/.nuxt/content-cache/parsed/content/mcp/mcp.md new file mode 100644 index 000000000..2451eed88 --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/mcp/mcp.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/mcp/mcp","_dir":"mcp","_draft":false,"_partial":false,"_locale":"","title":"Model Context Protocol (MCP)","description":"Laravel Restify provides seamless integration with the Model Context Protocol (MCP), allowing AI agents to interact with your REST API resources through structured tool interfaces. So you can simply tranform your repositories into a tools for AI agents to consume. Incredible!","menuTitle":"MCP","category":"MCP","position":14,"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Laravel Restify provides seamless integration with the Model Context Protocol (MCP), allowing AI agents to interact with your REST API resources through structured tool interfaces. So you can simply tranform your repositories into a tools for AI agents to consume. Incredible!"}]},{"type":"element","tag":"h2","props":{"id":"setup-registration"},"children":[{"type":"text","value":"Setup & Registration"}]},{"type":"element","tag":"h3","props":{"id":"basic-server-registration"},"children":[{"type":"text","value":"Basic Server Registration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Register the MCP server in your application's service provider or routes file:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"use Binaryk\\LaravelRestify\\MCP\\RestifyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// Register the MCP server\nMcp::web('restify', RestifyServer::class)->name('mcp.restify');\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\MCP\\RestifyServer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Laravel\\Mcp\\Facades\\Mcp"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Register the MCP server\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Mcp"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"web"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'restify'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyServer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"name"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'mcp.restify'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This creates an MCP server endpoint at "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/mcp/restify"}]},{"type":"text","value":" that AI agents can connect to."}]},{"type":"element","tag":"h3","props":{"id":"adding-authentication-middleware"},"children":[{"type":"text","value":"Adding Authentication & Middleware"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For production applications, you'll want to add authentication and other middleware:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"use Binaryk\\LaravelRestify\\MCP\\RestifyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\nMcp::web('restify', RestifyServer::class)->middleware([\n 'auth:sanctum',\n])->name('mcp.restify');\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\MCP\\RestifyServer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Laravel\\Mcp\\Facades\\Mcp"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Mcp"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"web"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'restify'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyServer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"middleware"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"([\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'auth:sanctum'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"])"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"name"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'mcp.restify'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"And that's it! Now you can access your Restify API through the MCP server with authentication. Go into n8n or your AI agent of choice and connect to the MCP server endpoint."}]},{"type":"element","tag":"h3","props":{"id":"terminalstdin-access-local-mcp"},"children":[{"type":"text","value":"Terminal/STDIN Access (Local MCP)"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For terminal-based AI agents (like Claude Desktop, cursor, or other CLI tools that support MCP), you can expose your Restify API through STDIN/STDOUT using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"local"}]},{"type":"text","value":" syntax. This allows direct integration without HTTP overhead."}]},{"type":"element","tag":"h4","props":{"id":"registering-a-local-mcp-server"},"children":[{"type":"text","value":"Registering a Local MCP Server"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Register your local MCP server in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"routes/ai.php"}]},{"type":"text","value":" file:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"use Laravel\\Mcp\\Facades\\Mcp;\nuse App\\Mcp\\Servers\\GroweeStdServer;\n\n// Register for terminal/STDIN access\nMcp::local('growee', GroweeStdServer::class);\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Laravel\\Mcp\\Facades\\Mcp"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" App\\Mcp\\Servers\\GroweeStdServer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Register for terminal/STDIN access\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Mcp"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"local"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'growee'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"GroweeStdServer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"creating-a-terminal-accessible-server-with-authentication"},"children":[{"type":"text","value":"Creating a Terminal-Accessible Server with Authentication"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When using terminal access, authentication must be handled within the server's "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"boot()"}]},{"type":"text","value":" method since there's no HTTP middleware pipeline. Here's a complete example that extends RestifyServer and implements Sanctum authentication:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"bearerToken();\n\n // Fail if no API key is provided\n if (! $bearerToken) {\n throw new McpException('API key is required. Please provide a Bearer token in the Authorization header.');\n }\n\n // Try to authenticate using Sanctum\n $token = PersonalAccessToken::findToken($bearerToken);\n\n if (! $token) {\n throw new McpException('Invalid API key provided. Please check your Bearer token.');\n }\n\n // Verify the token is active\n if (! $token->tokenable) {\n throw new McpException('API token is not associated with a valid user.');\n }\n\n // Set the authenticated user on both sanctum and default guard\n Auth::guard('sanctum')->setUser($token->tokenable);\n Auth::setUser($token->tokenable);\n\n // Set the user resolver for the request\n $request->setUserResolver(function () use ($token) {\n return $token->tokenable;\n });\n \n // Call parent boot to discover tools, resources, and prompts\n parent::boot();\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"bearerToken"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Fail if no API key is provided\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $bearerToken) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" throw"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" McpException"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'API key is required. Please provide a Bearer token in the Authorization header.'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Try to authenticate using Sanctum\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $token "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" PersonalAccessToken"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"findToken"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($bearerToken);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $token) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" throw"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" McpException"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'Invalid API key provided. Please check your Bearer token.'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Verify the token is active\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $token"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"tokenable) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" throw"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" McpException"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'API token is not associated with a valid user.'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":35},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":36},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":37},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Set the authenticated user on both sanctum and default guard\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":38},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Auth"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"guard"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'sanctum'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"setUser"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($token"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"tokenable);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":39},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Auth"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"setUser"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($token"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"tokenable);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":40},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":41},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Set the user resolver for the request\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":42},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"setUserResolver"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" () "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ($token) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":43},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $token"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"tokenable;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":44},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":45},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":46},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Call parent boot to discover tools, resources, and prompts\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":47},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" parent::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"boot"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":48},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":49},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"key-differences-from-web-access"},"children":[{"type":"text","value":"Key Differences from Web Access"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"No Middleware Pipeline"}]},{"type":"text","value":": Unlike "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Mcp::web()"}]},{"type":"text","value":", the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"local"}]},{"type":"text","value":" syntax doesn't support middleware. All authentication and authorization must be implemented in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"boot()"}]},{"type":"text","value":" method."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Direct API Token"}]},{"type":"text","value":": Terminal clients provide Bearer tokens directly through the Authorization header."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Request Context"}]},{"type":"text","value":": Access to the request is available via the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"request()"}]},{"type":"text","value":" helper function."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Error Handling"}]},{"type":"text","value":": Use "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"McpException"}]},{"type":"text","value":" for authentication failures to provide clear error messages to the terminal client."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Registration Location"}]},{"type":"text","value":": Local MCP servers are typically registered in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"routes/ai.php"}]},{"type":"text","value":" instead of web routes."}]}]},{"type":"element","tag":"h4","props":{"id":"client-configuration"},"children":[{"type":"text","value":"Client Configuration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Terminal-based AI clients (like Claude Desktop) can connect to your local MCP server by configuring the connection with your API token. The exact configuration depends on your client, but typically involves:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Setting the Authorization header with your Sanctum token"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Specifying the server name (e.g., 'growee')"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Pointing to your Laravel application's MCP endpoint"}]}]},{"type":"element","tag":"h4","props":{"id":"security-considerations"},"children":[{"type":"text","value":"Security Considerations"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Token Security"}]},{"type":"text","value":": API tokens are passed via the Authorization header and should be kept secure"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Token Scopes"}]},{"type":"text","value":": Consider implementing token abilities/scopes to limit access"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Rate Limiting"}]},{"type":"text","value":": Implement rate limiting at the application level since middleware isn't available"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Audit Logging"}]},{"type":"text","value":": Log authentication attempts and API usage for security monitoring"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Token Rotation"}]},{"type":"text","value":": Implement token expiration and rotation policies"}]}]},{"type":"element","tag":"h4","props":{"id":"security-best-practices"},"children":[{"type":"text","value":"🔒 "},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Security Best Practices"}]}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Apply field visibility controls ("},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"hideFromMcp()"}]},{"type":"text","value":") for sensitive data"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Audit MCP field access patterns"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Implement rate limiting for token-heavy operations"}]}]},{"type":"element","tag":"h2","props":{"id":"common-issues"},"children":[{"type":"text","value":"Common Issues"}]},{"type":"element","tag":"h3","props":{"id":"schema-validation-error"},"children":[{"type":"text","value":"Schema Validation Error"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Error"}]},{"type":"text","value":": "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"[ERROR: Received tool input did not match expected schema]"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Cause"}]},{"type":"text","value":": This occurs when the field type is not identified correctly by the MCP server, leading to schema mismatches between what the AI agent sends and what Laravel Restify expects."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Solution"}]},{"type":"text","value":": You need to explicitly override the field type for the MCP schema using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"toolSchema()"}]},{"type":"text","value":" method:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"field('project_id')\n ->toolSchema(function(\\Laravel\\Mcp\\Server\\Tools\\ToolInputSchema $schema) {\n $schema->string('project_id')\n ->description('The ID of the project associated with the timesheet entry.')\n ->required();\n }),\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"field"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'project_id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"toolSchema"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\Laravel\\Mcp\\Server\\Tools\\ToolInputSchema"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $schema) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $schema"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'project_id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"description"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'The ID of the project associated with the timesheet entry.'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"required"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }),\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This approach allows you to:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Explicitly define the expected data type (string, integer, boolean, etc.)"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Add detailed descriptions for AI agents"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Set validation rules (required, optional)"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Override automatic type inference when it's incorrect"}]}]},{"type":"element","tag":"h2","props":{"id":"configuration"},"children":[{"type":"text","value":"Configuration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The MCP integration respects your existing Restify configuration and adds MCP-specific options:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// config/restify.php\n'mcp' => [\n 'enabled' => true,\n 'server_name' => 'My App MCP Server',\n 'server_version' => '1.0.0',\n 'default_pagination' => 25,\n 'tools' => [\n 'exclude' => [\n // Tools to exclude from discovery\n ],\n 'include' => [\n // Additional tools to include\n ],\n ],\n],\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// config/restify.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'mcp'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'enabled'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'server_name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'My App MCP Server'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'server_version'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" '1.0.0'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'default_pagination'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" 25"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'tools'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'exclude'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Tools to exclude from discovery\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ],\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'include'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Additional tools to include\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ],\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ],\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"],\n"}]}]}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"setup-registration","depth":2,"text":"Setup & Registration","children":[{"id":"basic-server-registration","depth":3,"text":"Basic Server Registration"},{"id":"adding-authentication-middleware","depth":3,"text":"Adding Authentication & Middleware"},{"id":"terminalstdin-access-local-mcp","depth":3,"text":"Terminal/STDIN Access (Local MCP)"}]},{"id":"common-issues","depth":2,"text":"Common Issues","children":[{"id":"schema-validation-error","depth":3,"text":"Schema Validation Error"}]},{"id":"configuration","depth":2,"text":"Configuration"}]}},"_type":"markdown","_id":"content:mcp:mcp.md","_source":"content","_file":"mcp/mcp.md","_stem":"mcp/mcp","_extension":"md"},"hash":"Rhezj9vtYs"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/performance/performance.md b/docs-v3/.nuxt/content-cache/parsed/content/performance/performance.md new file mode 100644 index 000000000..6c5156864 --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/performance/performance.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/performance/performance","_dir":"performance","_draft":false,"_partial":false,"_locale":"","title":"Performance","description":"Performance","menuTitle":"Performance","category":"Advanced","position":14,"body":{"type":"root","children":[{"type":"element","tag":"h2","props":{"id":"policy-caching"},"children":[{"type":"text","value":"Policy Caching"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When loading a large number of models, Restify will check each policy method as "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"show"}]},{"type":"text","value":" or "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"allowRestify"}]},{"type":"text","value":" (including for all relations) before serializing them."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In order to improve performance, Restify caches the policies. You simply have to enable the caching by setting the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"restify.cache.policies.enabled"}]},{"type":"text","value":" property to "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"true"}]},{"type":"text","value":" in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"restify.php"}]},{"type":"text","value":" configuration file:"}]},{"type":"element","tag":"pre","props":{"code":"'cache' => [\n 'policies' => [\n 'enabled' => true,\n 'ttl' => 5 * 60, // seconds\n ],\n],\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'cache'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'policies'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'enabled'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'ttl'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" 5"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" *"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" 60"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// seconds\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ],\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"],\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The caching is tight to the current authenticated user so if another user is logged in, the cache will be hydrated for the new user once again."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify allows individual caching at the policy level with specific configurations. To enable this, a contract "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Cacheable"}]},{"type":"text","value":" must be implemented at the policy level, which enforces the use of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"cache()"}]},{"type":"text","value":" method."}]},{"type":"element","tag":"pre","props":{"code":"class PostPolicy implements Cacheable\n{\n public function cache(): ?CarbonInterface\n {\n return now()->addMinutes();\n }\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostPolicy"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" implements"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Cacheable\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" cache"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"CarbonInterface\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" now"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"addMinutes"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"cache"}]},{"type":"text","value":" method is expected to return a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"CarbonInterface"}]},{"type":"text","value":" or "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"null"}]},{"type":"text","value":". If "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"null"}]},{"type":"text","value":" is returned, the current policy will "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"NOT"}]},{"type":"text","value":" cached."}]},{"type":"element","tag":"h2","props":{"id":"disable-index-meta"},"children":[{"type":"text","value":"Disable index meta"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Index meta are policy information related to what actions are allowed on a resource for a specific user. However, if you don't need this information, you can disable the index meta by setting the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"restify.repositories.serialize_index_meta"}]},{"type":"text","value":" property to "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"false"}]},{"type":"text","value":" in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"restify.php"}]},{"type":"text","value":" configuration file:"}]},{"type":"element","tag":"pre","props":{"code":"'repositories' => [\n 'serialize_index_meta' => false,\n \n 'serialize_show_meta' => true,\n],\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'repositories'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'serialize_index_meta'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'serialize_show_meta'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"],\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This will give your application a boost, especially when loading a large amount of resources or relations."}]},{"type":"element","tag":"h2","props":{"id":"repository-index-caching"},"children":[{"type":"text","value":"Repository Index Caching"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Laravel Restify provides powerful caching for repository index requests to dramatically improve performance for expensive queries with filters, searches, sorts, and pagination. This feature can reduce response times by orders of magnitude for complex API endpoints."}]},{"type":"element","tag":"h3","props":{"id":"quick-setup"},"children":[{"type":"text","value":"Quick Setup"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Enable repository caching in your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":".env"}]},{"type":"text","value":" file:"}]},{"type":"element","tag":"pre","props":{"code":"# Enable repository index caching\nRESTIFY_REPOSITORY_CACHE_ENABLED=true\n\n# Cache TTL in seconds (default: 300 = 5 minutes)\nRESTIFY_REPOSITORY_CACHE_TTL=300\n\n# Optional: Specify cache store\nRESTIFY_REPOSITORY_CACHE_STORE=redis\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"# Enable repository index caching\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"RESTIFY_REPOSITORY_CACHE_ENABLED"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"true\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"# Cache TTL in seconds (default: 300 = 5 minutes)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"RESTIFY_REPOSITORY_CACHE_TTL"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"300\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"# Optional: Specify cache store\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"RESTIFY_REPOSITORY_CACHE_STORE"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"redis\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"That's it! Your repository index endpoints will now be cached automatically."}]},{"type":"element","tag":"h3","props":{"id":"configuration"},"children":[{"type":"text","value":"Configuration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"All caching options are available in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"config/restify.php"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"code":"'repositories' => [\n 'cache' => [\n // Enable or disable caching globally\n 'enabled' => env('RESTIFY_REPOSITORY_CACHE_ENABLED', false),\n \n // Default TTL in seconds\n 'ttl' => env('RESTIFY_REPOSITORY_CACHE_TTL', 300),\n \n // Cache store to use (null = default)\n 'store' => env('RESTIFY_REPOSITORY_CACHE_STORE'),\n \n // Skip caching for authenticated users\n 'skip_authenticated' => false,\n \n // Enable in test environment (disabled by default)\n 'enable_in_tests' => false,\n \n // Cache tags for efficient invalidation\n 'tags' => ['restify', 'repositories'],\n ],\n],\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'repositories'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'cache'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Enable or disable caching globally\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'enabled'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" env"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'RESTIFY_REPOSITORY_CACHE_ENABLED'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Default TTL in seconds\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'ttl'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" env"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'RESTIFY_REPOSITORY_CACHE_TTL'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"300"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Cache store to use (null = default)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'store'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" env"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'RESTIFY_REPOSITORY_CACHE_STORE'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Skip caching for authenticated users\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'skip_authenticated'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Enable in test environment (disabled by default)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'enable_in_tests'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Cache tags for efficient invalidation\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'tags'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'restify'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'repositories'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"],\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ],\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"],\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"repository-specific-configuration"},"children":[{"type":"text","value":"Repository-Specific Configuration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Customize caching per repository:"}]},{"type":"element","tag":"pre","props":{"code":"class PostRepository extends Repository\n{\n // Disable caching for this repository\n public static bool $cacheEnabled = false;\n \n // Custom TTL (10 minutes)\n public static int $cacheTtl = 600;\n \n // Use specific cache store\n public static ?string $cacheStore = 'redis';\n \n // Custom cache tags\n public static array $cacheTags = ['posts', 'content'];\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Disable caching for this repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $cacheEnabled "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Custom TTL (10 minutes)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" int"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $cacheTtl "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" 600"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Use specific cache store\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ?string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $cacheStore "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'redis'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Custom cache tags\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $cacheTags "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'content'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"smart-cache-keys"},"children":[{"type":"text","value":"Smart Cache Keys"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The system generates unique cache keys based on:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Repository type (users, posts, etc.)"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Request parameters (search, filters, sorting, pagination)"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"User context (for authorization-sensitive data)"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Model timestamps (for automatic invalidation)"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Example cache key:"}]},{"type":"element","tag":"pre","props":{"code":"restify:repository:posts:index:7ed77bab35bfc8f3fd4da03ffdde2370:user_1:v_1756392802\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"restify:repository:posts:index:7ed77bab35bfc8f3fd4da03ffdde2370:user_1:v_1756392802\n"}]}]},{"type":"element","tag":"h3","props":{"id":"cache-store-compatibility"},"children":[{"type":"text","value":"Cache Store Compatibility"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Full Support (with cache tags):"}]}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"✅ Redis Store"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"✅ Memcached Store"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"✅ Array Store (testing)"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Basic Support (TTL-based):"}]}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"✅ Database Store"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"✅ File Store"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The system automatically detects cache store capabilities and gracefully falls back when advanced features aren't supported."}]},{"type":"element","tag":"h3","props":{"id":"automatic-cache-invalidation"},"children":[{"type":"text","value":"Automatic Cache Invalidation"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Cache is automatically cleared when:"}]},{"type":"element","tag":"pre","props":{"code":"// Model events trigger cache clearing\n$post = Post::create([...]); // Clears post cache\n$post->update([...]); // Clears post cache\n$post->delete(); // Clears post cache\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Model events trigger cache clearing\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$post "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"create"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"..."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Clears post cache\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"update"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"..."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Clears post cache\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"delete"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Clears post cache\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"manual-cache-management"},"children":[{"type":"text","value":"Manual Cache Management"}]},{"type":"element","tag":"pre","props":{"code":"// Clear cache for specific repository\nPostRepository::clearCache();\n\n// Configure caching at runtime\nPostRepository::enableCache();\nPostRepository::disableCache();\nPostRepository::cacheTtl(600); // 10 minutes\nPostRepository::cacheTags(['posts', 'content']);\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Clear cache for specific repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"clearCache"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Configure caching at runtime\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"enableCache"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"disableCache"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"cacheTtl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"600"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// 10 minutes\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"cacheTags"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'content'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]);\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"performance-impact"},"children":[{"type":"text","value":"Performance Impact"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Caching provides dramatic performance improvements:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Complex filters"}]},{"type":"text","value":": 50-90% faster response times"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Large datasets"}]},{"type":"text","value":": Reduces database load significantly"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Pagination"}]},{"type":"text","value":": Instant subsequent page loads"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Search queries"}]},{"type":"text","value":": Eliminates expensive LIKE operations"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Authorization"}]},{"type":"text","value":": Caches user-specific policy checks"}]}]},{"type":"element","tag":"h3","props":{"id":"test-environment-safety"},"children":[{"type":"text","value":"Test Environment Safety"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Caching is disabled by default in tests"}]},{"type":"text","value":" to prevent test isolation issues:"}]},{"type":"element","tag":"pre","props":{"code":"// Tests automatically have caching disabled\nclass MyTest extends TestCase {\n public function test_something() {\n // Caching is off - no cache pollution between tests\n }\n}\n\n// Enable caching for specific tests\nclass CacheTest extends TestCase {\n public function test_with_cache() {\n $this->enableRepositoryCache();\n // Now caching is enabled for this test\n }\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Tests automatically have caching disabled\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" MyTest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" TestCase"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" test_something"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"() {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Caching is off - no cache pollution between tests\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Enable caching for specific tests\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" CacheTest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" TestCase"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" test_with_cache"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"() {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"enableRepositoryCache"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // Now caching is enabled for this test\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"best-practices"},"children":[{"type":"text","value":"Best Practices"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Production Focused"}]},{"type":"text","value":": Enable caching in production where it matters most"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Monitor TTL"}]},{"type":"text","value":": Set appropriate cache TTL based on data update frequency"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Use Redis"}]},{"type":"text","value":": Redis provides the best caching experience with full tag support"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Tag Strategy"}]},{"type":"text","value":": Use meaningful cache tags for efficient bulk invalidation"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Authorization-Aware"}]},{"type":"text","value":": Caching respects user permissions automatically"}]}]},{"type":"element","tag":"h3","props":{"id":"example-usage"},"children":[{"type":"text","value":"Example Usage"}]},{"type":"element","tag":"pre","props":{"code":"// Before caching: 500ms response time\nGET /api/restify/posts?search=laravel&sort=created_at&page=2\n\n// After caching: 20ms response time (25x faster!)\nGET /api/restify/posts?search=laravel&sort=created_at&page=2\n\n// Different parameters = different cache\nGET /api/restify/posts?search=php&sort=title&page=1 // New cache entry\n\n// Cache respects user context\n// User A and User B get different cached results based on permissions\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Before caching: 500ms response time\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"GET"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" /"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"api"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"/"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"restify"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"/"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"posts"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"search"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"laravel"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"&"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"sort"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"created_at"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"&"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"page"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"2\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// After caching: 20ms response time (25x faster!)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"GET"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" /"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"api"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"/"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"restify"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"/"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"posts"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"search"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"laravel"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"&"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"sort"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"created_at"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"&"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"page"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"2\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Different parameters = different cache\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"GET"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" /"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"api"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"/"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"restify"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"/"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"posts"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"search"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"&"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"sort"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"title"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"&"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"page"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // New cache entry\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Cache respects user context\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// User A and User B get different cached results based on permissions\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This caching system provides a significant performance boost with zero code changes required - simply enable it in configuration and enjoy faster API responses!"}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"policy-caching","depth":2,"text":"Policy Caching"},{"id":"disable-index-meta","depth":2,"text":"Disable index meta"},{"id":"repository-index-caching","depth":2,"text":"Repository Index Caching","children":[{"id":"quick-setup","depth":3,"text":"Quick Setup"},{"id":"configuration","depth":3,"text":"Configuration"},{"id":"repository-specific-configuration","depth":3,"text":"Repository-Specific Configuration"},{"id":"smart-cache-keys","depth":3,"text":"Smart Cache Keys"},{"id":"cache-store-compatibility","depth":3,"text":"Cache Store Compatibility"},{"id":"automatic-cache-invalidation","depth":3,"text":"Automatic Cache Invalidation"},{"id":"manual-cache-management","depth":3,"text":"Manual Cache Management"},{"id":"performance-impact","depth":3,"text":"Performance Impact"},{"id":"test-environment-safety","depth":3,"text":"Test Environment Safety"},{"id":"best-practices","depth":3,"text":"Best Practices"},{"id":"example-usage","depth":3,"text":"Example Usage"}]}]}},"_type":"markdown","_id":"content:performance:performance.md","_source":"content","_file":"performance/performance.md","_stem":"performance/performance","_extension":"md"},"hash":"QC11OMW3PV"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/performance/solutions.md b/docs-v3/.nuxt/content-cache/parsed/content/performance/solutions.md new file mode 100644 index 000000000..ec7623f0f --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/performance/solutions.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/performance/solutions","_dir":"performance","_draft":false,"_partial":false,"_locale":"","title":"AI Solution","description":"AI Solution","menuTitle":"AI Solution","category":"Advanced","position":14,"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Inspired by the "},{"type":"element","tag":"a","props":{"href":"https://beyondco.de/blog/ai-powered-error-solutions-for-laravel","rel":["nofollow"]},"children":[{"type":"text","value":"Marcel's Article"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h2","props":{"id":"generate-solution"},"children":[{"type":"text","value":"Generate solution"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify can generate an AI based solution to your problem. In order to enable that you need to extend the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"App\\Exceptions\\Handler"}]},{"type":"text","value":" with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Binaryk\\LaravelRestify\\Exceptions\\RestifyHandler"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"code":"use Binaryk\\LaravelRestify\\Exceptions\\RestifyHandler;\nuse Throwable;\n\nclass Handler extends RestifyHandler\n{\n //...\n}\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Exceptions\\RestifyHandler"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Throwable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Handler"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" RestifyHandler\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"alert","props":{"type":"warning"},"children":[{"type":"text","value":"\nThis feature is only enabled when the `app.debug` is set to `true`.\n"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This feature is using the "},{"type":"element","tag":"a","props":{"href":"https://github.com/openai-php/laravel#get-started","rel":["nofollow"]},"children":[{"type":"text","value":"openai-php/laravel"}]},{"type":"text","value":", you should also publish the config file:"}]},{"type":"element","tag":"pre","props":{"code":"php artisan vendor:publish --provider=\"OpenAI\\Laravel\\ServiceProvider\"\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"php artisan vendor:publish --provider=\"OpenAI\\Laravel\\ServiceProvider\"\n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"and set the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"OPENAI_API_KEY"}]},{"type":"text","value":" in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":".env"}]},{"type":"text","value":" file."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The OpenAI key can be obtained from "},{"type":"element","tag":"a","props":{"href":"https://platform.openai.com/account/api-keys","rel":["nofollow"]},"children":[{"type":"text","value":"here"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now the solution to your problems will automatically appear in the response:"}]},{"type":"element","tag":"pre","props":{"code":"{\n \"restify-solution\": \"Line 67 in DocumentRepository.php file has an error because the method `resolveUsingFullPath()` is not defined. The code should look like this:\\n```\\n->resolveUsingTemporaryUrl($request->boolean('temporary'))\\n```\\n\",\n \"message\": \"Call to undefined method Binaryk\\\\LaravelRestify\\\\Fields\\\\File::resolveUsingFullPath()\",\n \"exception\": \"Error\",\n \"file\": \"/Users/eduardlupacescu/Sites/binarcode/erp/app/Restify/DocumentRepository.php\",\n \"line\": 67,\n \"trace\": [\n...\n}\n","language":"json","meta":"","className":"language-json shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"restify-solution\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Line 67 in DocumentRepository.php file has an error because the method `resolveUsingFullPath()` is not defined. The code should look like this:"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\n"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"```"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\n"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"->resolveUsingTemporaryUrl($request->boolean('temporary'))"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\n"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"```"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\n"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"message\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Call to undefined method Binaryk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\\\"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"LaravelRestify"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\\\"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"Fields"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"\\\\"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"File::resolveUsingFullPath()\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"exception\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Error\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"file\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"/Users/eduardlupacescu/Sites/binarcode/erp/app/Restify/DocumentRepository.php\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"line\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"67"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"trace\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic"},"children":[{"type":"text","value":"...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"disable-solution"},"children":[{"type":"text","value":"Disable solution"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you want to disable the solution feature you can set the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"restify.ai_solution"}]},{"type":"text","value":" to "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"false"}]},{"type":"text","value":" in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"config/restify.php"}]},{"type":"text","value":" file so Restify will not call the OpenAI API even you extended the exception handler. This might be useful in automated tests or other environments:"}]},{"type":"element","tag":"pre","props":{"code":"// config/restify.php\n'ai_solutions' => true,\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// config/restify.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'ai_solutions'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"generate-solution","depth":2,"text":"Generate solution"},{"id":"disable-solution","depth":2,"text":"Disable solution"}]}},"_type":"markdown","_id":"content:performance:solutions.md","_source":"content","_file":"performance/solutions.md","_stem":"performance/solutions","_extension":"md"},"hash":"ne6JoAq9YK"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/quickstart.md b/docs-v3/.nuxt/content-cache/parsed/content/quickstart.md new file mode 100644 index 000000000..8e9f09430 --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/quickstart.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/quickstart","_dir":"","_draft":false,"_partial":false,"_locale":"","title":"Quickstart","description":"","category":"Getting Started","body":{"type":"root","children":[{"type":"element","tag":"h2","props":{"id":"requirements"},"children":[{"type":"text","value":"Requirements"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Laravel Restify has a few requirements that you should be mindful of before installing:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"PHP ^8.0"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Laravel Framework ^8.0 for Restify <= 6.x"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Laravel Framework ^9.0 for Restify ^7.x"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Or for newer versions:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"PHP >= 8.1"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Laravel Framework ^10.0 for Restify ^8.x"}]}]},{"type":"element","tag":"h2","props":{"id":"installation"},"children":[{"type":"text","value":"Installation"}]},{"type":"element","tag":"pre","props":{"code":"composer require binaryk/laravel-restify\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"composer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" require"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" binaryk/laravel-restify\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"package-stability"},"children":[{"type":"text","value":"Package Stability"}]},{"type":"element","tag":"alert","props":{},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you are not able to install Restify into your application because of your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"minimum-stability"}]},{"type":"text","value":" setting, consider\nsetting your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"minimum-stability"}]},{"type":"text","value":" option to "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dev"}]},{"type":"text","value":" and your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"prefer-stable"}]},{"type":"text","value":" option to "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"true"}]},{"type":"text","value":". This will allow you to\ninstall Laravel Restify while still preferring stable package releases for your application."}]}]},{"type":"element","tag":"h2","props":{"id":"setup"},"children":[{"type":"text","value":"Setup"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"After the installation, the package requires a setup process:"}]},{"type":"element","tag":"pre","props":{"code":"php artisan restify:setup\n","language":"shell","meta":"script","className":"language-shell shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:setup\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The command above:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"publishes"}]},{"type":"text","value":" the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"config/restify.php"}]},{"type":"text","value":" configuration file and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"action_logs"}]},{"type":"text","value":" table migration"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"creates"}]},{"type":"text","value":" the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"providers/RestifyServiceProvider"}]},{"type":"text","value":" and will add it in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"config/app.php"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"creates"}]},{"type":"text","value":" a new "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"app/Restify"}]},{"type":"text","value":" directory"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"creates"}]},{"type":"text","value":" an abstract "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"app/Restify/Repository.php"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"scaffolds"}]},{"type":"text","value":" a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"app/Restify/UserRepository"}]},{"type":"text","value":" repository for users CRUD"}]}]},{"type":"element","tag":"h3","props":{"id":"migrations"},"children":[{"type":"text","value":"Migrations"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"After the setup, you should run the migrations:"}]},{"type":"element","tag":"pre","props":{"code":"php artisan migrate\n","language":"shell","meta":"script","className":"language-shell shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" migrate\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"generating-mock-data"},"children":[{"type":"text","value":"Generating Mock Data"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To generate mock data for your database, you need to install the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"doctrine/dbal"}]},{"type":"text","value":" package as a development dependency:"}]},{"type":"element","tag":"pre","props":{"code":"composer require doctrine/dbal --dev\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"composer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" require"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" doctrine/dbal"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --dev\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"After installing the package, you can use the restify:stub command to generate mock data for a specific table:"}]},{"type":"element","tag":"pre","props":{"code":"php artisan restify:stub table_name --count=10\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:stub"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" table_name"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --count=10\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Replace table_name with the name of the table you want to generate mock data for and use the --count option to specify the number of records you want to create."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For example, to generate 10 users:"}]},{"type":"element","tag":"pre","props":{"code":"php artisan restify:stub users --count=10\n","language":"shell","meta":"","className":"language-shell shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:stub"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" users"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --count=10\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"quick-start"},"children":[{"type":"text","value":"Quick start"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Having the package setup and users table migrated and seeded, you should be good to perform the first API request:"}]},{"type":"element","tag":"pre","props":{"code":"GET: /api/restify/users?perPage=10&page=1\n","language":"http","meta":"request","className":"language-http shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/users?perPage=10&page=1\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"or use the "},{"type":"element","tag":"a","props":{"href":"https://jsonapi.org/profiles/ethanresnick/cursor-pagination/#auto-id-pagesize","rel":["nofollow"]},"children":[{"type":"text","value":"json api"}]},{"type":"text","value":" format:"}]},{"type":"element","tag":"pre","props":{"code":"GET: /api/restify/users?page[size]=10&page[number]=1\n","language":"http","meta":"request","className":"language-http shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/users?page[size]=10&page[number]=1\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This should return the users list paginated and formatted according to "},{"type":"element","tag":"a","props":{"href":"https://jsonapi.org/format/","rel":["nofollow"]},"children":[{"type":"text","value":"JSON:API"}]},{"type":"text","value":" standard."}]},{"type":"element","tag":"h2","props":{"id":"configurations"},"children":[{"type":"text","value":"Configurations"}]},{"type":"element","tag":"h3","props":{"id":"prefix"},"children":[{"type":"text","value":"Prefix"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As you can see, the default prefix for the restify api is "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify"}]},{"type":"text","value":". This can be changed from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"app/restify.php"}]},{"type":"text","value":"\nfile:"}]},{"type":"element","tag":"pre","props":{"code":"'base' => '/api/restify',\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'base'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" '/api/restify'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"middleware"},"children":[{"type":"text","value":"Middleware"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"One important configuration is the restify's default middleware:"}]},{"type":"element","tag":"pre","props":{"code":"// config/restify.php\n\n'middleware' => [\n 'api',\n // 'auth:sanctum',\n Binaryk\\LaravelRestify\\Http\\Middleware\\DispatchRestifyStartingEvent::class,\n Binaryk\\LaravelRestify\\Http\\Middleware\\AuthorizeRestify::class,\n]\n","language":"php","meta":"","className":"language-php shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// config/restify.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'middleware'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'api'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // 'auth:sanctum',\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Http\\Middleware\\DispatchRestifyStartingEvent"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Http\\Middleware\\AuthorizeRestify"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]\n"}]}]}]}]},{"type":"element","tag":"h4","props":{"id":"sanctum-authentication"},"children":[{"type":"text","value":"Sanctum authentication"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Normally, you would want to authenticate your api (allow access only to authenticated users). For this purpose, you can simply add another middleware. For the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sanctum"}]},{"type":"text","value":", you can add the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"auth:sanctum"}]},{"type":"text","value":". Make sure you put this right after "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"api"}]},{"type":"text","value":" middleware."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We will cover this more in the "},{"type":"element","tag":"a","props":{"href":"/auth/authentication"},"children":[{"type":"text","value":"Authentication"}]},{"type":"text","value":" section."}]},{"type":"element","tag":"h2","props":{"id":"generate-repository"},"children":[{"type":"text","value":"Generate repository"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Creating a new repository can be done via restify command:"}]},{"type":"element","tag":"pre","props":{"code":"php artisan restify:repository PostRepository\n","language":"shell","meta":"script","className":"language-shell shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" PostRepository\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you want to generate the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Policy"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Model"}]},{"type":"text","value":", and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"migration"}]},{"type":"text","value":" as well, then you can use the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--all"}]},{"type":"text","value":" option:"}]},{"type":"element","tag":"pre","props":{"code":"php artisan restify:repository PostRepository --all\n","language":"shell","meta":"script","className":"language-shell shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:repository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --all\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"generate-repositories-for-all-models"},"children":[{"type":"text","value":"Generate repositories for all models"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For new projects or when you want to quickly generate repositories for all existing models in your application, you can use the bulk generation command:"}]},{"type":"element","tag":"pre","props":{"code":"php artisan restify:generate:repositories\n","language":"shell","meta":"script","className":"language-shell shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:generate:repositories\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This command will:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Discover all models"}]},{"type":"text","value":" in your application"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Analyze model fields"}]},{"type":"text","value":" from database schema"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Show a detailed preview"}]},{"type":"text","value":" of what will be generated"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Ask for confirmation"}]},{"type":"text","value":" before creating files"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Generate repositories"}]},{"type":"text","value":" with appropriate field definitions"}]}]},{"type":"element","tag":"h3","props":{"id":"command-options"},"children":[{"type":"text","value":"Command Options"}]},{"type":"element","tag":"table","props":{},"children":[{"type":"element","tag":"thead","props":{},"children":[{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"th","props":{},"children":[{"type":"text","value":"Option"}]},{"type":"element","tag":"th","props":{},"children":[{"type":"text","value":"Description"}]}]}]},{"type":"element","tag":"tbody","props":{},"children":[{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--force"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"Overwrite existing repositories without prompting"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--skip-preview"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"Skip preview and generate files immediately"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--structure=flat|domains"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"Choose repository structure"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--only=Model1,Model2"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"Only generate repositories for specific models"}]}]},{"type":"element","tag":"tr","props":{},"children":[{"type":"element","tag":"td","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--except=Model1,Model2"}]}]},{"type":"element","tag":"td","props":{},"children":[{"type":"text","value":"Exclude specific models from generation"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"repository-structure-options"},"children":[{"type":"text","value":"Repository Structure Options"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The command allows you to choose between two organizational structures:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Flat Structure"}]},{"type":"text","value":" (default):"}]},{"type":"element","tag":"pre","props":{"code":"app/Restify/\n├── UserRepository.php\n├── PostRepository.php \n└── CompanyRepository.php\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"app/Restify/\n├── UserRepository.php\n├── PostRepository.php \n└── CompanyRepository.php\n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Domains Structure"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"code":"app/Restify/Domains/\n├── User/\n│ └── UserRepository.php\n├── Post/\n│ └── PostRepository.php\n└── Company/\n └── CompanyRepository.php\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"app/Restify/Domains/\n├── User/\n│ └── UserRepository.php\n├── Post/\n│ └── PostRepository.php\n└── Company/\n └── CompanyRepository.php\n"}]}]},{"type":"element","tag":"h3","props":{"id":"examples"},"children":[{"type":"text","value":"Examples"}]},{"type":"element","tag":"pre","props":{"code":"# Generate with preview and structure selection\nphp artisan restify:generate:repositories\n\n# Generate only for specific models\nphp artisan restify:generate:repositories --only=User,Post\n\n# Generate with domains structure, skip preview\nphp artisan restify:generate:repositories --structure=domains --skip-preview\n\n# Force overwrite existing repositories\nphp artisan restify:generate:repositories --force\n","language":"shell","meta":"script","className":"language-shell shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"# Generate with preview and structure selection\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:generate:repositories\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"# Generate only for specific models\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:generate:repositories"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --only=User,Post\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"# Generate with domains structure, skip preview\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:generate:repositories"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --structure=domains"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --skip-preview\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"# Force overwrite existing repositories\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:generate:repositories"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" --force\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"field-detection"},"children":[{"type":"text","value":"Field Detection"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The command automatically detects and maps database columns to appropriate Restify field types:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"string"}]},{"type":"text","value":"/"},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"varchar"}]},{"type":"text","value":" → "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"field()"}]},{"type":"text","value":" (or "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"email()"}]},{"type":"text","value":" for email columns)"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"text"}]},{"type":"text","value":" → "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"textarea()"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"integer"}]},{"type":"text","value":"/"},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"bigint"}]},{"type":"text","value":" → "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"number()"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"boolean"}]},{"type":"text","value":" → "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"boolean()"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"date"}]},{"type":"text","value":" → "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"date()"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"datetime"}]},{"type":"text","value":"/"},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"timestamp"}]},{"type":"text","value":" → "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"datetime()"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"json"}]},{"type":"text","value":" → "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"json()"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Special handling for:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Password fields → "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"password()->storable()"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Timestamp fields → "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"readonly()"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Foreign key fields → Excluded (handled as relationships)"}]}]},{"type":"element","tag":"h2","props":{"id":"generate-policy"},"children":[{"type":"text","value":"Generate policy"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Since the authorization is based on using the Laravel Policies, a good way of generating a complete policy for an entity is by\nusing the restify command:"}]},{"type":"element","tag":"pre","props":{"code":"php artisan restify:policy PostPolicy\n","language":"shell","meta":"script","className":"language-shell shiki shiki-themes github-light github-dark","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"php"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" artisan"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" restify:policy"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" PostPolicy\n"}]}]}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"requirements","depth":2,"text":"Requirements"},{"id":"installation","depth":2,"text":"Installation","children":[{"id":"package-stability","depth":3,"text":"Package Stability"}]},{"id":"setup","depth":2,"text":"Setup","children":[{"id":"migrations","depth":3,"text":"Migrations"}]},{"id":"generating-mock-data","depth":2,"text":"Generating Mock Data"},{"id":"quick-start","depth":2,"text":"Quick start"},{"id":"configurations","depth":2,"text":"Configurations","children":[{"id":"prefix","depth":3,"text":"Prefix"},{"id":"middleware","depth":3,"text":"Middleware"}]},{"id":"generate-repository","depth":2,"text":"Generate repository"},{"id":"generate-repositories-for-all-models","depth":2,"text":"Generate repositories for all models","children":[{"id":"command-options","depth":3,"text":"Command Options"},{"id":"repository-structure-options","depth":3,"text":"Repository Structure Options"},{"id":"examples","depth":3,"text":"Examples"},{"id":"field-detection","depth":3,"text":"Field Detection"}]},{"id":"generate-policy","depth":2,"text":"Generate policy"}]}},"_type":"markdown","_id":"content:quickstart.md","_source":"content","_file":"quickstart.md","_stem":"quickstart","_extension":"md"},"hash":"k0rdDGyyP0"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/search/advanced-filters.md b/docs-v3/.nuxt/content-cache/parsed/content/search/advanced-filters.md new file mode 100644 index 000000000..7d4bc7b19 --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/search/advanced-filters.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/search/advanced-filters","_dir":"search","_draft":false,"_partial":false,"_locale":"","title":"Advanced filters","description":"Restify has base filters for usual search or matching.","menuTitle":"Advanced filters","category":"Search & Filters","position":12,"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify has "},{"type":"element","tag":"a","props":{"href":"/search/basic-filters"},"children":[{"type":"text","value":"base filters"}]},{"type":"text","value":" for usual "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"search"}]},{"type":"text","value":" or "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"matching"}]},{"type":"text","value":"."}]},{"type":"element","tag":"alert","props":{"type":"success"},"children":[{"type":"text","value":" \nAdvanced filters will help you to build your own filters from scratch.\n"}]},{"type":"element","tag":"h2","props":{"id":"definition"},"children":[{"type":"text","value":"Definition"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To declare an advanced filter you should create a class that extends the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Binaryk\\LaravelRestify\\Filters\\AdvancedFilter"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Say we have a filter that filters all ready to publish posts:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"use Binaryk\\LaravelRestify\\Filters\\AdvancedFilter;\nuse Binaryk\\LaravelRestify\\Http\\Requests\\RestifyRequest;\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Database\\Eloquent\\Relations\\Relation;\n\nclass ReadyPostsFilter extends AdvancedFilter \n{\n public function filter(RestifyRequest $request, Relation|Builder $query, $value)\n {\n // TODO: Implement filter() method.\n }\n\n public function rules(Request $request): array\n {\n return [];\n }\n\n};\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Filters\\AdvancedFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Http\\Requests\\RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Database\\Eloquent\\Builder"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Illuminate\\Database\\Eloquent\\Relations\\Relation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" ReadyPostsFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" AdvancedFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" filter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Relation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"|"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Builder"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query, $value)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // TODO: Implement filter() method.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"};\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"register-filter"},"children":[{"type":"text","value":"Register filter"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Then add the filter to the repository "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"filters"}]},{"type":"text","value":" method:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository.php\npublic function filters(RestifyRequest $request): array\n{\n return [\n ReadyPostsFilter::new(),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" filters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" ReadyPostsFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"authorize-filter"},"children":[{"type":"text","value":"Authorize filter"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can authorize certain filters to be active for specific users:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository.php\npublic function filters(RestifyRequest $request): array\n{\n return [\n ReadyPostsFilter::new()->canSee(\n fn($request) => $request->user()->isAdmin()\n ),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" filters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" ReadyPostsFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"canSee"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" fn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($request) => $request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"user"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"isAdmin"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"apply-advanced-filter"},"children":[{"type":"text","value":"Apply advanced filter"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To apply an advanced filter, the frontend has to send the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"filters"}]},{"type":"text","value":" query param with a base64 encoded filter:"}]},{"type":"element","tag":"pre","props":{"className":"language-javascript shiki shiki-themes github-light github-dark","code":"const filters = btoa(JSON.stringify([\n {\n 'key': 'ready-posts-filter',\n 'value': null,\n }\n]))\n\nconst response = await axios.get(`api/restify/posts?filters=${filters}`);\n","language":"javascript","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" filters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" btoa"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"JSON"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"stringify"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"([\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'key'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'ready-posts-filter'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'value'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]))\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" response"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" axios."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"`api/restify/posts?filters=${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"filters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"}`"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The frontend has to encode into base64 an array of filters. Each filter contains 2 things:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"key"}]},{"type":"text","value":" - which is the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ke-bab"}]},{"type":"text","value":" form of the filter class name, or a custom "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$uriKey"}]},{"type":"text","value":" "},{"type":"element","tag":"a","props":{"href":"#custom-uri-key"},"children":[{"type":"text","value":"defined in the filter"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"value"}]},{"type":"text","value":" - this is optional, and represents the value the advanced filter will as a third argument in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":" method"}]}]},{"type":"element","tag":"h2","props":{"id":"apply-advanced-filters-via-post-request-version-930"},"children":[{"type":"text","value":"Apply advanced filters via POST Request (Version 9.3.0+)"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Starting from version 9.3.0, Laravel Restify introduces the ability to apply advanced filters using a POST request. This enhancement simplifies the process of sending complex filter payloads without the need for base64 encoding. Now, you can send the filters directly as JSON in the request body:"}]},{"type":"element","tag":"pre","props":{"className":"language-javascript shiki shiki-themes github-light github-dark","code":"const filters = [\n {\n 'key': 'ready-posts-filter',\n 'value': null,\n }\n];\n\nconst response = await axios.post(`api/restify/posts/apply-restify-advanced-filters`, { filters });\n","language":"javascript","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" filters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'key'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'ready-posts-filter'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'value'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" response"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" axios."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"post"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"`api/restify/posts/apply-restify-advanced-filters`"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", { filters });\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"custom-uri-key"},"children":[{"type":"text","value":"Custom uri key"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Since your class names could change along the way, you can define a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$uriKey"}]},{"type":"text","value":" property to your filters, so the frontend will use always the same "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"key"}]},{"type":"text","value":" when applying a filter:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class ReadyPostsFilter extends AdvancedFilter \n{\n public static $uriKey = 'ready-posts';\n\n //...\n\n};\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" ReadyPostsFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" AdvancedFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $uriKey "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'ready-posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"};\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"custom-title"},"children":[{"type":"text","value":"Custom title"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class ReadyPostsFilter extends AdvancedFilter \n{\n public static $title = 'Ready to publish posts';\n\n //...\n\n};\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" ReadyPostsFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" AdvancedFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $title "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'Ready to publish posts'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"};\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"custom-description"},"children":[{"type":"text","value":"Custom description"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class ReadyPostsFilter extends AdvancedFilter \n{\n public static $description = 'Filter all posts that are ready to publish';\n\n //...\n\n};\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" ReadyPostsFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" AdvancedFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $description "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'Filter all posts that are ready to publish'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" //...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"};\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"custom-meta"},"children":[{"type":"text","value":"Custom meta"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class ReadyPostsFilter extends AdvancedFilter \n{\n public function meta(): array\n {\n return [\n 'icon' => 'icon',\n 'color' => 'red',\n 'operators' => [\n 'like' => 'Like', \n 'eq' => 'Equal', \n ]\n ];\n } \n};\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" ReadyPostsFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" AdvancedFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" meta"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'icon'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'icon'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'color'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'red'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'operators'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'like'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'Like'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'eq'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'Equal'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" } \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"};\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Meta will be rendered key/value in the frontend:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n ...\n \"icon\": \"icon\",\n \"color\": \"red\",\n \"operators\": {\n \"like\": \"Like\",\n \"eq\": \"Equal\"\n }\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic"},"children":[{"type":"text","value":" ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"icon\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"icon\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"color\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"red\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"operators\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"like\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Like\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"eq\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Equal\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"advanced-filter-value"},"children":[{"type":"text","value":"Advanced filter value"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The third argument of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":" method is the raw value send by the frontend. Sometimes it might be an array, so you have to get the value using array access:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"$value['activation']['active']\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'activation'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'active'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To avoid this, there is an "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":" method defined into the parent class, so you can use:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":" public function filter(RestifyRequest $request, Relation|Builder $query, $value)\n{\n $value = $this->input('activation.active', false);\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" filter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Relation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"|"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Builder"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query, $value)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $value "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"input"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'activation.active'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This method gets a default value as a second parameter in case the frontend didn't define it."}]},{"type":"element","tag":"h3","props":{"id":"advanced-filter-rules"},"children":[{"type":"text","value":"Advanced filter rules"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rules"}]},{"type":"text","value":" method return an associative array with laravel rules for the payload the frontend should send in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"value"}]},{"type":"text","value":" property for this specific filter. The payload is validated right before it gets to the filter method:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function rules(Request $request): array\n{\n return [\n 'created_at' => ['required'],\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'created_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'required'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"],\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"So the frontend should send the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"created_at"}]},{"type":"text","value":" value:"}]},{"type":"element","tag":"pre","props":{"className":"language-javascript shiki shiki-themes github-light github-dark","code":"{\n 'key': 'ready-posts-filter',\n 'value': { created_at: '2021-01-01' }\n}\n","language":"javascript","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'key'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'ready-posts-filter'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'value'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": { created_at: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'2021-01-01'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"And you can get this value into the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":" method using the "},{"type":"element","tag":"a","props":{"href":"#advanced-filter-value"},"children":[{"type":"text","value":"advanced filter value"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":" $value = $this->input('created_at', now());\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $value "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"input"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'created_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"now"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"());\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"variations"},"children":[{"type":"text","value":"Variations"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify ships a few types of build in filter classes you can extend for specific needs."}]},{"type":"element","tag":"h3","props":{"id":"date-filters"},"children":[{"type":"text","value":"Date filters"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Defining the filter:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"use Binaryk\\LaravelRestify\\Http\\Requests\\RestifyRequest;\nuse Binaryk\\LaravelRestify\\Filters\\TimestampFilter;\n\nclass CreatedAfterDateFilter extends TimestampFilter\n{\n public function filter(RestifyRequest $request, $query, $value)\n {\n $query->whereDate('created_at', '>', $value);\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Http\\Requests\\RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Filters\\TimestampFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" CreatedAfterDateFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" TimestampFilter\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" filter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $query, $value)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"whereDate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'created_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'>'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", $value);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Using filter:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public function filters(RestifyRequest $request)\n{\n return [\n CreatedAfterDateFilter::new(),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" filters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" CreatedAfterDateFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"JavaScript implementation:"}]},{"type":"element","tag":"pre","props":{"className":"language-javascript shiki shiki-themes github-light github-dark","code":"const filters = btoa(JSON.stringify([\n {\n 'key': 'created-after-date-filter',\n 'value': moment()->timestamp\n }\n]))\n\nconst response = await axios.get('api/restify/posts?filters=' + filters);\n","language":"javascript","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" filters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" btoa"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"JSON"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"stringify"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"([\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'key'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'created-after-date-filter'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'value'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"moment"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"timestamp\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]))\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" response"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" axios."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'api/restify/posts?filters='"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" +"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" filters);\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"select-filters"},"children":[{"type":"text","value":"Select Filters"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Defining the filter:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"where('category', $value);\n }\n\n public function options(Request $request)\n {\n return [\n 'Movie category' => 'movie',\n\n 'Article Category' => 'article',\n ];\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'category'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", $value);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" options"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'Movie category'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'movie'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'Article Category'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'article'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Using filter:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// App/Restify/PostRepository.php\npublic function filters(RestifyRequest $request)\n{\n return [\n SelectCategoryFilter::new(),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// App/Restify/PostRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" filters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" SelectCategoryFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"JavaScript implementation:"}]},{"type":"element","tag":"pre","props":{"className":"language-javascript shiki shiki-themes github-light github-dark","code":"const filters = btoa(JSON.stringify([\n {\n 'key': 'select-category-filter',\n 'value': 'article'\n }\n]))\n\nconst response = await axios.get('api/restify/posts?filters=' + filters);\n","language":"javascript","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" filters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" btoa"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"JSON"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"stringify"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"([\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'key'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'select-category-filter'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'value'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'article'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]))\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" response"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" axios."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'api/restify/posts?filters='"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" +"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" filters);\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"boolean-filter"},"children":[{"type":"text","value":"Boolean filter"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Defining the filter:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"where('is_active', $value['is_active']);\n }\n\n public function options(Request $request)\n {\n return [\n 'Is Active' => 'is_active',\n ];\n }\n}\n\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'is_active'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", $value["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'is_active'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" options"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'Is Active'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'is_active'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Using filter:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// App/Restify/PostRepository.php\npublic function filters(RestifyRequest $request)\n{\n return [\n ActiveBooleanFilter::new(),\n ];\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// App/Restify/PostRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" filters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" ActiveBooleanFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"JavaScript implementation:"}]},{"type":"element","tag":"pre","props":{"className":"language-javascript shiki shiki-themes github-light github-dark","code":"const filters = btoa(JSON.stringify([\n {\n 'key': 'active-boolean-filter',\n 'value': {\n 'is_active': true,\n }\n }\n]))\n\nconst response = await axios.get('api/restify/posts?filters=' + filters);\n","language":"javascript","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" filters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" btoa"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"JSON"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"stringify"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"([\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'key'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'active-boolean-filter'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'value'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'is_active'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]))\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" response"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" axios."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'api/restify/posts?filters='"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" +"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" filters);\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"multiple-filters"},"children":[{"type":"text","value":"Multiple filters"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can combine filters as you prefer:"}]},{"type":"element","tag":"pre","props":{"className":"language-javascript shiki shiki-themes github-light github-dark","code":"const filters = btoa(JSON.stringify([\n {\n 'key': 'active-boolean-filter',\n 'value': {\n 'is_active': true,\n }\n }, \n {\n 'key': 'select-category-filter',\n 'value': 'article'\n },\n]))\n\nconst response = await axios.get('api/restify/posts?filters=' + filters);\n","language":"javascript","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" filters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" btoa"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"JSON"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"stringify"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"([\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'key'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'active-boolean-filter'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'value'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'is_active'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }, \n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'key'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'select-category-filter'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'value'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'article'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]))\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" response"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" axios."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'api/restify/posts?filters='"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" +"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" filters);\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"get-available-filters"},"children":[{"type":"text","value":"Get available filters"}]},{"type":"element","tag":"pre","props":{"className":"language-javascript shiki shiki-themes github-light github-dark","code":"await axios.get('resitfy-api/posts/filters');\n","language":"javascript","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" axios."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'resitfy-api/posts/filters'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The response will look like this:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"data\": [\n {\n \"key\": \"active-boolean-filter\",\n \"type\": \"boolean\",\n \"options\": [\n {\n \"label\": \"Is Active\",\n \"property\": \"is_active\"\n }\n ]\n },\n {\n \"key\": \"select-category-filter\",\n \"type\": \"select\",\n \"options\": [\n {\n \"label\": \"Movie category\",\n \"property\": \"movie\"\n },\n {\n \"label\": \"Article Category\",\n \"property\": \"article\"\n }\n ]\n },\n {\n \"key\": \"created-after-date-filter\",\n \"type\": \"timestamp\",\n \"options\": []\n },\n {\n \"key\": \"email\",\n \"type\": \"value\",\n \"description\": \"Email\",\n \"label\": \"Email\",\n \"meta\": {\n \"operator\": \"like\"\n }\n }\n ]\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"data\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"key\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"active-boolean-filter\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"boolean\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"options\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"label\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Is Active\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"property\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"is_active\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"key\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"select-category-filter\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"select\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"options\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"label\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Movie category\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"property\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"movie\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"label\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Article Category\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"property\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"article\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"key\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"created-after-date-filter\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"timestamp\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"options\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": []\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"key\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"email\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"type\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"value\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":35},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"description\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Email\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":36},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"label\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Email\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":37},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"meta\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":38},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"operator\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"like\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":39},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":40},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":41},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":42},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Along with custom filters, you can also include in the response the primary filters (as matches), by using "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"?include"}]},{"type":"text","value":" query param:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"/api/restify/posts/filters?include=matches,searchables,sortables\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"/api/restify/posts/filters?include=matches,searchables,sortables\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"handling-additional-payload-data-in-advanced-filters"},"children":[{"type":"text","value":"Handling Additional Payload Data in Advanced Filters"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In some scenarios, you might want to send additional data beyond the standard key and value in your filter payload. For instance, you may need to specify an operator or a column to apply more complex filtering logic. Laravel Restify Advanced Filters provide a way to handle these additional payload fields using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$this->rest()"}]},{"type":"text","value":" method."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Example Payload"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Consider the following payload:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"const filters = [\n {\n 'key': ValueFilter::uriKey(),\n 'value': 'Valid%',\n 'operator' => 'like',\n 'column' => 'description',\n }\n];\n\nconst response = await axios.post(`api/restify/posts/apply-restify-advanced-filters`, {filters});\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"const filters = [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic"},"children":[{"type":"text","value":" 'key'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic"},"children":[{"type":"text","value":"ValueFilter::uriKey()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic"},"children":[{"type":"text","value":" 'value'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic"},"children":[{"type":"text","value":"'Valid%'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic"},"children":[{"type":"text","value":" 'operator'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic"},"children":[{"type":"text","value":" 'like',\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic"},"children":[{"type":"text","value":" 'column'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic"},"children":[{"type":"text","value":" 'description',\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"const response = await axios.post(`api/restify/posts/apply-restify-advanced-filters`, {"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic"},"children":[{"type":"text","value":"filters"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"});\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In this payload, besides the standard key and value, we are also sending operator and column. The operator specifies the type of SQL operation, and the column specifies the database column to filter."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Using "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$this->rest()"}]},{"type":"text","value":" to Access Additional Data"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To handle these additional fields in your filter class, you need to ensure they are accessible via the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$this->rest()"}]},{"type":"text","value":" method. Here is how you can achieve that:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class ValueFilter extends AdvancedFilter\n{\n public function filter(RestifyRequest $request, Builder|Relation $query, $value)\n {\n $operator = $this->rest('operator');\n $column = $this->rest('column');\n\n $query->where($column, $operator, $value);\n }\n\n public function rules(Request $request): array\n {\n return [];\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" ValueFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" AdvancedFilter\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" filter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Builder"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"|"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Relation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query, $value)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $operator "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'operator'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $column "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"rest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'column'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"where"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($column, $operator, $value);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" rules"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Request"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"definition","depth":2,"text":"Definition","children":[{"id":"register-filter","depth":3,"text":"Register filter"},{"id":"authorize-filter","depth":3,"text":"Authorize filter"},{"id":"apply-advanced-filter","depth":3,"text":"Apply advanced filter"}]},{"id":"apply-advanced-filters-via-post-request-version-930","depth":2,"text":"Apply advanced filters via POST Request (Version 9.3.0+)","children":[{"id":"custom-uri-key","depth":3,"text":"Custom uri key"},{"id":"custom-title","depth":3,"text":"Custom title"},{"id":"custom-description","depth":3,"text":"Custom description"},{"id":"custom-meta","depth":3,"text":"Custom meta"},{"id":"advanced-filter-value","depth":3,"text":"Advanced filter value"},{"id":"advanced-filter-rules","depth":3,"text":"Advanced filter rules"}]},{"id":"variations","depth":2,"text":"Variations","children":[{"id":"date-filters","depth":3,"text":"Date filters"},{"id":"select-filters","depth":3,"text":"Select Filters"},{"id":"boolean-filter","depth":3,"text":"Boolean filter"}]},{"id":"multiple-filters","depth":2,"text":"Multiple filters"},{"id":"get-available-filters","depth":2,"text":"Get available filters"},{"id":"handling-additional-payload-data-in-advanced-filters","depth":2,"text":"Handling Additional Payload Data in Advanced Filters"}]}},"_type":"markdown","_id":"content:search:advanced-filters.md","_source":"content","_file":"search/advanced-filters.md","_stem":"search/advanced-filters","_extension":"md"},"hash":"mFZALnpoJU"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/search/basic-filters.md b/docs-v3/.nuxt/content-cache/parsed/content/search/basic-filters.md new file mode 100644 index 000000000..37453d5bd --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/search/basic-filters.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/search/basic-filters","_dir":"search","_draft":false,"_partial":false,"_locale":"","title":"Filters","description":"Restify provides few powerful ways to filter and search your data.","menuTitle":"Filters","category":"Search & Filters","position":11,"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify provides few powerful ways to filter and search your data."}]},{"type":"element","tag":"h2","props":{"id":"global-search"},"children":[{"type":"text","value":"Global search"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify provides a global endpoint that searches over all repositories searchable fields."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To define which repository fields are searchable, you may assign an array of database columns in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"search"}]},{"type":"text","value":" property of your repository class. This includes id column by default, but you may override it to your needs:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PostRepository extends Repository\n{\n public static array $search = ['id', 'title'];\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $search "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"];\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The endpoint to search is:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/search?search=\"Test title\"\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/search?search=\"Test title\"\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"It will search over all repositories that are authorized (has "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"allowRestify"}]},{"type":"text","value":" policy on true)."}]},{"type":"element","tag":"h3","props":{"id":"disabling-global-search"},"children":[{"type":"text","value":"Disabling global search"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"There are 2 ways to disable the global search: for a repository, either return false from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"allowRestify"}]},{"type":"text","value":" model policy method or"}]},{"type":"element","tag":"list","props":{":items":"[\n'return false from the `allowRestify` model policy method',\n'mark the `$globallySearchable` static property false on repository',\n]"},"children":[]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"So to disable the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Posts"}]},{"type":"text","value":" from the global search using the repository property we do:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository.php\npublic static bool $globallySearchable = false;\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" bool"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $globallySearchable "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"paginate-global-search"},"children":[{"type":"text","value":"Paginate global search"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can limit the number of results that are returned in the global search by overriding the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"globalSearchResults"}]},{"type":"text","value":" property on the resource:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository.php\npublic static int $globalSearchResults = 5;\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" int"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $globalSearchResults "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" 5"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"alert","props":{"type":"success"},"children":[{"type":"text","value":" \n"},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Restify has built in support for laravel scout, so it will initialize the query using scout if you have setup it for the model."}]}]},{"type":"element","tag":"h3","props":{"id":"customize-global-search"},"children":[{"type":"text","value":"Customize global search"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The default global search response looks like this:"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-light github-dark","code":"{\n \"data\": [\n {\n \"repositoryName\": \"users\",\n \"repositoryTitle\": \"Users\",\n \"title\": \"Mrs. Lucie Parker Jr.\",\n \"subTitle\": null,\n \"repositoryId\": 1,\n \"link\": \"/api/restify/users/1\"\n }\n ]\n}\n","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"data\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"repositoryName\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"users\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"repositoryTitle\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Users\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"title\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"Mrs. Lucie Parker Jr.\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"subTitle\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"null"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"repositoryId\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" \"link\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"/api/restify/users/1\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Where the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"title"}]},{"type":"text","value":" is the repository column defined by the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$title"}]},{"type":"text","value":" property. So you can customize it:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// UserRepository.php\n\npublic static string $title = 'email';\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// UserRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $title "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"subTitle"}]},{"type":"text","value":" could be customized by overriding the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"subtitle"}]},{"type":"text","value":" method. The returned value will be displayed here:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// UserRepository.php\npublic function subtitle(): ?string\n{\n return 'User email: ' . $this->model()->email;\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// UserRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" subtitle"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ?string\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'User email: '"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"model"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"email;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"repositoryTitle"}]},{"type":"text","value":" could be customized by overriding the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"label"}]},{"type":"text","value":" method or by defining the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$label"}]},{"type":"text","value":" property. This will customize the displayed repository title in the global search response:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// UserRepository.php\npublic static string $label = 'Custom Repository Title';\n\n// Or using the label method for dynamic titles:\npublic static function label(): string\n{\n return 'Dynamic Title';\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// UserRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $label "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'Custom Repository Title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// Or using the label method for dynamic titles:\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" label"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" string\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'Dynamic Title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"repository-search"},"children":[{"type":"text","value":"Repository Search"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The repository search works in a similar way as "},{"type":"element","tag":"a","props":{"href":"#global-search"},"children":[{"type":"text","value":"global search"}]},{"type":"text","value":", however in this case the endpoint refers to the repository and the search will be applied for a certain repository."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Say we want to search users by their "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"email"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"name"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class UserRepository extends Repository\n{\n public static array $search = ['name', 'email'];\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $search "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'email'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"];\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"So the endpoint will scope the the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"users"}]},{"type":"text","value":" repository now:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/users?search=\"John Doe\"\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/users?search=\"John Doe\"\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"case-sensitive-search"},"children":[{"type":"text","value":"Case-sensitive search"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By default, Restify search is case-sensitive. You can change this behavior by changing the configuration:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// restify.php\n\n 'search' => [\n /*\n | Specify either the search should be case-sensitive or not.\n */\n 'case_sensitive' => false,\n ],\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// restify.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'search'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" /*\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" | Specify either the search should be case-sensitive or not.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" */\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'case_sensitive'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ],\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"custom-search-filter"},"children":[{"type":"text","value":"Custom search filter"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The search could be customized by creating a class that extends the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"\\Binaryk\\LaravelRestify\\Filters\\SearchableFilter"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"use Binaryk\\LaravelRestify\\Filters\\SearchableFilter;\n\nclass CustomTitleSearchFilter extends SearchableFilter\n{\n public function filter(RestifyRequest $request, $query, $value)\n {\n return $query->orWhere('name', 'like', \"%$value%\");\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Filters\\SearchableFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" CustomTitleSearchFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" SearchableFilter\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" filter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $query, $value)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"orWhere"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'like'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"\"%"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"%\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":" method you can define your own filtering over the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$query"}]},{"type":"text","value":" builder and then attach the class instance to a column:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public static function searchables(): array\n{\n return [\n 'title' => CustomTitleSearchFilter::make(),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" searchables"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" CustomTitleSearchFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"alert","props":{"type":"danger"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As soon as you define the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"searchables"}]},{"type":"text","value":" method into the repository, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$search"}]},{"type":"text","value":" array is not taken into consideration anymore. So make sure you return all available search fields from this method."}]}]},{"type":"element","tag":"h2","props":{"id":"match"},"children":[{"type":"text","value":"Match"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Matching by specific attributes may be useful if you want an exact matching."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Repository configuration:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PostRepository extends Repository\n{\n public static array $match = [\n 'id' => 'int',\n 'title' => 'string',\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $match "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'int'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'string'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As we may notice the match configuration is an associative array, defining the attribute name and type mapping."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Available types:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"#match-string"},"children":[{"type":"text","value":"text (or "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"string"}]},{"type":"text","value":")"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"#match-bool"},"children":[{"type":"text","value":"bool"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"#match-int"},"children":[{"type":"text","value":"int (or "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"integer"}]},{"type":"text","value":")"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"#match-datetime"},"children":[{"type":"text","value":"datetime"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"#match-between"},"children":[{"type":"text","value":"between"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"#match-array"},"children":[{"type":"text","value":"array"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When performing the request you may pass the match field and value as query params:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/posts?id=1\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/posts?id=1\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"or by title:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/posts?title=\"Some title\"\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/posts?title=\"Some title\"\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"match-string"},"children":[{"type":"text","value":"Match string"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Definition:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PostRepository extends Repository\n{\n public static array $match = [\n 'title' => 'string',\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $match "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'string'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Request:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/posts?title=\"Title\"\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/posts?title=\"Title\"\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"match-bool"},"children":[{"type":"text","value":"Match bool"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Definition:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PostRepository extends Repository\n{\n public static array $match = [\n 'active' => 'bool',\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $match "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'active'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'bool'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Request:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/posts?active=true\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/posts?active=true\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"match-int"},"children":[{"type":"text","value":"Match int"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Definition:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PostRepository extends Repository\n{\n public static array $match = [\n 'id' => 'int',\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $match "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'int'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Request:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/posts?id=1\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/posts?id=1\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"match-datetime"},"children":[{"type":"text","value":"Match datetime"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"datetime"}]},{"type":"text","value":" filter add behind the scene an "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"whereDate"}]},{"type":"text","value":" query."}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PostRepository extends Repository\n{\n public static array $match = [\n 'published_at' => 'datetime',\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $match "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'published_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'datetime'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Request:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/posts?published_at=2020-12-01\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/posts?published_at=2020-12-01\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If the request contains two dates instead of one, it will perform a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"whereBetween"}]},{"type":"text","value":" query:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/posts?published_at=2020-12-01,2021-01-01\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/posts?published_at=2020-12-01,2021-01-01\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Eloquent will do:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"$query->whereBetween('published_at', ['2020-12-01', '2021-01-01']);\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"whereBetween"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'published_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'2020-12-01'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'2021-01-01'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"]);\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"match-between"},"children":[{"type":"text","value":"Match between"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"between"}]},{"type":"text","value":" match works similarly as the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"whereBetween"}]},{"type":"text","value":" Eloquent method:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PostRepository extends Repository\n{\n public static array $match = [\n 'id' => 'between',\n 'published_at' => 'between',\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $match "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'between'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'published_at'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'between'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Request:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/posts?published_at=2021-09-16,2021-11-16\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/posts?published_at=2021-09-16,2021-11-16\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"So it will return all posts published between the first and the second dates. It works with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"integer"}]},{"type":"text","value":" as well:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/posts?id=1,20\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/posts?id=1,20\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Match all available "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ids"}]},{"type":"text","value":" between "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"20"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h3","props":{"id":"match-array"},"children":[{"type":"text","value":"Match array"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Match also accept a list of elements in the query param:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PostRepository extends Repository\n{\n public static $match = [\n 'id' => 'array'\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $match "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'array'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Request:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/posts?id=1,2,3\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/posts?id=1,2,3\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This will be converted to:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"->whereIn('id', [1, 2, 3])\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"whereIn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"2"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"3"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"])\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"match-null"},"children":[{"type":"text","value":"Match null"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"All match types accept "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"null"}]},{"type":"text","value":" as a value, and check add "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"whereNull"}]},{"type":"text","value":" to the query:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/posts?published_at=null\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/posts?published_at=null\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"match-negation"},"children":[{"type":"text","value":"Match negation"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"All match types accept a negation, so you can negate the column match by simply adding the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" (minus) sign before the field:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/posts?-id=1,2,3\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/posts?-id=1,2,3\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This will return all posts where doesn't have the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"id"}]},{"type":"text","value":" in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"[1,2,3]"}]},{"type":"text","value":" list."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can apply "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" (negation) for every match:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/posts?-title=\"Some title\"\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/posts?-title=\"Some title\"\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This will return all posts that doesn't contain "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Some title"}]},{"type":"text","value":" substring."}]},{"type":"element","tag":"h3","props":{"id":"custom-match-filter"},"children":[{"type":"text","value":"Custom match filter"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Sometimes you may have a large logic into a match. To allow this, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Restify"}]},{"type":"text","value":" provides a declarative way to define "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"matchers"}]},{"type":"text","value":". For this purpose you should define a class, that extends the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Binaryk\\LaravelRestify\\Filters\\MatchFilter"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"use Binaryk\\LaravelRestify\\Filters\\MatchFilter;\n\nclass ActivePostMatchFiler extends MatchFilter\n{\n public function filter(RestifyRequest $request, Builder | Relation $query, $value)\n {\n // your logic here\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Filters\\MatchFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" ActivePostMatchFiler"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" MatchFilter\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" filter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Builder"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" | "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Relation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query, $value)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // your logic here\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The next step is to return this class instance from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"matchers"}]},{"type":"text","value":" method:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository.php\npublic static function matches(): array\n{\n return [\n 'active' => ActivePostMatchFiler::make(),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" matches"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'active'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" ActivePostMatchFiler"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"alert","props":{"type":"danger"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As soon as you define the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"matches"}]},{"type":"text","value":" method into the repository, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$match"}]},{"type":"text","value":" array is not taken into consideration anymore. So make sure you return all available matches from this method."}]}]},{"type":"element","tag":"h3","props":{"id":"partial-match"},"children":[{"type":"text","value":"Partial match"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The match filters 1:1 match, however, when you're looking for a substring into a text, you might need to partially match it."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This could be done using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Binaryk\\LaravelRestify\\Filters\\MatchFilter"}]},{"type":"text","value":" class:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public static function matches(): array\n{\n return [\n 'title' => MatchFilter::make()->setType('text')->partial()\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" matches"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" MatchFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"setType"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'text'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"partial"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"get-available-matches"},"children":[{"type":"text","value":"Get available matches"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can use the following request to get all repository matches:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"/api/restify/posts/filters?only=matches\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"/api/restify/posts/filters?only=matches\n"}]}]}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"global-search","depth":2,"text":"Global search","children":[{"id":"disabling-global-search","depth":3,"text":"Disabling global search"},{"id":"paginate-global-search","depth":3,"text":"Paginate global search"},{"id":"customize-global-search","depth":3,"text":"Customize global search"}]},{"id":"repository-search","depth":2,"text":"Repository Search"},{"id":"case-sensitive-search","depth":2,"text":"Case-sensitive search","children":[{"id":"custom-search-filter","depth":3,"text":"Custom search filter"}]},{"id":"match","depth":2,"text":"Match","children":[{"id":"match-string","depth":3,"text":"Match string"},{"id":"match-bool","depth":3,"text":"Match bool"},{"id":"match-int","depth":3,"text":"Match int"},{"id":"match-datetime","depth":3,"text":"Match datetime"},{"id":"match-between","depth":3,"text":"Match between"},{"id":"match-array","depth":3,"text":"Match array"},{"id":"match-null","depth":3,"text":"Match null"},{"id":"match-negation","depth":3,"text":"Match negation"},{"id":"custom-match-filter","depth":3,"text":"Custom match filter"},{"id":"partial-match","depth":3,"text":"Partial match"},{"id":"get-available-matches","depth":3,"text":"Get available matches"}]}]}},"_type":"markdown","_id":"content:search:basic-filters.md","_source":"content","_file":"search/basic-filters.md","_stem":"search/basic-filters","_extension":"md"},"hash":"V6eoEVwcHh"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/search/sorting.md b/docs-v3/.nuxt/content-cache/parsed/content/search/sorting.md new file mode 100644 index 000000000..97d9a6f83 --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/search/sorting.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/search/sorting","_dir":"search","_draft":false,"_partial":false,"_locale":"","title":"Sort","description":"Sorting","menuTitle":"Sort","category":"Search & Filters","position":13,"body":{"type":"root","children":[{"type":"element","tag":"h2","props":{"id":"definition"},"children":[{"type":"text","value":"Definition"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"During index requests, usually we have to sort by specific attributes. This requires the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"$sort"}]},{"type":"text","value":" configuration:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class PostRepository extends Repository\n{\n public static array $sort = ['id'];\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" Repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $sort "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'id'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"];\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Performing request requires the sort query param:"}]},{"type":"element","tag":"h2","props":{"id":"descending-sorting"},"children":[{"type":"text","value":"Descending sorting"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Sorting DESC requires a minus ("},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":") sign before the attribute name:"}]},{"type":"element","tag":"pre","props":{"className":"language-http_request shiki shiki-themes github-light github-dark","code":"GET: /api/restify/posts?sort=-id\n","language":"http_request","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/posts?sort=-id\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Sorting ASC:"}]},{"type":"element","tag":"pre","props":{"className":"language-http_request shiki shiki-themes github-light github-dark","code":"GET: /api/restify/posts?sort=id\n","language":"http_request","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/posts?sort=id\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"or with plus sign before the field:"}]},{"type":"element","tag":"pre","props":{"className":"language-http_request shiki shiki-themes github-light github-dark","code":"GET: /api/restify/posts?sort=+id\n","language":"http_request","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/posts?sort=+id\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"sort-using-relation"},"children":[{"type":"text","value":"Sort using relation"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Sometimes you may need to sort by a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"belongsTo"}]},{"type":"text","value":" or "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"hasOne"}]},{"type":"text","value":" relationship."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This become a breeze with Restify. Firstly you have to instruct your sort to use a relationship:"}]},{"type":"element","tag":"h3","props":{"id":"hasone-sorting"},"children":[{"type":"text","value":"HasOne sorting"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Using a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"related"}]},{"type":"text","value":" relationship, it becomes very easy to define a sortable by has one related."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You simply add the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"->sortable()"}]},{"type":"text","value":" method to the relationship:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// UserRepository.php\n\npublic function related(): array\n{\n return [\n 'post' => HasOne::make('post', PostRepository::class)->sortable('title'),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// UserRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" related"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'post'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" HasOne"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'post'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"sortable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"alert","props":{},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sortable"}]},{"type":"text","value":" method accepts the column (or fully qualified column name) of the related model."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The API request will always have to use the full path to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"attributes"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-bash shiki shiki-themes github-light github-dark","code":"GET: /api/restify/posts?sort=post.attributes.title\n","language":"bash","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"GET:"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" /api/restify/posts?sort=post.attributes.title\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The structure of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sort"}]},{"type":"text","value":" query param value consist always from 3 parts:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"post"}]},{"type":"text","value":" - the name of the relation defined in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"related"}]},{"type":"text","value":" method"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"attributes"}]},{"type":"text","value":" - a generic json:api term"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"title"}]},{"type":"text","value":" - the column name from the database of the related model"}]}]},{"type":"element","tag":"h3","props":{"id":"belongsto-sorting"},"children":[{"type":"text","value":"BelongsTo sorting"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The belongsTo sorting works in a similar way."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You simply add the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"->sortable()"}]},{"type":"text","value":" method to the relationship:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository.php\n\npublic function related(): array\n{\n return [\n 'user' => BelongsTo::make('user', UserRepository::class)->sortable('name'),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository.php\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" related"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'user'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" BelongsTo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"sortable"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"using-custom-sortable-filter"},"children":[{"type":"text","value":"Using custom sortable filter"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can override the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sorts"}]},{"type":"text","value":" method, and return an instance of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"SortableFilter"}]},{"type":"text","value":" that might be instructed to use a relationship:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository\nuse Binaryk\\LaravelRestify\\Fields\\BelongsTo;\nuse Binaryk\\LaravelRestify\\Filters\\SortableFilter;\n\npublic static function sorts(): array\n{\n return [\n 'users.name' => SortableFilter::make()\n ->setColumn('users.name')\n ->usingRelation(\n BelongsTo::make('user', 'user', UserRepository::class),\n )\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Fields\\BelongsTo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Filters\\SortableFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" sorts"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'users.name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" SortableFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"setColumn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'users.name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"usingRelation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" BelongsTo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"make"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'user'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" )\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Make sure that the column is fully qualified (include the table name)."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The request could look like:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"GET: /api/restify/posts?sort=-users.name\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"GET: /api/restify/posts?sort=-users.name\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This will return all posts, sorted descending by users name."}]},{"type":"element","tag":"alert","props":{"type":"info"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As you may notice we have typed twice the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"users.name"}]},{"type":"text","value":" (on the array key, and as argument in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"setColumn"}]},{"type":"text","value":" method). As soon as you use the fully qualified key name, you can avoid the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"setColumn"}]},{"type":"text","value":" call, since the column will be injected automatically based on the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sorts"}]},{"type":"text","value":" key."}]}]},{"type":"element","tag":"h2","props":{"id":"sort-using-closure"},"children":[{"type":"text","value":"Sort using closure"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you have a quick sort method, you can use a closure to sort your data:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"// PostRepository\nuse Binaryk\\LaravelRestify\\Http\\Requests\\RestifyRequest;\n\npublic static function sorts(): array\n{\n return [\n 'users.name' => function(RestifyRequest $request, $query, $direction) {\n // custom sort\n }\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":"// PostRepository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Http\\Requests\\RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" sorts"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'users.name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, $query, $direction) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D;--shiki-dark:#6A737D"},"children":[{"type":"text","value":" // custom sort\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"invokable-custom-sort-classes"},"children":[{"type":"text","value":"Invokable Custom Sort Classes"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Alongside the already provided sorting mechanisms, you can also use an invokable class. This provides you with a flexible way to create your own custom sort logic using classes."}]},{"type":"element","tag":"h3","props":{"id":"basic-usage"},"children":[{"type":"text","value":"Basic Usage"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Such classes should implement the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"__invoke"}]},{"type":"text","value":" method, which will be called during sorting. Here's an example:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class NaturalSort {\n public function __invoke(RestifyRequest $request, Builder $query, string $order, string $column): void\n {\n $query->orderBy($column, $order);\n }\n};\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" NaturalSort"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" __invoke"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"RestifyRequest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $request, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"Builder"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $order, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $column)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" void\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" $query"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"orderBy"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"($column, $order);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"};\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can then use it in your Repository's "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sorts"}]},{"type":"text","value":" method like this:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"public static function sorts(): array\n{\n return [\n 'name' => app(NaturalSort::class),\n ];\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" static"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" sorts"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" array\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" app"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"NaturalSort"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ];\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"However, for even more convenience, you can also directly specify the invokable class name as a string:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"PostRepository::$sort = [\n 'name' => NaturalSort::class,\n];\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$sort "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" NaturalSort"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"];\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"built-in-natural-sort-filter"},"children":[{"type":"text","value":"Built-in Natural Sort Filter"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For those not looking to write their own sort filters, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"binaryk/laravel-restify"}]},{"type":"text","value":" already provides a built-in natural sort filter. This allows you to quickly sort fields in a natural order without additional implementations:"}]},{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"use Binaryk\\LaravelRestify\\Filters\\Sorts\\NaturalSortFilter;\n\nPostRepository::$sort = [\n 'name' => NaturalSortFilter::class,\n];\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"use"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" Binaryk\\LaravelRestify\\Filters\\Sorts\\NaturalSortFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":"PostRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"$sort "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'name'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" NaturalSortFilter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"];\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"NaturalSortFilter"}]},{"type":"text","value":" class, you can effortlessly apply natural sorting to your repository fields."}]},{"type":"element","tag":"h2","props":{"id":"get-available-sorts"},"children":[{"type":"text","value":"Get available sorts"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can use the following request to get sortable attributes for a repository:"}]},{"type":"element","tag":"pre","props":{"className":"language-http shiki shiki-themes github-light github-dark","code":"/api/restify/posts/filters?only=sortables\n","language":"http","meta":"request","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"/api/restify/posts/filters?only=sortables\n"}]}]}]}]},{"type":"element","tag":"alert","props":{"type":"info"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To get all filters, you can use "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/api/restify/posts/filters?only=sortables,matches,searchables"}]},{"type":"text","value":"."}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"definition","depth":2,"text":"Definition"},{"id":"descending-sorting","depth":2,"text":"Descending sorting"},{"id":"sort-using-relation","depth":2,"text":"Sort using relation","children":[{"id":"hasone-sorting","depth":3,"text":"HasOne sorting"},{"id":"belongsto-sorting","depth":3,"text":"BelongsTo sorting"},{"id":"using-custom-sortable-filter","depth":3,"text":"Using custom sortable filter"}]},{"id":"sort-using-closure","depth":2,"text":"Sort using closure"},{"id":"invokable-custom-sort-classes","depth":2,"text":"Invokable Custom Sort Classes","children":[{"id":"basic-usage","depth":3,"text":"Basic Usage"},{"id":"built-in-natural-sort-filter","depth":3,"text":"Built-in Natural Sort Filter"}]},{"id":"get-available-sorts","depth":2,"text":"Get available sorts"}]}},"_type":"markdown","_id":"content:search:sorting.md","_source":"content","_file":"search/sorting.md","_stem":"search/sorting","_extension":"md"},"hash":"upvInuT7py"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/settings.json b/docs-v3/.nuxt/content-cache/parsed/content/settings.json new file mode 100644 index 000000000..a84cdda1e --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/settings.json @@ -0,0 +1 @@ +{"parsed":{"_path":"/settings","_dir":"","_draft":false,"_partial":false,"_locale":"","title":"Laravel Restify","url":"https://restify.binarcode.com","logo":{"light":"/icon.png","dark":"/icon.png"},"github":"binarcode/laravel-restify","twitter":"LupacescuEuard","defaultBranch":"8.x","_id":"content:settings.json","_type":"json","_source":"content","_file":"settings.json","_stem":"settings","_extension":"json"},"hash":"7Pvrfy6COv"} \ No newline at end of file diff --git a/docs-v3/.nuxt/content-cache/parsed/content/testing/testing.md b/docs-v3/.nuxt/content-cache/parsed/content/testing/testing.md new file mode 100644 index 000000000..1a9802e84 --- /dev/null +++ b/docs-v3/.nuxt/content-cache/parsed/content/testing/testing.md @@ -0,0 +1 @@ +{"parsed":{"_path":"/testing/testing","_dir":"testing","_draft":false,"_partial":false,"_locale":"","title":"Testing Repositories","description":"Unlike traditional static method calls, repositories may be mocked. This provides a great advantage over traditional static methods and grants you the same testability you would have if you were using dependency injection. When testing, you may often want to mock a call to a Restify repository in one of your controllers. For example, consider the following controller action","menuTitle":"Testing Repositories","category":"Testing","position":15,"body":{"type":"root","children":[{"type":"element","tag":"pre","props":{"className":"language-php shiki shiki-themes github-light github-dark","code":"class ExampleTest extends TestCase\n{\n public function testBasicTest()\n {\n UserRepository::partialMock()\n ->shouldReceive('index')\n ->andReturn(['data' => [],]);\n\n $this->withHeader('Accept', 'application/json')\n ->get('/api/restify/users')\n ->assertJsonStructure([\n 'response' => 'data',\n ])->assertOk();\n }\n}\n","language":"php","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" ExampleTest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" TestCase\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":" testBasicTest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" UserRepository"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"partialMock"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"shouldReceive"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"andReturn"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"(["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'data'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" [],]);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5;--shiki-dark:#79B8FF"},"children":[{"type":"text","value":" $this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"withHeader"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'Accept'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'application/json'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":"'/api/restify/users'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" ->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"assertJsonStructure"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"([\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'response'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":" =>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62;--shiki-dark:#9ECBFF"},"children":[{"type":"text","value":" 'data'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" ])"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49;--shiki-dark:#F97583"},"children":[{"type":"text","value":"->"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1;--shiki-dark:#B392F0"},"children":[{"type":"text","value":"assertOk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E;--shiki-dark:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"So you can use the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"partialMock"}]},{"type":"text","value":" to get the partial mock instance of the repository, and then perform actions or expectations over it."}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:testing:testing.md","_source":"content","_file":"testing/testing.md","_stem":"testing/testing","_extension":"md"},"hash":"6c8QEt0CYF"} \ No newline at end of file diff --git a/docs-v3/.nuxt/dev/index.mjs b/docs-v3/.nuxt/dev/index.mjs new file mode 100644 index 000000000..5eb9c0297 --- /dev/null +++ b/docs-v3/.nuxt/dev/index.mjs @@ -0,0 +1,5290 @@ +import process from 'node:process';globalThis._importMeta_={url:import.meta.url,env:process.env};import { tmpdir } from 'node:os'; +import { defineEventHandler, handleCacheHeaders, splitCookiesString, createEvent, fetchWithEvent, isEvent, eventHandler, setHeaders, sendRedirect, proxyRequest, getRequestHeader, setResponseHeaders, setResponseStatus, send, getRequestHeaders, setResponseHeader, getRequestURL, getResponseHeader, getResponseStatus, createError, appendResponseHeader, removeResponseHeader, getQuery as getQuery$1, readBody, getCookie, createApp, createRouter as createRouter$1, toNodeListener, lazyEventHandler, getRouterParam, getResponseStatusText } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/h3/dist/index.mjs'; +import { Server } from 'node:http'; +import { resolve, dirname, join } from 'node:path'; +import nodeCrypto from 'node:crypto'; +import { parentPort, threadId } from 'node:worker_threads'; +import { escapeHtml } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/@vue/shared/dist/shared.cjs.js'; +import _RemarkEmoji from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/remark-emoji/index.js'; +import { visit } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/unist-util-visit/index.js'; +import { toString } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/hast-util-to-string/index.js'; +import { createStorage, prefixStorage } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/unstorage/dist/index.mjs'; +import { parseURL, withoutBase, joinURL, getQuery, withQuery, withTrailingSlash, joinRelativeURL, decodePath, withLeadingSlash, withoutTrailingSlash, isRelative } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/ufo/dist/index.mjs'; +import { hash as hash$1 } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/ohash/dist/index.mjs'; +import defu, { defuFn, defu as defu$1 } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/defu/dist/defu.mjs'; +import { dirname as dirname$1, resolve as resolve$1, extname } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/pathe/dist/index.mjs'; +import { snakeCase, kebabCase, pascalCase, camelCase } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/scule/dist/index.mjs'; +import { unified } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/unified/index.js'; +import { toString as toString$1 } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/mdast-util-to-string/index.js'; +import { postprocess, preprocess } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/micromark/dev/index.js'; +import { stringifyPosition } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/unist-util-stringify-position/index.js'; +import { markdownLineEnding, markdownSpace } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/micromark-util-character/dev/index.js'; +import { push, splice } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/micromark-util-chunked/dev/index.js'; +import { resolveAll } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/micromark-util-resolve-all/index.js'; +import { normalizeUri } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/micromark-util-sanitize-uri/dev/index.js'; +import remarkParse from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/remark-parse/index.js'; +import remark2rehype from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/remark-rehype/index.js'; +import remarkMDC, { parseFrontMatter } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/remark-mdc/dist/index.mjs'; +import remarkGFM from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/remark-gfm/index.js'; +import rehypeExternalLinks from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/rehype-external-links/index.js'; +import rehypeSortAttributeValues from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/rehype-sort-attribute-values/index.js'; +import rehypeSortAttributes from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/rehype-sort-attributes/index.js'; +import rehypeRaw from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/rehype-raw/index.js'; +import { detab } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/detab/index.js'; +import Slugger from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/github-slugger/index.js'; +import destr, { destr as destr$1 } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/destr/dist/index.mjs'; +import { createWasmOnigEngine } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/shiki/dist/engine-oniguruma.mjs'; +import slugify from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/slugify/slugify.js'; +import { createRenderer, getRequestDependencies, getPreloadLinks, getPrefetchLinks } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/vue-bundle-renderer/dist/runtime.mjs'; +import { renderToString } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/vue/server-renderer/index.mjs'; +import { createHooks } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/hookable/dist/index.mjs'; +import { createFetch, Headers as Headers$1 } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/ofetch/dist/node.mjs'; +import { fetchNodeRequestHandler, callNodeRequestHandler } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/node-mock-http/dist/index.mjs'; +import unstorage_47drivers_47fs from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/unstorage/drivers/fs.mjs'; +import { digest } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/nitropack/node_modules/ohash/dist/index.mjs'; +import { klona } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/klona/dist/index.mjs'; +import { getContext } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/unctx/dist/index.mjs'; +import { toRouteMatcher, createRouter } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/radix3/dist/index.mjs'; +import { readFile } from 'node:fs/promises'; +import consola, { consola as consola$1 } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/consola/dist/index.mjs'; +import { ErrorParser } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/youch-core/build/index.js'; +import { Youch } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/nitropack/node_modules/youch/build/index.js'; +import { SourceMapConsumer } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/source-map/source-map.js'; +import { AsyncLocalStorage } from 'node:async_hooks'; +import { stringify, uneval } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/devalue/index.js'; +import { captureRawStackTrace, parseRawStackTrace } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/errx/dist/index.js'; +import { isVNode, toValue, isRef } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/vue/index.mjs'; +import { promises } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { createHead as createHead$1, propsToString, renderSSRHead } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/nuxt/node_modules/unhead/dist/server.mjs'; +import { DeprecationsPlugin, PromisesPlugin, TemplateParamsPlugin, AliasSortingPlugin } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/nuxt/node_modules/unhead/dist/plugins.mjs'; +import { walkResolver } from 'file:///Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/node_modules/nuxt/node_modules/unhead/dist/utils.mjs'; + +const serverAssets = [{"baseName":"server","dir":"/Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/server/assets"}]; + +const assets$1 = createStorage(); + +for (const asset of serverAssets) { + assets$1.mount(asset.baseName, unstorage_47drivers_47fs({ base: asset.dir, ignore: (asset?.ignore || []) })); +} + +const storage$1 = createStorage({}); + +storage$1.mount('/assets', assets$1); + +storage$1.mount('root', unstorage_47drivers_47fs({"driver":"fs","readOnly":true,"base":"/Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3","watchOptions":{"ignored":[null]}})); +storage$1.mount('src', unstorage_47drivers_47fs({"driver":"fs","readOnly":true,"base":"/Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/server","watchOptions":{"ignored":[null]}})); +storage$1.mount('content:source:content', unstorage_47drivers_47fs({"name":"content:source:content","driver":"fs","base":"/Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/content"})); +storage$1.mount('cache:content', unstorage_47drivers_47fs({"driver":"fs","base":"/Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/.nuxt/content-cache"})); +storage$1.mount('build', unstorage_47drivers_47fs({"driver":"fs","readOnly":false,"base":"/Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/.nuxt"})); +storage$1.mount('cache', unstorage_47drivers_47fs({"driver":"fs","readOnly":false,"base":"/Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/.nuxt/cache"})); +storage$1.mount('data', unstorage_47drivers_47fs({"driver":"fs","base":"/Users/eduardlupacescu/Sites/binarcode/laravel-restify/docs-v3/.data/kv"})); + +function useStorage(base = "") { + return base ? prefixStorage(storage$1, base) : storage$1; +} + +const Hasher = /* @__PURE__ */ (() => { + class Hasher2 { + buff = ""; + #context = /* @__PURE__ */ new Map(); + write(str) { + this.buff += str; + } + dispatch(value) { + const type = value === null ? "null" : typeof value; + return this[type](value); + } + object(object) { + if (object && typeof object.toJSON === "function") { + return this.object(object.toJSON()); + } + const objString = Object.prototype.toString.call(object); + let objType = ""; + const objectLength = objString.length; + objType = objectLength < 10 ? "unknown:[" + objString + "]" : objString.slice(8, objectLength - 1); + objType = objType.toLowerCase(); + let objectNumber = null; + if ((objectNumber = this.#context.get(object)) === void 0) { + this.#context.set(object, this.#context.size); + } else { + return this.dispatch("[CIRCULAR:" + objectNumber + "]"); + } + if (typeof Buffer !== "undefined" && Buffer.isBuffer && Buffer.isBuffer(object)) { + this.write("buffer:"); + return this.write(object.toString("utf8")); + } + if (objType !== "object" && objType !== "function" && objType !== "asyncfunction") { + if (this[objType]) { + this[objType](object); + } else { + this.unknown(object, objType); + } + } else { + const keys = Object.keys(object).sort(); + const extraKeys = []; + this.write("object:" + (keys.length + extraKeys.length) + ":"); + const dispatchForKey = (key) => { + this.dispatch(key); + this.write(":"); + this.dispatch(object[key]); + this.write(","); + }; + for (const key of keys) { + dispatchForKey(key); + } + for (const key of extraKeys) { + dispatchForKey(key); + } + } + } + array(arr, unordered) { + unordered = unordered === void 0 ? false : unordered; + this.write("array:" + arr.length + ":"); + if (!unordered || arr.length <= 1) { + for (const entry of arr) { + this.dispatch(entry); + } + return; + } + const contextAdditions = /* @__PURE__ */ new Map(); + const entries = arr.map((entry) => { + const hasher = new Hasher2(); + hasher.dispatch(entry); + for (const [key, value] of hasher.#context) { + contextAdditions.set(key, value); + } + return hasher.toString(); + }); + this.#context = contextAdditions; + entries.sort(); + return this.array(entries, false); + } + date(date) { + return this.write("date:" + date.toJSON()); + } + symbol(sym) { + return this.write("symbol:" + sym.toString()); + } + unknown(value, type) { + this.write(type); + if (!value) { + return; + } + this.write(":"); + if (value && typeof value.entries === "function") { + return this.array( + [...value.entries()], + true + /* ordered */ + ); + } + } + error(err) { + return this.write("error:" + err.toString()); + } + boolean(bool) { + return this.write("bool:" + bool); + } + string(string) { + this.write("string:" + string.length + ":"); + this.write(string); + } + function(fn) { + this.write("fn:"); + if (isNativeFunction(fn)) { + this.dispatch("[native]"); + } else { + this.dispatch(fn.toString()); + } + } + number(number) { + return this.write("number:" + number); + } + null() { + return this.write("Null"); + } + undefined() { + return this.write("Undefined"); + } + regexp(regex) { + return this.write("regex:" + regex.toString()); + } + arraybuffer(arr) { + this.write("arraybuffer:"); + return this.dispatch(new Uint8Array(arr)); + } + url(url) { + return this.write("url:" + url.toString()); + } + map(map) { + this.write("map:"); + const arr = [...map]; + return this.array(arr, false); + } + set(set) { + this.write("set:"); + const arr = [...set]; + return this.array(arr, false); + } + bigint(number) { + return this.write("bigint:" + number.toString()); + } + } + for (const type of [ + "uint8array", + "uint8clampedarray", + "unt8array", + "uint16array", + "unt16array", + "uint32array", + "unt32array", + "float32array", + "float64array" + ]) { + Hasher2.prototype[type] = function(arr) { + this.write(type + ":"); + return this.array([...arr], false); + }; + } + function isNativeFunction(f) { + if (typeof f !== "function") { + return false; + } + return Function.prototype.toString.call(f).slice( + -15 + /* "[native code] }".length */ + ) === "[native code] }"; + } + return Hasher2; +})(); +function serialize(object) { + const hasher = new Hasher(); + hasher.dispatch(object); + return hasher.buff; +} +function hash(value) { + return digest(typeof value === "string" ? value : serialize(value)).replace(/[-_]/g, "").slice(0, 10); +} + +function defaultCacheOptions() { + return { + name: "_", + base: "/cache", + swr: true, + maxAge: 1 + }; +} +function defineCachedFunction(fn, opts = {}) { + opts = { ...defaultCacheOptions(), ...opts }; + const pending = {}; + const group = opts.group || "nitro/functions"; + const name = opts.name || fn.name || "_"; + const integrity = opts.integrity || hash([fn, opts]); + const validate = opts.validate || ((entry) => entry.value !== void 0); + async function get(key, resolver, shouldInvalidateCache, event) { + const cacheKey = [opts.base, group, name, key + ".json"].filter(Boolean).join(":").replace(/:\/$/, ":index"); + let entry = await useStorage().getItem(cacheKey).catch((error) => { + console.error(`[cache] Cache read error.`, error); + useNitroApp().captureError(error, { event, tags: ["cache"] }); + }) || {}; + if (typeof entry !== "object") { + entry = {}; + const error = new Error("Malformed data read from cache."); + console.error("[cache]", error); + useNitroApp().captureError(error, { event, tags: ["cache"] }); + } + const ttl = (opts.maxAge ?? 0) * 1e3; + if (ttl) { + entry.expires = Date.now() + ttl; + } + const expired = shouldInvalidateCache || entry.integrity !== integrity || ttl && Date.now() - (entry.mtime || 0) > ttl || validate(entry) === false; + const _resolve = async () => { + const isPending = pending[key]; + if (!isPending) { + if (entry.value !== void 0 && (opts.staleMaxAge || 0) >= 0 && opts.swr === false) { + entry.value = void 0; + entry.integrity = void 0; + entry.mtime = void 0; + entry.expires = void 0; + } + pending[key] = Promise.resolve(resolver()); + } + try { + entry.value = await pending[key]; + } catch (error) { + if (!isPending) { + delete pending[key]; + } + throw error; + } + if (!isPending) { + entry.mtime = Date.now(); + entry.integrity = integrity; + delete pending[key]; + if (validate(entry) !== false) { + let setOpts; + if (opts.maxAge && !opts.swr) { + setOpts = { ttl: opts.maxAge }; + } + const promise = useStorage().setItem(cacheKey, entry, setOpts).catch((error) => { + console.error(`[cache] Cache write error.`, error); + useNitroApp().captureError(error, { event, tags: ["cache"] }); + }); + if (event?.waitUntil) { + event.waitUntil(promise); + } + } + } + }; + const _resolvePromise = expired ? _resolve() : Promise.resolve(); + if (entry.value === void 0) { + await _resolvePromise; + } else if (expired && event && event.waitUntil) { + event.waitUntil(_resolvePromise); + } + if (opts.swr && validate(entry) !== false) { + _resolvePromise.catch((error) => { + console.error(`[cache] SWR handler error.`, error); + useNitroApp().captureError(error, { event, tags: ["cache"] }); + }); + return entry; + } + return _resolvePromise.then(() => entry); + } + return async (...args) => { + const shouldBypassCache = await opts.shouldBypassCache?.(...args); + if (shouldBypassCache) { + return fn(...args); + } + const key = await (opts.getKey || getKey)(...args); + const shouldInvalidateCache = await opts.shouldInvalidateCache?.(...args); + const entry = await get( + key, + () => fn(...args), + shouldInvalidateCache, + args[0] && isEvent(args[0]) ? args[0] : void 0 + ); + let value = entry.value; + if (opts.transform) { + value = await opts.transform(entry, ...args) || value; + } + return value; + }; +} +function cachedFunction(fn, opts = {}) { + return defineCachedFunction(fn, opts); +} +function getKey(...args) { + return args.length > 0 ? hash(args) : ""; +} +function escapeKey(key) { + return String(key).replace(/\W/g, ""); +} +function defineCachedEventHandler(handler, opts = defaultCacheOptions()) { + const variableHeaderNames = (opts.varies || []).filter(Boolean).map((h) => h.toLowerCase()).sort(); + const _opts = { + ...opts, + getKey: async (event) => { + const customKey = await opts.getKey?.(event); + if (customKey) { + return escapeKey(customKey); + } + const _path = event.node.req.originalUrl || event.node.req.url || event.path; + let _pathname; + try { + _pathname = escapeKey(decodeURI(parseURL(_path).pathname)).slice(0, 16) || "index"; + } catch { + _pathname = "-"; + } + const _hashedPath = `${_pathname}.${hash(_path)}`; + const _headers = variableHeaderNames.map((header) => [header, event.node.req.headers[header]]).map(([name, value]) => `${escapeKey(name)}.${hash(value)}`); + return [_hashedPath, ..._headers].join(":"); + }, + validate: (entry) => { + if (!entry.value) { + return false; + } + if (entry.value.code >= 400) { + return false; + } + if (entry.value.body === void 0) { + return false; + } + if (entry.value.headers.etag === "undefined" || entry.value.headers["last-modified"] === "undefined") { + return false; + } + return true; + }, + group: opts.group || "nitro/handlers", + integrity: opts.integrity || hash([handler, opts]) + }; + const _cachedHandler = cachedFunction( + async (incomingEvent) => { + const variableHeaders = {}; + for (const header of variableHeaderNames) { + const value = incomingEvent.node.req.headers[header]; + if (value !== void 0) { + variableHeaders[header] = value; + } + } + const reqProxy = cloneWithProxy(incomingEvent.node.req, { + headers: variableHeaders + }); + const resHeaders = {}; + let _resSendBody; + const resProxy = cloneWithProxy(incomingEvent.node.res, { + statusCode: 200, + writableEnded: false, + writableFinished: false, + headersSent: false, + closed: false, + getHeader(name) { + return resHeaders[name]; + }, + setHeader(name, value) { + resHeaders[name] = value; + return this; + }, + getHeaderNames() { + return Object.keys(resHeaders); + }, + hasHeader(name) { + return name in resHeaders; + }, + removeHeader(name) { + delete resHeaders[name]; + }, + getHeaders() { + return resHeaders; + }, + end(chunk, arg2, arg3) { + if (typeof chunk === "string") { + _resSendBody = chunk; + } + if (typeof arg2 === "function") { + arg2(); + } + if (typeof arg3 === "function") { + arg3(); + } + return this; + }, + write(chunk, arg2, arg3) { + if (typeof chunk === "string") { + _resSendBody = chunk; + } + if (typeof arg2 === "function") { + arg2(void 0); + } + if (typeof arg3 === "function") { + arg3(); + } + return true; + }, + writeHead(statusCode, headers2) { + this.statusCode = statusCode; + if (headers2) { + if (Array.isArray(headers2) || typeof headers2 === "string") { + throw new TypeError("Raw headers is not supported."); + } + for (const header in headers2) { + const value = headers2[header]; + if (value !== void 0) { + this.setHeader( + header, + value + ); + } + } + } + return this; + } + }); + const event = createEvent(reqProxy, resProxy); + event.fetch = (url, fetchOptions) => fetchWithEvent(event, url, fetchOptions, { + fetch: useNitroApp().localFetch + }); + event.$fetch = (url, fetchOptions) => fetchWithEvent(event, url, fetchOptions, { + fetch: globalThis.$fetch + }); + event.waitUntil = incomingEvent.waitUntil; + event.context = incomingEvent.context; + event.context.cache = { + options: _opts + }; + const body = await handler(event) || _resSendBody; + const headers = event.node.res.getHeaders(); + headers.etag = String( + headers.Etag || headers.etag || `W/"${hash(body)}"` + ); + headers["last-modified"] = String( + headers["Last-Modified"] || headers["last-modified"] || (/* @__PURE__ */ new Date()).toUTCString() + ); + const cacheControl = []; + if (opts.swr) { + if (opts.maxAge) { + cacheControl.push(`s-maxage=${opts.maxAge}`); + } + if (opts.staleMaxAge) { + cacheControl.push(`stale-while-revalidate=${opts.staleMaxAge}`); + } else { + cacheControl.push("stale-while-revalidate"); + } + } else if (opts.maxAge) { + cacheControl.push(`max-age=${opts.maxAge}`); + } + if (cacheControl.length > 0) { + headers["cache-control"] = cacheControl.join(", "); + } + const cacheEntry = { + code: event.node.res.statusCode, + headers, + body + }; + return cacheEntry; + }, + _opts + ); + return defineEventHandler(async (event) => { + if (opts.headersOnly) { + if (handleCacheHeaders(event, { maxAge: opts.maxAge })) { + return; + } + return handler(event); + } + const response = await _cachedHandler( + event + ); + if (event.node.res.headersSent || event.node.res.writableEnded) { + return response.body; + } + if (handleCacheHeaders(event, { + modifiedTime: new Date(response.headers["last-modified"]), + etag: response.headers.etag, + maxAge: opts.maxAge + })) { + return; + } + event.node.res.statusCode = response.code; + for (const name in response.headers) { + const value = response.headers[name]; + if (name === "set-cookie") { + event.node.res.appendHeader( + name, + splitCookiesString(value) + ); + } else { + if (value !== void 0) { + event.node.res.setHeader(name, value); + } + } + } + return response.body; + }); +} +function cloneWithProxy(obj, overrides) { + return new Proxy(obj, { + get(target, property, receiver) { + if (property in overrides) { + return overrides[property]; + } + return Reflect.get(target, property, receiver); + }, + set(target, property, value, receiver) { + if (property in overrides) { + overrides[property] = value; + return true; + } + return Reflect.set(target, property, value, receiver); + } + }); +} +const cachedEventHandler = defineCachedEventHandler; + +const inlineAppConfig = { + "nuxt": {} +}; + + + +const appConfig = defuFn(inlineAppConfig); + +function getEnv(key, opts) { + const envKey = snakeCase(key).toUpperCase(); + return destr( + process.env[opts.prefix + envKey] ?? process.env[opts.altPrefix + envKey] + ); +} +function _isObject(input) { + return typeof input === "object" && !Array.isArray(input); +} +function applyEnv(obj, opts, parentKey = "") { + for (const key in obj) { + const subKey = parentKey ? `${parentKey}_${key}` : key; + const envValue = getEnv(subKey, opts); + if (_isObject(obj[key])) { + if (_isObject(envValue)) { + obj[key] = { ...obj[key], ...envValue }; + applyEnv(obj[key], opts, subKey); + } else if (envValue === void 0) { + applyEnv(obj[key], opts, subKey); + } else { + obj[key] = envValue ?? obj[key]; + } + } else { + obj[key] = envValue ?? obj[key]; + } + if (opts.envExpansion && typeof obj[key] === "string") { + obj[key] = _expandFromEnv(obj[key]); + } + } + return obj; +} +const envExpandRx = /\{\{([^{}]*)\}\}/g; +function _expandFromEnv(value) { + return value.replace(envExpandRx, (match, key) => { + return process.env[key] || match; + }); +} + +const _inlineRuntimeConfig = { + "app": { + "baseURL": "/", + "buildId": "dev", + "buildAssetsDir": "/_nuxt/", + "cdnURL": "" + }, + "nitro": { + "envPrefix": "NUXT_", + "routeRules": { + "/__nuxt_error": { + "cache": false + }, + "/_nuxt/builds/meta/**": { + "headers": { + "cache-control": "public, max-age=31536000, immutable" + } + }, + "/_nuxt/builds/**": { + "headers": { + "cache-control": "public, max-age=1, immutable" + } + } + } + }, + "public": { + "mdc": { + "components": { + "prose": true, + "map": { + "p": "prose-p", + "a": "prose-a", + "blockquote": "prose-blockquote", + "code-inline": "prose-code-inline", + "code": "ProseCodeInline", + "em": "prose-em", + "h1": "prose-h1", + "h2": "prose-h2", + "h3": "prose-h3", + "h4": "prose-h4", + "h5": "prose-h5", + "h6": "prose-h6", + "hr": "prose-hr", + "img": "prose-img", + "ul": "prose-ul", + "ol": "prose-ol", + "li": "prose-li", + "strong": "prose-strong", + "table": "prose-table", + "thead": "prose-thead", + "tbody": "prose-tbody", + "td": "prose-td", + "th": "prose-th", + "tr": "prose-tr" + } + }, + "headings": { + "anchorLinks": { + "h1": false, + "h2": false, + "h3": false, + "h4": false, + "h5": false, + "h6": false + } + } + }, + "content": { + "locales": [], + "defaultLocale": "", + "integrity": "", + "experimental": { + "stripQueryParameters": false, + "advanceQuery": false, + "clientDB": false + }, + "respectPathCase": false, + "api": { + "baseURL": "/api/_content" + }, + "navigation": { + "fields": [ + "title", + "description", + "icon", + "category", + "layout" + ] + }, + "tags": { + "p": "prose-p", + "a": "prose-a", + "blockquote": "prose-blockquote", + "code-inline": "prose-code-inline", + "code": "ProseCodeInline", + "em": "prose-em", + "h1": "prose-h1", + "h2": "prose-h2", + "h3": "prose-h3", + "h4": "prose-h4", + "h5": "prose-h5", + "h6": "prose-h6", + "hr": "prose-hr", + "img": "prose-img", + "ul": "prose-ul", + "ol": "prose-ol", + "li": "prose-li", + "strong": "prose-strong", + "table": "prose-table", + "thead": "prose-thead", + "tbody": "prose-tbody", + "td": "prose-td", + "th": "prose-th", + "tr": "prose-tr" + }, + "highlight": { + "theme": { + "default": "github-light", + "dark": "github-dark" + }, + "preload": [ + "php", + "bash", + "javascript", + "typescript", + "vue", + "json" + ], + "highlighter": "shiki", + "shikiEngine": "oniguruma", + "langs": [ + "js", + "jsx", + "json", + "ts", + "tsx", + "vue", + "css", + "html", + "bash", + "md", + "mdc", + "yaml", + "php", + "bash", + "javascript", + "typescript", + "vue", + "json" + ] + }, + "wsUrl": "ws://localhost:4000/", + "documentDriven": { + "page": true, + "navigation": true, + "surround": true, + "globals": {}, + "layoutFallbacks": [ + "theme" + ], + "injectPage": true + }, + "host": "", + "trailingSlash": false, + "search": "", + "contentHead": true, + "anchorLinks": false + } + }, + "content": { + "cacheVersion": 2, + "cacheIntegrity": "szRUzoxYmG", + "transformers": [], + "base": "", + "api": { + "baseURL": "/api/_content" + }, + "watch": { + "ws": { + "port": { + "port": 4000, + "portRange": [ + 4000, + 4040 + ] + }, + "hostname": "localhost", + "showURL": false + } + }, + "sources": {}, + "ignores": [], + "locales": [], + "defaultLocale": "", + "highlight": { + "theme": { + "default": "github-light", + "dark": "github-dark" + }, + "preload": [ + "php", + "bash", + "javascript", + "typescript", + "vue", + "json" + ], + "highlighter": "shiki", + "shikiEngine": "oniguruma", + "langs": [ + "js", + "jsx", + "json", + "ts", + "tsx", + "vue", + "css", + "html", + "bash", + "md", + "mdc", + "yaml", + "php", + "bash", + "javascript", + "typescript", + "vue", + "json" + ] + }, + "markdown": { + "tags": { + "p": "prose-p", + "a": "prose-a", + "blockquote": "prose-blockquote", + "code-inline": "prose-code-inline", + "code": "ProseCodeInline", + "em": "prose-em", + "h1": "prose-h1", + "h2": "prose-h2", + "h3": "prose-h3", + "h4": "prose-h4", + "h5": "prose-h5", + "h6": "prose-h6", + "hr": "prose-hr", + "img": "prose-img", + "ul": "prose-ul", + "ol": "prose-ol", + "li": "prose-li", + "strong": "prose-strong", + "table": "prose-table", + "thead": "prose-thead", + "tbody": "prose-tbody", + "td": "prose-td", + "th": "prose-th", + "tr": "prose-tr" + }, + "anchorLinks": { + "depth": 0, + "exclude": [] + }, + "remarkPlugins": {}, + "rehypePlugins": {} + }, + "yaml": {}, + "csv": { + "delimeter": ",", + "json": true + }, + "navigation": { + "fields": [ + "title", + "description", + "icon", + "category", + "layout" + ] + }, + "contentHead": true, + "documentDriven": true, + "respectPathCase": false, + "experimental": { + "clientDB": false, + "cacheContents": true, + "stripQueryParameters": false, + "advanceQuery": false, + "search": "" + } + } +}; +const envOptions = { + prefix: "NITRO_", + altPrefix: _inlineRuntimeConfig.nitro.envPrefix ?? process.env.NITRO_ENV_PREFIX ?? "_", + envExpansion: _inlineRuntimeConfig.nitro.envExpansion ?? process.env.NITRO_ENV_EXPANSION ?? false +}; +const _sharedRuntimeConfig = _deepFreeze( + applyEnv(klona(_inlineRuntimeConfig), envOptions) +); +function useRuntimeConfig(event) { + if (!event) { + return _sharedRuntimeConfig; + } + if (event.context.nitro.runtimeConfig) { + return event.context.nitro.runtimeConfig; + } + const runtimeConfig = klona(_inlineRuntimeConfig); + applyEnv(runtimeConfig, envOptions); + event.context.nitro.runtimeConfig = runtimeConfig; + return runtimeConfig; +} +_deepFreeze(klona(appConfig)); +function _deepFreeze(object) { + const propNames = Object.getOwnPropertyNames(object); + for (const name of propNames) { + const value = object[name]; + if (value && typeof value === "object") { + _deepFreeze(value); + } + } + return Object.freeze(object); +} +new Proxy(/* @__PURE__ */ Object.create(null), { + get: (_, prop) => { + console.warn( + "Please use `useRuntimeConfig()` instead of accessing config directly." + ); + const runtimeConfig = useRuntimeConfig(); + if (prop in runtimeConfig) { + return runtimeConfig[prop]; + } + return void 0; + } +}); + +getContext("nitro-app", { + asyncContext: false, + AsyncLocalStorage: void 0 +}); + +const config = useRuntimeConfig(); +const _routeRulesMatcher = toRouteMatcher( + createRouter({ routes: config.nitro.routeRules }) +); +function createRouteRulesHandler(ctx) { + return eventHandler((event) => { + const routeRules = getRouteRules(event); + if (routeRules.headers) { + setHeaders(event, routeRules.headers); + } + if (routeRules.redirect) { + let target = routeRules.redirect.to; + if (target.endsWith("/**")) { + let targetPath = event.path; + const strpBase = routeRules.redirect._redirectStripBase; + if (strpBase) { + targetPath = withoutBase(targetPath, strpBase); + } + target = joinURL(target.slice(0, -3), targetPath); + } else if (event.path.includes("?")) { + const query = getQuery(event.path); + target = withQuery(target, query); + } + return sendRedirect(event, target, routeRules.redirect.statusCode); + } + if (routeRules.proxy) { + let target = routeRules.proxy.to; + if (target.endsWith("/**")) { + let targetPath = event.path; + const strpBase = routeRules.proxy._proxyStripBase; + if (strpBase) { + targetPath = withoutBase(targetPath, strpBase); + } + target = joinURL(target.slice(0, -3), targetPath); + } else if (event.path.includes("?")) { + const query = getQuery(event.path); + target = withQuery(target, query); + } + return proxyRequest(event, target, { + fetch: ctx.localFetch, + ...routeRules.proxy + }); + } + }); +} +function getRouteRules(event) { + event.context._nitro = event.context._nitro || {}; + if (!event.context._nitro.routeRules) { + event.context._nitro.routeRules = getRouteRulesForPath( + withoutBase(event.path.split("?")[0], useRuntimeConfig().app.baseURL) + ); + } + return event.context._nitro.routeRules; +} +function getRouteRulesForPath(path) { + return defu({}, ..._routeRulesMatcher.matchAll(path).reverse()); +} + +function _captureError(error, type) { + console.error(`[${type}]`, error); + useNitroApp().captureError(error, { tags: [type] }); +} +function trapUnhandledNodeErrors() { + process.on( + "unhandledRejection", + (error) => _captureError(error, "unhandledRejection") + ); + process.on( + "uncaughtException", + (error) => _captureError(error, "uncaughtException") + ); +} +function joinHeaders(value) { + return Array.isArray(value) ? value.join(", ") : String(value); +} +function normalizeFetchResponse(response) { + if (!response.headers.has("set-cookie")) { + return response; + } + return new Response(response.body, { + status: response.status, + statusText: response.statusText, + headers: normalizeCookieHeaders(response.headers) + }); +} +function normalizeCookieHeader(header = "") { + return splitCookiesString(joinHeaders(header)); +} +function normalizeCookieHeaders(headers) { + const outgoingHeaders = new Headers(); + for (const [name, header] of headers) { + if (name === "set-cookie") { + for (const cookie of normalizeCookieHeader(header)) { + outgoingHeaders.append("set-cookie", cookie); + } + } else { + outgoingHeaders.set(name, joinHeaders(header)); + } + } + return outgoingHeaders; +} + +function isJsonRequest(event) { + if (hasReqHeader(event, "accept", "text/html")) { + return false; + } + return hasReqHeader(event, "accept", "application/json") || hasReqHeader(event, "user-agent", "curl/") || hasReqHeader(event, "user-agent", "httpie/") || hasReqHeader(event, "sec-fetch-mode", "cors") || event.path.startsWith("/api/") || event.path.endsWith(".json"); +} +function hasReqHeader(event, name, includes) { + const value = getRequestHeader(event, name); + return value && typeof value === "string" && value.toLowerCase().includes(includes); +} + +const errorHandler$0 = (async function errorhandler(error, event, { defaultHandler }) { + if (event.handled || isJsonRequest(event)) { + return; + } + const defaultRes = await defaultHandler(error, event, { json: true }); + const statusCode = error.statusCode || 500; + if (statusCode === 404 && defaultRes.status === 302) { + setResponseHeaders(event, defaultRes.headers); + setResponseStatus(event, defaultRes.status, defaultRes.statusText); + return send(event, JSON.stringify(defaultRes.body, null, 2)); + } + if (typeof defaultRes.body !== "string" && Array.isArray(defaultRes.body.stack)) { + defaultRes.body.stack = defaultRes.body.stack.join("\n"); + } + const errorObject = defaultRes.body; + const url = new URL(errorObject.url); + errorObject.url = withoutBase(url.pathname, useRuntimeConfig(event).app.baseURL) + url.search + url.hash; + errorObject.message ||= "Server Error"; + errorObject.data ||= error.data; + errorObject.statusMessage ||= error.statusMessage; + delete defaultRes.headers["content-type"]; + delete defaultRes.headers["content-security-policy"]; + setResponseHeaders(event, defaultRes.headers); + const reqHeaders = getRequestHeaders(event); + const isRenderingError = event.path.startsWith("/__nuxt_error") || !!reqHeaders["x-nuxt-error"]; + const res = isRenderingError ? null : await useNitroApp().localFetch( + withQuery(joinURL(useRuntimeConfig(event).app.baseURL, "/__nuxt_error"), errorObject), + { + headers: { ...reqHeaders, "x-nuxt-error": "true" }, + redirect: "manual" + } + ).catch(() => null); + if (event.handled) { + return; + } + if (!res) { + const { template } = await Promise.resolve().then(function () { return errorDev; }) ; + { + errorObject.description = errorObject.message; + } + setResponseHeader(event, "Content-Type", "text/html;charset=UTF-8"); + return send(event, template(errorObject)); + } + const html = await res.text(); + for (const [header, value] of res.headers.entries()) { + setResponseHeader(event, header, value); + } + setResponseStatus(event, res.status && res.status !== 200 ? res.status : defaultRes.status, res.statusText || defaultRes.statusText); + return send(event, html); +}); + +function defineNitroErrorHandler(handler) { + return handler; +} + +const errorHandler$1 = defineNitroErrorHandler( + async function defaultNitroErrorHandler(error, event) { + const res = await defaultHandler(error, event); + if (!event.node?.res.headersSent) { + setResponseHeaders(event, res.headers); + } + setResponseStatus(event, res.status, res.statusText); + return send( + event, + typeof res.body === "string" ? res.body : JSON.stringify(res.body, null, 2) + ); + } +); +async function defaultHandler(error, event, opts) { + const isSensitive = error.unhandled || error.fatal; + const statusCode = error.statusCode || 500; + const statusMessage = error.statusMessage || "Server Error"; + const url = getRequestURL(event, { xForwardedHost: true, xForwardedProto: true }); + if (statusCode === 404) { + const baseURL = "/"; + if (/^\/[^/]/.test(baseURL) && !url.pathname.startsWith(baseURL)) { + const redirectTo = `${baseURL}${url.pathname.slice(1)}${url.search}`; + return { + status: 302, + statusText: "Found", + headers: { location: redirectTo }, + body: `Redirecting...` + }; + } + } + await loadStackTrace(error).catch(consola.error); + const youch = new Youch(); + if (isSensitive && !opts?.silent) { + const tags = [error.unhandled && "[unhandled]", error.fatal && "[fatal]"].filter(Boolean).join(" "); + const ansiError = await (await youch.toANSI(error)).replaceAll(process.cwd(), "."); + consola.error( + `[request error] ${tags} [${event.method}] ${url} + +`, + ansiError + ); + } + const useJSON = opts?.json || !getRequestHeader(event, "accept")?.includes("text/html"); + const headers = { + "content-type": useJSON ? "application/json" : "text/html", + // Prevent browser from guessing the MIME types of resources. + "x-content-type-options": "nosniff", + // Prevent error page from being embedded in an iframe + "x-frame-options": "DENY", + // Prevent browsers from sending the Referer header + "referrer-policy": "no-referrer", + // Disable the execution of any js + "content-security-policy": "script-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self';" + }; + if (statusCode === 404 || !getResponseHeader(event, "cache-control")) { + headers["cache-control"] = "no-cache"; + } + const body = useJSON ? { + error: true, + url, + statusCode, + statusMessage, + message: error.message, + data: error.data, + stack: error.stack?.split("\n").map((line) => line.trim()) + } : await youch.toHTML(error, { + request: { + url: url.href, + method: event.method, + headers: getRequestHeaders(event) + } + }); + return { + status: statusCode, + statusText: statusMessage, + headers, + body + }; +} +async function loadStackTrace(error) { + if (!(error instanceof Error)) { + return; + } + const parsed = await new ErrorParser().defineSourceLoader(sourceLoader).parse(error); + const stack = error.message + "\n" + parsed.frames.map((frame) => fmtFrame(frame)).join("\n"); + Object.defineProperty(error, "stack", { value: stack }); + if (error.cause) { + await loadStackTrace(error.cause).catch(consola.error); + } +} +async function sourceLoader(frame) { + if (!frame.fileName || frame.fileType !== "fs" || frame.type === "native") { + return; + } + if (frame.type === "app") { + const rawSourceMap = await readFile(`${frame.fileName}.map`, "utf8").catch(() => { + }); + if (rawSourceMap) { + const consumer = await new SourceMapConsumer(rawSourceMap); + const originalPosition = consumer.originalPositionFor({ line: frame.lineNumber, column: frame.columnNumber }); + if (originalPosition.source && originalPosition.line) { + frame.fileName = resolve(dirname(frame.fileName), originalPosition.source); + frame.lineNumber = originalPosition.line; + frame.columnNumber = originalPosition.column || 0; + } + } + } + const contents = await readFile(frame.fileName, "utf8").catch(() => { + }); + return contents ? { contents } : void 0; +} +function fmtFrame(frame) { + if (frame.type === "native") { + return frame.raw; + } + const src = `${frame.fileName || ""}:${frame.lineNumber}:${frame.columnNumber})`; + return frame.functionName ? `at ${frame.functionName} (${src}` : `at ${src}`; +} + +const errorHandlers = [errorHandler$0, errorHandler$1]; + +async function errorHandler(error, event) { + for (const handler of errorHandlers) { + try { + await handler(error, event, { defaultHandler }); + if (event.handled) { + return; // Response handled + } + } catch(error) { + // Handler itself thrown, log and continue + console.error(error); + } + } + // H3 will handle fallback +} + +const script$1 = ` +if (!window.__NUXT_DEVTOOLS_TIME_METRIC__) { + Object.defineProperty(window, '__NUXT_DEVTOOLS_TIME_METRIC__', { + value: {}, + enumerable: false, + configurable: true, + }) +} +window.__NUXT_DEVTOOLS_TIME_METRIC__.appInit = Date.now() +`; + +const _awO5X7e3zUaUSV6omLgvJkH8iU1cOhcdLJutAppL56s = (function(nitro) { + nitro.hooks.hook("render:html", (htmlContext) => { + htmlContext.head.push(` \ No newline at end of file diff --git a/docs-v3/assets/css/main.css b/docs-v3/assets/css/main.css new file mode 100644 index 000000000..57b3056ce --- /dev/null +++ b/docs-v3/assets/css/main.css @@ -0,0 +1,129 @@ +@import 'tailwindcss/base'; +@import 'tailwindcss/components'; +@import 'tailwindcss/utilities'; + +/* Custom fonts */ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&display=swap'); + +/* Base styles */ +html { + scroll-behavior: smooth; +} + +body { + @apply font-sans antialiased; +} + +/* Scrollbar styling */ +::-webkit-scrollbar { + @apply w-2; +} + +::-webkit-scrollbar-track { + @apply bg-gray-100 dark:bg-gray-800; +} + +::-webkit-scrollbar-thumb { + @apply bg-gray-300 dark:bg-gray-600 rounded-full; +} + +::-webkit-scrollbar-thumb:hover { + @apply bg-gray-400 dark:bg-gray-500; +} + +/* Code block styling */ +pre { + @apply overflow-x-auto p-4 rounded-lg; +} + +/* Custom components */ +.prose-docs { + @apply prose prose-gray max-w-none dark:prose-dark; +} + +/* Code blocks with blue gradient in light theme */ +.prose-docs pre { + @apply bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-800 dark:to-gray-900 border border-blue-200 dark:border-gray-700 relative; +} + +.prose-docs pre code { + @apply text-gray-900 dark:text-gray-100; +} + +/* Code block copy button styling */ +.prose-docs .group:hover .copy-button { + @apply opacity-100; +} + +.prose-docs code { + @apply text-sm font-mono bg-blue-100 dark:bg-gray-800 text-blue-900 dark:text-blue-400 px-1 py-0.5 rounded; +} + +/* Inline code styling */ +.prose-docs :not(pre) > code { + @apply bg-blue-100 dark:bg-gray-800 text-blue-900 dark:text-blue-400 px-1 py-0.5 rounded font-medium; +} + +/* Navigation active states */ +.nav-link-active { + @apply text-primary-600 dark:text-primary-400 bg-primary-50 dark:bg-primary-900/20; +} + +/* Content transitions */ +.fade-enter-active, +.fade-leave-active { + transition: opacity 0.2s ease; +} + +.fade-enter-from, +.fade-leave-to { + opacity: 0; +} + +/* Focus styles */ +.focus-ring { + @apply focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2 dark:focus:ring-offset-gray-800; +} + +/* Mobile menu animation */ +.mobile-menu-enter-active, +.mobile-menu-leave-active { + transition: transform 0.3s ease, opacity 0.3s ease; +} + +.mobile-menu-enter-from { + transform: translateX(-100%); + opacity: 0; +} + +.mobile-menu-leave-to { + transform: translateX(-100%); + opacity: 0; +} + +/* Dark mode toggle animation */ +.dark-mode-toggle { + transition: transform 0.2s ease; +} + +.dark-mode-toggle:hover { + transform: scale(1.05); +} + +/* Search highlight styles */ +mark { + @apply bg-yellow-200 dark:bg-yellow-800 px-1 rounded text-gray-900 dark:text-white; +} + +/* Search modal animation */ +.search-modal-enter-active, +.search-modal-leave-active { + transition: all 0.2s ease; +} + +.search-modal-enter-from, +.search-modal-leave-to { + opacity: 0; + transform: scale(0.95); +} \ No newline at end of file diff --git a/docs-v3/components/CopyButton.vue b/docs-v3/components/CopyButton.vue new file mode 100644 index 000000000..b664f64b5 --- /dev/null +++ b/docs-v3/components/CopyButton.vue @@ -0,0 +1,88 @@ + + + + + \ No newline at end of file diff --git a/docs-v3/components/SearchInput.vue b/docs-v3/components/SearchInput.vue new file mode 100644 index 000000000..fb99005f9 --- /dev/null +++ b/docs-v3/components/SearchInput.vue @@ -0,0 +1,42 @@ + + + \ No newline at end of file diff --git a/docs-v3/components/SearchModal.vue b/docs-v3/components/SearchModal.vue new file mode 100644 index 000000000..791bc9abf --- /dev/null +++ b/docs-v3/components/SearchModal.vue @@ -0,0 +1,278 @@ + + + + + \ No newline at end of file diff --git a/docs-v3/components/TheHeader.vue b/docs-v3/components/TheHeader.vue new file mode 100644 index 000000000..d3d1dccb2 --- /dev/null +++ b/docs-v3/components/TheHeader.vue @@ -0,0 +1,76 @@ + + + \ No newline at end of file diff --git a/docs-v3/components/TheSidebar.vue b/docs-v3/components/TheSidebar.vue new file mode 100644 index 000000000..bd9be2bd8 --- /dev/null +++ b/docs-v3/components/TheSidebar.vue @@ -0,0 +1,99 @@ + + + \ No newline at end of file diff --git a/docs-v3/components/TheTableOfContents.vue b/docs-v3/components/TheTableOfContents.vue new file mode 100644 index 000000000..404d2d565 --- /dev/null +++ b/docs-v3/components/TheTableOfContents.vue @@ -0,0 +1,97 @@ + + + \ No newline at end of file diff --git a/docs-v3/components/ThemeToggle.vue b/docs-v3/components/ThemeToggle.vue new file mode 100644 index 000000000..8fd6333c0 --- /dev/null +++ b/docs-v3/components/ThemeToggle.vue @@ -0,0 +1,49 @@ + + + \ No newline at end of file diff --git a/docs-v3/components/ToastContainer.vue b/docs-v3/components/ToastContainer.vue new file mode 100644 index 000000000..c9424d8ae --- /dev/null +++ b/docs-v3/components/ToastContainer.vue @@ -0,0 +1,94 @@ + + + + + \ No newline at end of file diff --git a/docs-v3/components/content/Alert.vue b/docs-v3/components/content/Alert.vue new file mode 100644 index 000000000..83f65ad37 --- /dev/null +++ b/docs-v3/components/content/Alert.vue @@ -0,0 +1,13 @@ + + + \ No newline at end of file diff --git a/docs-v3/components/content/List.vue b/docs-v3/components/content/List.vue new file mode 100644 index 000000000..7cc3ffc36 --- /dev/null +++ b/docs-v3/components/content/List.vue @@ -0,0 +1,24 @@ + + + \ No newline at end of file diff --git a/docs-v3/components/content/ProseAlert.vue b/docs-v3/components/content/ProseAlert.vue new file mode 100644 index 000000000..a335ddb74 --- /dev/null +++ b/docs-v3/components/content/ProseAlert.vue @@ -0,0 +1,78 @@ + + + \ No newline at end of file diff --git a/docs-v3/components/content/ProseList.vue b/docs-v3/components/content/ProseList.vue new file mode 100644 index 000000000..82c44300e --- /dev/null +++ b/docs-v3/components/content/ProseList.vue @@ -0,0 +1,35 @@ + + + \ No newline at end of file diff --git a/docs-v3/components/content/ProsePre.vue b/docs-v3/components/content/ProsePre.vue new file mode 100644 index 000000000..6a25af823 --- /dev/null +++ b/docs-v3/components/content/ProsePre.vue @@ -0,0 +1,130 @@ + + + + + \ No newline at end of file diff --git a/docs-v3/composables/useNavigation.ts b/docs-v3/composables/useNavigation.ts new file mode 100644 index 000000000..eff13cc0f --- /dev/null +++ b/docs-v3/composables/useNavigation.ts @@ -0,0 +1,63 @@ +export const useNavigation = () => { + const navigationSections = [ + { + title: 'Getting Started', + items: [ + { title: 'Introduction', path: '/' }, + { title: 'Quickstart', path: '/quickstart' } + ] + }, + { + title: 'API', + items: [ + { title: 'Repositories', path: '/api/repositories' }, + { title: 'Fields', path: '/api/fields' }, + { title: 'Actions', path: '/api/actions' }, + { title: 'Relations', path: '/api/relations' }, + { title: 'Getters', path: '/api/getters' }, + { title: 'Advanced Repositories', path: '/api/repositories-advanced' }, + { title: 'Repository Generation', path: '/api/repository-generation' }, + { title: 'REST Methods', path: '/api/rest-methods' }, + { title: 'Serializer', path: '/api/serializer' }, + { title: 'Validation Methods', path: '/api/validation-methods' } + ] + }, + { + title: 'Authentication', + items: [ + { title: 'Authentication', path: '/auth/authentication' }, + { title: 'Authorization', path: '/auth/authorization' }, + { title: 'Profile', path: '/auth/profile' } + ] + }, + { + title: 'Search', + items: [ + { title: 'Basic Filters', path: '/search/basic-filters' }, + { title: 'Advanced Filters', path: '/search/advanced-filters' }, + { title: 'Sorting', path: '/search/sorting' } + ] + }, + { + title: 'Performance', + items: [ + { title: 'Performance', path: '/performance/performance' }, + { title: 'Solutions', path: '/performance/solutions' } + ] + }, + { + title: 'Advanced', + items: [ + { title: 'GraphQL', path: '/graphql/graphql' }, + { title: 'GraphQL Generation', path: '/graphql/graphql-generation' }, + { title: 'MCP Server', path: '/mcp/mcp' }, + { title: 'Boost', path: '/boost/boost' }, + { title: 'Testing', path: '/testing/testing' } + ] + } + ] + + return { + navigationSections + } +} \ No newline at end of file diff --git a/docs-v3/composables/useSearch.ts b/docs-v3/composables/useSearch.ts new file mode 100644 index 000000000..13d00d1a1 --- /dev/null +++ b/docs-v3/composables/useSearch.ts @@ -0,0 +1,50 @@ +export interface SearchResult { + path: string + title: string + description?: string + category?: string + excerpt?: string +} + +export const useSearch = () => { + const searchContent = async (query: string): Promise => { + if (!query.trim()) return [] + + try { + // Search through all content files + const results = await queryContent() + .where({ + $or: [ + { title: { $icontains: query } }, + { description: { $icontains: query } } + ] + }) + .only(['_path', 'title', 'description', 'category']) + .limit(15) + .find() + + return results.map((result: any) => ({ + path: result._path, + title: result.title || 'Untitled', + description: result.description, + category: result.category || 'Documentation', + excerpt: result.description + })) + } catch (error) { + console.error('Search error:', error) + return [] + } + } + + const highlightSearchTerm = (text: string, searchTerm: string): string => { + if (!searchTerm || !text) return text + + const regex = new RegExp(`(${searchTerm})`, 'gi') + return text.replace(regex, '$1') + } + + return { + searchContent, + highlightSearchTerm + } +} \ No newline at end of file diff --git a/docs-v3/composables/useSearchModal.ts b/docs-v3/composables/useSearchModal.ts new file mode 100644 index 000000000..fc1a15b81 --- /dev/null +++ b/docs-v3/composables/useSearchModal.ts @@ -0,0 +1,25 @@ +// Global search modal state using reactive +const searchModalState = reactive({ + isOpen: false +}) + +export const useSearchModal = () => { + const openModal = () => { + searchModalState.isOpen = true + } + + const closeModal = () => { + searchModalState.isOpen = false + } + + const toggleModal = () => { + searchModalState.isOpen = !searchModalState.isOpen + } + + return { + isOpen: readonly(toRef(searchModalState, 'isOpen')), + openModal, + closeModal, + toggleModal + } +} \ No newline at end of file diff --git a/docs-v3/composables/useToast.ts b/docs-v3/composables/useToast.ts new file mode 100644 index 000000000..196fae411 --- /dev/null +++ b/docs-v3/composables/useToast.ts @@ -0,0 +1,49 @@ +interface ToastMessage { + id: string + message: string + type: 'success' | 'error' | 'info' + duration?: number +} + +const toasts = ref([]) + +export const useToast = () => { + const showToast = (message: string, type: 'success' | 'error' | 'info' = 'info', duration = 3000) => { + const id = Math.random().toString(36).substr(2, 9) + const toast: ToastMessage = { id, message, type, duration } + + toasts.value.push(toast) + + setTimeout(() => { + removeToast(id) + }, duration) + } + + const removeToast = (id: string) => { + const index = toasts.value.findIndex(toast => toast.id === id) + if (index > -1) { + toasts.value.splice(index, 1) + } + } + + const success = (message: string, duration?: number) => { + showToast(message, 'success', duration) + } + + const error = (message: string, duration?: number) => { + showToast(message, 'error', duration) + } + + const info = (message: string, duration?: number) => { + showToast(message, 'info', duration) + } + + return { + toasts: readonly(toasts), + showToast, + removeToast, + success, + error, + info + } +} \ No newline at end of file diff --git a/docs-v3/content/api/actions.md b/docs-v3/content/api/actions.md new file mode 100644 index 000000000..49ca9efa0 --- /dev/null +++ b/docs-v3/content/api/actions.md @@ -0,0 +1,540 @@ +--- +title: Actions +menuTitle: Actions +category: API +position: 9 +--- + +## Motivation + +Built in CRUD operations and filtering, Restify allows you to define extra actions for your repositories. + +Let's say you have a list of posts and you have to publish them. Usually, for these kind of operations, you have to define a custom route like: + +```php +$router->post('posts/publish', PublishPostsController::class); + +// PublishPostsController.php + +public function __invoke(RestifyRequest $request) +{ + //... +} +``` + +The `classic` approach is good. However, it has a few limitations. First, you have to manually take care of the `middleware` route, as the testability for these endpoints should be done separately, which might be hard to maintain. Ultimately, the endpoint is disconnected from the repository, which makes it feel out of context so it has a bad readability. + +On that wise, code readability, testability and maintainability may become hard. + +## Invokable Action Format + +The simplest way to define an action is to use the `invokable` class format. + +Here's an example: + +```php +namespace App\Restify\Actions; + +use Illuminate\Http\Request; + +class PublishPostAction +{ + public function __invoke(Request $request) + { + // $request->input(...) + + return response()->json([ + 'message' => 'Post published successfully', + ]); + } +} +``` + +Then add the `action` instance to the repository `actions` method: + +```php +... +public function actions(RestifyRequest $request): array +{ + return [ + new PublishPostAction, + ]; +} +... +``` + +Bellow we will see how to define actions in a more advanced way. + +## Action definition + +The action is nothing more than a class that extends the `Binaryk\LaravelRestify\Actions\Action` abstract class. + +It could be generated by using the following command: + +```bash +php artisan restify:action PublishPostsAction +``` + +This will generate the action class: + +```php +namespace App\Restify\Actions; + +use Binaryk\LaravelRestify\Actions\Action; +use Binaryk\LaravelRestify\Http\Requests\ActionRequest; +use Illuminate\Http\JsonResponse; +use Illuminate\Support\Collection; + +class PublishPostAction extends Action +{ + public function handle(ActionRequest $request, Collection $models): JsonResponse + { + return response()->json(); + } +} +``` + +The `$models` argument represents a collection of all the models for this query. + +### Register action + +Then add the action instance to the repository `actions` method: + +```php +// PostRepository.php + +public function actions(RestifyRequest $request): array +{ + return [ + PublishPostAction::new(); + ]; +} +``` + +### Authorize action + +You can authorize certain actions to be active for specific users: + +```php +public function actions(RestifyRequest $request): array +{ + return [ + PublishPostAction::new()->canSee(function (Request $request) { + return $request->user()->can('publishAnyPost', Post::class); + }), + ]; +} +``` + +### Call actions + +To call an action, you simply access: + +```http request +POST: api/restify/posts/actions?action=publish-posts-action +``` + +The `action` query param value is the `ke-bab` form of the filter class name by default, or a custom `$uriKey` [defined in the action](#custom-uri-key) + + +The payload could be any type of json data. However, if you're using an [index-action](#index-actions), you are required to pass the `repositories` key, which represents the list of model keys that we apply to this action: + +```json +{ + "repositories": [1, 2] +} +``` + +### Handle action + +As soon the action is called, the handled method will be invoked with the `$request` and a list of models matching the keys passed via `repositories`: + +```php +public function handle(ActionRequest $request, Collection $models) +{ + $models->each->publish(); + + return ok(); +} +``` + +## Action customizations + +Actions can be easily customized. + +### Action index query + +Similarly to repository [index query](/repositories-advanced#index-query), we can do the same by adding the `indexQuery` method on the action: + +```php +class PublishPostAction extends Action +{ + public static function indexQuery(RestifyRequest $request, $query) + { + $query->whereNotNull('published_at'); + } + + ... +} +``` + +This method will be called right before items are retrieved from the database, so you can filter out or eager load using your custom statements. + +### Custom uri key + +Since your class names might change along the way, you can define a `$uriKey` property to your actions, so the frontend will always use the same `action` query when applying an action: + +```php +class PublishPostAction extends Action +{ + public static $uriKey = 'publish-posts'; + + //... + +}; +``` + +### Rules + +Similarly to [advanced filters rules](/search/advanced-filters#advanced-filter-rules), you could define rules for the action so the payload will get validated before the handle method is fired. + +```php +public function rules(): array +{ + return [ + 'active' => ['required', 'bool'], + ]; +} +``` + + +Restify doesn't validate the payload automatically as it does for filters, so you're free to validate the payload in the handle method. + + +Always validate the payload as early as possible in the `handle` method: + + +```php +public function handle(ActionRequest $request, Collection $models) +{ + $request->validate($this->rules()); + + ... +} +``` + +## Actions scope + +By default, any action could be used on [index](#index-actions) as well as on [show](#show-actions). However, you can choose to instruct your action to be displayed to a specific scope. + +## Show actions + +Show actions are used when you have to apply them for a single item. + +### Show action definition + +The show action definition is different, in a way it receives arguments for the `handle` method. + +Restify automatically resolves Eloquent models defined in the route id and passes them to the action's handle method: + +```php +// PublishPostAction.php + +public function handle(ActionRequest $request, Post $post): JsonResponse +{ + +} + +``` + +### Show action registration + +To register a show action, we have to use the `->onlyOnShow()` accessor: + +```php +public function actions(RestifyRequest $request) +{ + return [ + PublishPostAction::new()->onlyOnShow(), + ]; +} +``` + +### Show action call + +The post URL should include the key of the model we want Restify to resolve: + +```http request +POST: api/restfiy/posts/1/actions?action=publish-post-action +``` + +The payload could be empty: + +```json +{} +``` + +### List show actions + +To get the list of available actions only for a specific model key: + +```http request +GET: api/api/restify/posts/1/actions +``` + +See [get available actions](#get-available-actions) for more details. + +## Index actions + +Index actions are used when you have to apply them for a many items. + +### Index action definition + +The index action definition is different in the way it receives arguments for the `handle` method. + +Restify automatically resolves Eloquent models sent via the `repositories` key into the call payload. Then, it passes it to the action's handle method as a collection of items: + +```php +// PublishPostAction.php +use Illuminate\Support\Collection; + +public function handle(ActionRequest $request, Collection $posts): JsonResponse +{ + // +} + +``` + +### Index action registration + +To register an index action, we have to use the `->onlyOnIndex()` accessor: + +```php +// PostRepository.php + +public function actions(RestifyRequest $request) +{ + return [ + PublishPostsAction::new()->onlyOnIndex(), + ]; +} +``` + +### Index action call + +The post URL: + +```http request +POST: api/restfiy/posts/actions?action=publish-posts-action +``` + +The payload should always include a key called `repositories`, which is an array of model keys or the `all` keyword if you want to get them all: + +```json +{ + "repositories": [1, 2, 3] +} +``` + +So Restify will resolve posts with ids in the list of `[1, 2, 3]`. + +### Apply index action for all + +You can apply the index action for all the models from the database if you send the payload: + +```json +{ + "repositories": "all" +} +``` + +Restify will get chunks of 200 and send them into the `Collection` argument for the `handle` method. + +You can customize the chunk number by customizing the `chunkCount` action property: + +```php +// PublishPostAction.php + +public static int $chunkCount = 500; +``` + +### List index actions + +To get the list of available actions: + +```http request +GET: api/api/restify/posts/actions +``` + +See [get available actions](#get-available-actions) for more details. + +## Standalone actions + +Sometimes, you don't need to have an action with models. Let's say for example the authenticated user wants to disable +his/her account. + +### Standalone action definition: + +The index action definition is different, in a way it doesn't require the second argument for the `handle`. + +```php +// DisableProfileAction.php + +public function handle(ActionRequest $request): JsonResponse +{ + // +} + +``` + +### Standalone action registration + +There are two ways to register the standalone action: + +```php +// UserRepository + +public function actions(RestifyRequest $request) +{ + return [ + DisableProfileAction::new()->standalone(), + ]; +} +``` + +Using the `->standalone()` mutator or by overriding the `$standalone` action property directly into the action: + +```php +class DisableProfileAction extends Action +{ + public bool $standalone = true; + + //... +} +``` + +### Standalone action call + +To call a standalone action you're using a similar URL as for the [index action](#index-action-call) + +```http request +POST: api/restfiy/users/actions?action=disable-profile-action +``` + +However, you are not required to pass the `repositories` payload key. + +### List standalone actions + +Standalone actions will be displayed on both [listing show actions](#list-show-actions) or [listing index actions](#list-index-actions). + +## Filters + +You can apply any search, match, filter or eager loadings as for a usual request: + +```http request +POST: api/api/restify/posts/actions?action=publish-posts-action&id=1&filters= +``` + +This will apply the match for the `id = 1` and `filter` along with the match for the `repositories` payload you're +sending. + +## Action Log + +Oftentimes, it is quite useful to view a log of the actions that have been run against a model, or see when the model was +updated, deleted or created (and by whom). + +Thankfully, Restify makes it a breeze to add an action log to a model by attaching the `Binaryk\LaravelRestify\Models\Concerns\HasActionLogs` trait to the repository's corresponding Eloquent model. + +### Activate logs + +By simply adding the `HasActionLogs` trait to your model, it will log all actions and CRUD operations into the database into the `action_logs` table: + +```php +// Post.php + +class Post extends Model +{ + use \Binaryk\LaravelRestify\Models\Concerns\HasActionLogs; +} +``` + +### Display logs + +You can display them by attaching them to the related repository for example: + +```php +// PostRepository.php +use Binaryk\LaravelRestify\Fields\MorphToMany; +use Binaryk\LaravelRestify\Repositories\ActionLogRepository; + +public static function related(): array +{ + return [ + 'logs' => MorphToMany::make('actionLogs', ActionLogRepository::class), + ]; +} +``` + +Now you can call the posts with logs `api/restify/posts/1?related=logs`, and it will return you the list of actions +performed for posts: + +```json +[ + { + "id": "1", + "type": "action_logs", + "attributes": { + "user_id": "1", + "name": "Stored", + "actionable_type": "App\\Models\\Post", + "actionable_id": "1", + "status": "finished", + "original": [], + "changes": [], + "exception": "" + } + } +] +``` + +### Custom logs repository + +You can definitely use your own `ActionLogRepository`. Just make sure you have it defined into the config: + +```php +// config/restify.php +... +'logs' => [ + 'repository' => MyCustomLogsRepository::class, +], +``` + +## Get available actions + +The frontend that consumes your API could check available actions by using this exposed endpoint: + +```http request +GET: api/api/restify/posts/actions +``` + +This will answer with a json like: + +```json +{ + "data": { + "name": "Publish Posts Action", + "destructive": false, + "uriKey": "publish-posts-action", + "payload": [] + } +} +``` + +`name` - humanized name of the action + +`destructive` - you may extend the `Binaryk\LaravelRestify\Actions\DestructiveAction` to indicate to the frontend that +this action is destructive (could be used for deletions) + +`uriKey` - is the key of the action and it will be used to perform the action + +`payload` - a key / value object indicating required payload defined in the `rules` Action class diff --git a/docs-v3/content/api/fields.md b/docs-v3/content/api/fields.md new file mode 100644 index 000000000..c2b795402 --- /dev/null +++ b/docs-v3/content/api/fields.md @@ -0,0 +1,1518 @@ +--- +title: Fields +menuTitle: Fields +category: API +position: 8 +--- + +A field is basically the model's attribute representation. + +## Declaration + +Each Field generally extends the `Binaryk\LaravelRestify\Fields\Field` class from the Laravel Restify. This class ships +a fluent API for a variety of mutators, interceptors and validators. + +To add a field to a repository, we can simply add it to the repository's fields method. Typically, fields may be created +using their static `new` or `make` method. + +The first argument is always the attribute name and usually matches the database `column`. + +```php + +use Illuminate\Support\Facades\Hash; +use Binaryk\LaravelRestify\Fields\Field; +use Binaryk\LaravelRestify\Http\Requests\RestifyRequest; + +public function fields(RestifyRequest $request) +{ + return [ + Field::make('name')->required(), + + Field::make('email')->required()->storingRules('unique:users')->messages([ + 'required' => 'This field is required.', + ]), + ]; +} +``` + +### `field` helper + + + +Instead of using the `Field` class, you can use the `field` helper. For example: + +```php +field('email') +``` + + + +### Computed field + +The second optional argument is a callback or invokable, and it represents the displayable value of the field either in `show` or `index` requests. + +```php +field('name', fn() => 'John Doe') +``` + +The field above will always return the `name` value as `John Doe`. The field is still writeable, so you can update or create an entity by using it. + +### Readonly field + +If you don't want a field to be writeable you can mark it as readonly: + +```php +field('title')->readonly() +``` + +The `readonly` accepts a request as well as you can use: + +```php +field('title')->readonly(fn($request) => $request->user()->isGuest()) +``` + +### Virtual field + +A virtual field, is a field that's [computed](#computed-field) and [readonly](#readonly-field). + +```php +field('name', fn() => "$this->first_name $this->last_name")->readonly() +``` + + +## Authorization + +The `Field` class provides a few methods in order to authorize certain actions. Each authorization method accepts a `Closure` that +should return `true` +or `false`. The `Closure` will receive the incoming `\Illuminate\Http\Request` request. + +### Can see + +Sometimes, you may want to hide certain fields from a group of users. You may easily accomplish this by chaining +the `canSee`: + + ```php +public function fields(RestifyRequest $request) +{ + return [ + field('role_id')->canSee(fn($request) => $request->user()->isAdmin()) + ]; +} +``` + +### Can store + +The can store closure: + +```php +public function fields(RestifyRequest $request) +{ + return [ + field('role_id')->canStore(fn($request) => $request->user()->isAdmin()) +} +``` + +### Can update + +The can update closure: + +```php +public function fields(RestifyRequest $request) +{ + return [ + field('role_id')->canUpdate(fn($request) => $request->user()->isAdmin()) + ]; +} +``` + +### Can patch + +You can authorize PATCH operations specifically: + +```php +public function fields(RestifyRequest $request) +{ + return [ + field('status')->canPatch(fn($request) => $request->user()->can('patch-status')) + ]; +} +``` + +### Can update bulk + +For bulk update operations, you can control authorization: + +```php +public function fields(RestifyRequest $request) +{ + return [ + field('priority')->canUpdateBulk(fn($request) => $request->user()->isAdmin()) + ]; +} +``` + +## Bulk Operations + +Laravel Restify provides specialized methods for handling bulk operations (creating or updating multiple records at once). Fields have specific callbacks and validation rules for these scenarios. + +### Bulk Visibility Control + +You can control whether fields are visible during bulk operations: + +```php +public function fields(RestifyRequest $request) +{ + return [ + field('title')->showOnStoreBulk(true)->showOnUpdateBulk(false), + field('slug')->hideFromStoreBulk(), // Not editable during bulk creation + ]; +} +``` + +The available visibility methods for bulk operations are: +- `isShownOnStore()` - Check if field is shown during single store +- `isShownOnStoreBulk()` - Check if field is shown during bulk store +- `isShownOnUpdate()` - Check if field is shown during single update +- `isShownOnUpdateBulk()` - Check if field is shown during bulk update + +### Bulk Authorization + +Use specialized authorization methods for bulk operations: + +```php +public function fields(RestifyRequest $request) +{ + return [ + field('status') + ->canStore(fn($request) => $request->user()->isAdmin()) + ->canUpdateBulk(fn($request) => $request->user()->isSuperAdmin()), + ]; +} +``` + +## Field Type Detection + +Restify includes an intelligent field type detection system that automatically infers the appropriate data type for fields based on various factors. This is particularly useful for API schema generation and MCP integration. + +### Automatic Type Detection + +The `guessFieldType()` method analyzes fields using multiple strategies: + +```php +$field = field('email')->rules('required', 'email'); +$type = $field->guessFieldType(); // Returns: 'string' + +$field = field('is_active')->rules('boolean'); +$type = $field->guessFieldType(); // Returns: 'boolean' + +$field = field('age')->rules('integer', 'min:0'); +$type = $field->guessFieldType(); // Returns: 'number' +``` + +### Detection Strategies + +The system uses three detection strategies in order of priority: + +1. **Field Class Detection** - Analyzes the field class name (File, Image, Boolean, etc.) +2. **Validation Rules Detection** - Examines validation rules (email, boolean, integer, etc.) +3. **Attribute Name Patterns** - Looks for common naming patterns + +#### Field Class Patterns + +```php +File::make('avatar')->guessFieldType(); // 'string' +Image::make('photo')->guessFieldType(); // 'string' +BooleanField::make('active')->guessFieldType(); // 'boolean' +``` + +#### Validation Rule Patterns + +```php +field('email')->rules('email')->guessFieldType(); // 'string' +field('count')->rules('integer')->guessFieldType(); // 'number' +field('tags')->rules('array')->guessFieldType(); // 'array' +``` + +#### Attribute Name Patterns + +```php +field('is_featured')->guessFieldType(); // 'boolean' (is_ prefix) +field('user_id')->guessFieldType(); // 'number' (_id suffix) +field('created_at')->guessFieldType(); // 'string' (_at suffix) +field('settings_json')->guessFieldType(); // 'array' (_json suffix) +``` + +### Computed Field Detection + +You can check if a field is computed (virtual/calculated): + +```php +$field = field('full_name', fn() => "$this->first_name $this->last_name"); +$isComputed = $field->computed(); // Returns: true +``` + +## Sorting + +Fields can be made sortable, allowing API consumers to order results by field values. + +### Making Fields Sortable + +To make a field sortable, chain the `sortable()` method: + +```php +public function fields(RestifyRequest $request) +{ + return [ + field('name')->sortable(), + field('email')->sortable(), + field('created_at')->sortable(), + field('is_active')->sortable(), + ]; +} +``` + +### Sortable Column Configuration + +By default, the field's attribute name is used as the sortable column. You can specify a different column: + +```php +field('full_name')->sortable('name'), // Use 'name' column for 'full_name' field +``` + +### Disabling Sorting + +You can disable sorting for a field that was previously made sortable: + +```php +field('sensitive_data')->sortable(false), +``` + +### Conditional Sorting + +Make fields conditionally sortable based on request context: + +```php +field('internal_score')->sortable(fn($request) => $request->user()->isAdmin()), +``` + +### Using Sortable Fields + +Once fields are marked as sortable, API consumers can use them in sort requests: + +```http +GET /api/restify/users?sort=name +GET /api/restify/users?sort=-created_at # Descending +GET /api/restify/users?sort=name,-created_at # Multiple fields +``` + +## Matching + +Fields can be made matchable, allowing API consumers to filter results using query parameters. + +### Making Fields Matchable + +Use the `matchable()` method or convenient aliases: + +```php +public function fields(RestifyRequest $request) +{ + return [ + field('name')->matchableText(), // Text matching with LIKE + field('email')->matchable('users.email'), // Custom column - users table email + field('status')->matchableText(), // Text matching + field('is_active')->matchableBool(), // Boolean matching + field('age')->matchableInteger(), // Integer matching + field('created_at')->matchableDatetime(), // Date matching + field('price')->matchableBetween(), // Range matching + field('tags')->matchableArray(), // Array/IN matching + ]; +} +``` + +### Using Matchable Fields + +Once fields are marked as matchable, API consumers can filter using query parameters: + +```http +GET /api/restify/posts?title=Laravel # Text matching +GET /api/restify/posts?is_active=true # Boolean matching +GET /api/restify/posts?user_id=5 # Integer matching +GET /api/restify/posts?created_at=2023-12-01 # Date matching +GET /api/restify/posts?price=100,500 # Range matching +GET /api/restify/posts?tags=php,laravel # Array matching + +# Negation (prefix with -) +GET /api/restify/posts?-status=draft # Exclude drafts +GET /api/restify/posts?-is_active=true # Inactive posts + +# Null checks +GET /api/restify/posts?description=null # Posts with no description +``` + +### Match Types Reference + +| Alias | Type | Example Usage | Query Behavior | +|-------|------|---------------|----------------| +| `matchableText()` | text | `?name=john` | `WHERE name LIKE '%john%'` | +| `matchableBool()` | boolean | `?is_active=true` | `WHERE is_active = 1` | +| `matchableInteger()` | integer | `?user_id=5` | `WHERE user_id = 5` | +| `matchableDatetime()` | datetime | `?created_at=2023-12-01` | `WHERE DATE(created_at) = '2023-12-01'` | +| `matchableBetween()` | between | `?price=100,500` | `WHERE price BETWEEN 100 AND 500` | +| `matchableArray()` | array | `?tags=php,laravel` | `WHERE tags IN ('php', 'laravel')` | + +### Advanced Matchable Configuration + +The `matchable()` method is flexible and accepts multiple types of arguments for advanced filtering scenarios: + +#### Basic Usage (No Arguments) + +When called without arguments, `matchable()` enables text-based matching using the field's attribute name: + +```php +field('title')->matchable(), // Enables text matching on 'title' column +``` + +#### Custom Column + +Specify a different database column for matching: + +```php +field('display_name')->matchable('users.name'), // Match against 'users.name' column +``` + +#### Custom Match Type + +Specify both column and match type: + +```php +field('status')->matchable('posts.status', 'text'), // Custom column with text matching +field('priority')->matchable('priority', 'integer'), // Integer matching +``` + +#### Closure-based Matching + +For complex filtering logic, pass a closure that receives the request, query builder, and value: + +```php +field('title')->matchable(function ($request, $query, $value) { + // Custom search logic - case insensitive partial matching + $query->where('title', 'like', "%{$value}%"); +}), + +field('content')->matchable(function ($request, $query, $value) { + // Full-text search across multiple columns + $query->whereRaw("MATCH(title, content) AGAINST(? IN BOOLEAN MODE)", [$value]); +}), + +field('location')->matchable(function ($request, $query, $value) { + // Complex geographical search + [$lat, $lng, $radius] = explode(',', $value); + $query->whereRaw( + 'ST_Distance_Sphere(POINT(longitude, latitude), POINT(?, ?)) <= ?', + [$lng, $lat, $radius * 1000] + ); +}), +``` + +#### Custom MatchFilter Classes + +For reusable complex filtering logic, create custom MatchFilter classes: + +```php +use Binaryk\LaravelRestify\Filters\MatchFilter; +use Binaryk\LaravelRestify\Http\Requests\RestifyRequest; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Relations\Relation; + +class CustomTitleFilter extends MatchFilter +{ + public function __construct() + { + parent::__construct(); + $this->setColumn('title'); // Set the column to filter on + } + + public function filter(RestifyRequest $request, Builder|Relation $query, $value) + { + // Custom filtering logic: search for titles that start with the given value + $query->where('title', 'like', "{$value}%"); + + return $query; + } +} +``` + +Then use the custom filter in your field definition: + +```php +field('title')->matchable(new CustomTitleFilter()), +``` + +#### Invokable Classes + +You can also use invokable classes for cleaner code organization: + +```php +class SearchTitleFilter +{ + public function __invoke($request, $query, $value) + { + $query->where('title', 'like', "%{$value}%") + ->orWhere('description', 'like', "%{$value}%"); + } +} + +// Usage +field('search')->matchable(new SearchTitleFilter()), +``` + +#### Practical Examples + +**E-commerce Product Search:** +```php +field('search')->matchable(function ($request, $query, $value) { + $query->where(function ($q) use ($value) { + $q->where('name', 'like', "%{$value}%") + ->orWhere('description', 'like', "%{$value}%") + ->orWhere('sku', 'like', "%{$value}%"); + }); +}), +``` + +**Date Range Filtering:** +```php +field('date_range')->matchable(function ($request, $query, $value) { + [$start, $end] = explode(',', $value); + $query->whereBetween('created_at', [$start, $end]); +}), +``` + +**Tag-based Filtering:** +```php +field('tags')->matchable(function ($request, $query, $value) { + $tags = explode(',', $value); + $query->whereHas('tags', function ($q) use ($tags) { + $q->whereIn('slug', $tags); + }); +}), +``` + +**Relationship Filtering:** +```php +field('author')->matchable(function ($request, $query, $value) { + $query->whereHas('author', function ($q) use ($value) { + $q->where('name', 'like', "%{$value}%") + ->orWhere('email', 'like', "%{$value}%"); + }); +}), +``` + +## Searchable + +Fields can be made searchable, enabling them to respond to global search queries. This provides field-level control over search behavior while maintaining the simplicity of the global search API. + +### Making Fields Searchable + +To make a field searchable, chain the `searchable()` method: + +```php +public function fields(RestifyRequest $request) +{ + return [ + field('title')->searchable(), + field('description')->searchable(), + field('email')->searchable(), + ]; +} +``` + +The `searchable()` method uses a unified flexible signature that accepts multiple arguments and works consistently across all field types: + +```php +// Basic usage +field('title')->searchable(), + +// Custom column +field('name')->searchable('users.full_name'), + +// With optional type +field('price')->searchable('products.price', 'numeric'), + +// Multiple attributes (especially useful for relationship fields like BelongsTo) +BelongsTo::make('author')->searchable('name', 'email', 'username'), + +// Array of attributes (legacy support) +BelongsTo::make('editor')->searchable(['users.name', 'users.email']), + +// Closure/callback +field('content')->searchable(function ($request, $query, $value) { + // Custom search logic +}), + +// Custom filter instance +field('complex_search')->searchable(new CustomSearchFilter()), + +// Invokable class +field('tags')->searchable(new TagSearchHandler()), +``` + +### Unified Method Signatures + +All searchable-related methods now use consistent signatures across regular fields and relationship fields: + +```php +// All field types use the same signatures: +searchable(...$attributes) // Flexible variadic signature +isSearchable(?RestifyRequest $request = null) // Optional request parameter +getSearchColumn(?RestifyRequest $request = null) // Optional request parameter + +// BelongsTo also provides relationship-specific method: +getSearchables(): array // Returns multiple searchable attributes +``` + +### Using Searchable Fields + +Searchable fields respond to the standard `search` query parameter: + +```http +GET /api/restify/posts?search=laravel +``` + +This will search across all searchable fields for the term "laravel". + +### Advanced Searchable Configuration + +#### Basic Usage (No Arguments) + +When called without arguments, `searchable()` applies standard search behavior using the field's attribute: + +```php +field('title')->searchable(), // Searches the 'title' column with LIKE operator +``` + +#### Custom Column + +Specify a different database column for searching: + +```php +field('author_name')->searchable('users.name'), // Search in users.name column +``` + +You can also specify multiple attributes for relationship fields (like BelongsTo): + +```php +BelongsTo::make('author', UserRepository::class)->searchable('name', 'email'), +``` + +#### Closure-based Searching + +For custom search logic, pass a closure that receives the request, query builder, and search value: + +```php +field('content')->searchable(function ($request, $query, $value) { + $query->where('title', 'LIKE', "%{$value}%") + ->orWhere('description', 'LIKE', "%{$value}%"); +}), +``` + +#### Custom SearchableFilter Classes + +Create dedicated filter classes for complex search logic: + +```php +field('complex_search')->searchable(new CustomContentSearchFilter), +``` + +Where `CustomContentSearchFilter` extends `SearchableFilter`: + +```php +use Binaryk\LaravelRestify\Filters\SearchableFilter; +use Binaryk\LaravelRestify\Http\Requests\RestifyRequest; + +class CustomContentSearchFilter extends SearchableFilter +{ + public function filter(RestifyRequest $request, $query, $value) + { + return $query->where(function ($q) use ($value) { + $q->where('title', 'LIKE', "%{$value}%") + ->orWhere('description', 'LIKE', "%{$value}%") + ->orWhere('tags', 'LIKE', "%{$value}%"); + }); + } +} +``` + +#### Invokable Classes + +For reusable search logic, use invokable classes: + +```php +field('tags')->searchable(new TagSearchFilter), +``` + +```php +class TagSearchFilter +{ + public function __invoke($request, $query, $value) + { + $tags = explode(',', $value); + $query->whereHas('tags', function ($q) use ($tags) { + $q->whereIn('name', $tags); + }); + } +} +``` + +#### Practical Examples + +**Full-text Search:** +```php +field('content')->searchable(function ($request, $query, $value) { + $query->whereFullText(['title', 'description'], $value); +}), +``` + +**Multi-field Search:** +```php +field('user_search')->searchable(function ($request, $query, $value) { + $query->where('name', 'LIKE', "%{$value}%") + ->orWhere('email', 'LIKE', "%{$value}%") + ->orWhere('phone', 'LIKE', "%{$value}%"); +}), +``` + +**Relationship Search:** +```php +field('author')->searchable(function ($request, $query, $value) { + $query->whereHas('author', function ($q) use ($value) { + $q->where('name', 'like', "%{$value}%"); + }); +}), +``` + +**JSON Search:** +```php +field('metadata')->searchable(function ($request, $query, $value) { + $query->whereJsonContains('metadata->tags', $value); +}), +``` + +## Validation + +There is a golden rule that says - catch the exception as soon as possible on its request way. + +Validations are the first bridge of your request information, so it would be a good start to validate your input. In this manner, you +don't have to worry about the payload anymore. + +### Attaching rules + +Validation rules could be added by chaining the `rules` method to +attach [validation rules](https://laravel.com/docs/validation#available-validation-rules) to the field: + +```php +field('email')->rules('required', 'email'), +``` + +Of course, if you are leveraging Laravel's support +for [validation rule objects](https://laravel.com/docs/validation#using-rule-objects), you may attach those to the resources +as well: + +```php +Field::new('email')->rules('required', new CustomRule), +``` + +Additionally, you may use [custom Closure rules](https://laravel.com/docs/validation#using-closures) +to validate your resource fields: + +```php +Field::new('email')->rules('required', function($attribute, $value, $fail) { + if (strtolower($value) !== $value) { + return $fail('The '.$attribute.' field must be lowercase.'); + } +}), +``` + + + +Considering the `required` rule is very often used, Restify provides a `required()` validation +helper: `field('email')->required()` + + + +These rules will be applied for all the update and store requests. + +### Storing Rules + +If you would like to define more specific rules that only apply when a resource is being stored, you might want to use +the `storingRules` method: + +```php +Field::new('email') + ->rules('required', 'email', 'max:255') + ->storingRules('unique:users,email'); +``` + +Considering the fact that Restify concatenates rules provided by the `rules()` method, the entire validation for a POST request on +this repository will look like this: + +```php +$request->validate([ + 'email' => ['required', 'email', 'max:255', 'unique:users,email'] +]); +``` + +### Updating Rules + +Similarly, if you would like to define rules that only apply when a resource is being updated, you may use +the `updatingRules` method. + +```php +Field::new('email')->updatingRules('required', 'email'); +``` + +### Bulk Rules + +For bulk operations, you can specify validation rules that apply only during bulk store or bulk update operations: + +#### Store Bulk Rules + +Rules that apply only during bulk store operations: + +```php +Field::new('email') + ->rules('required', 'email') + ->storeBulkRules('unique:users,email'); +``` + +#### Update Bulk Rules + +Rules that apply only during bulk update operations: + +```php +Field::new('email') + ->rules('email') + ->updateBulkRules('required'); +``` + +### Store Rules Alias + +You can also use `storeRules()` as an alias for `storingRules()`: + +```php +Field::new('email')->storeRules('unique:users,email'); +``` + +## Interceptors + +Sometimes you might want to take control over certain Field actions. + +That's why the Field class exposes a lot of chained methods you can call to configure it. + +### Fill callback + +During the `store` and `update` requests, there are two steps before the value from the Request is attached to the model attribute. + +First, it is retrieved from the application request and passed to the `fillCallback`. Then, the value is passed through the `storeCallback` or `updateCallback`: + +You may intercept each of these with closures. + +Let's start with the `fillCallback`. It accepts a `callable` (an invokable class) or a Closure. The callable will receive the Request, the repository model (an empty one for storing and filled one for updating) and the attribute name: + +```php +field('title')->fillCallback(function (RestifyRequest $request, Post $model, $attribute) { + $model->title = strtoupper($request->input('title_from_the_request')); +}) +``` + +This way you can get anything from the `$request` and perform any transformations with the value before storing. + +### Store callback + +Another handy interceptor is the `storeCallback`. This is the step that comes immediately before attaching the value from the +request to the model attribute: + +This interceptor may be useful for modifying the value passed through the `$request`. + +```php +Field::new('password')->storeCallback(function (RestifyRequest $request) { + return Hash::make($request->input('password')); +}); +``` + +### Update callback + +The `updateCallback` works in the same manner. Let's use an invokable this time: + +```php +Field::new('password')->updateCallback(new PasswordUpdateInvokable); +``` + +Where the `PasswordUpdateInvokable` could be an invokable class: + +```php +class PasswordUpdateInvokable +{ + public function __invoke(Request $request) + { + return Hash::make($request->input('password')); + } +} +``` + +### Store bulk callback + +For bulk store operations, you can use the `storeBulkCallback` to modify values during bulk creation: + +```php +Field::new('slug')->storeBulkCallback(function (RestifyRequest $request) { + return Str::slug($request->input('title')); +}); +``` + +### Index Callback + +Sometimes, you might want to transform an attribute from the database right before it is returned to the frontend. + +Transform the value for the following index request: + +```php +Field::new('password')->indexCallback(function ($value) { + return Hash::make($value); +}); +``` + +### Show callback + +Transform the value for the following show request: + +```php +Field::new('password')->showCallback(function ($value) { + return Hash::make($value); +}); +``` + +### Resolve callback + +Transform the value for both `show` and `index` requests: + +```php +Field::new('password')->resolveCallback(function ($value) { + return Hash::make($value); +}); +``` + +### Fields actionable + +At times, storing attributes might require the stored model before saving it. + +For example, let's say the Post model uses the [media library](https://spatie.be/docs/laravel-medialibrary/v9/introduction), and has the `media` relationship that is a list of Media files: + +```php +// PostRepository + +public function fields(RestifyRequest $request): array +{ + return [ + field('title'), + + field('files', + fn () => $this->model()->media()->pluck('file_name') + ) + ->action(new AttachPostFileRestifyAction), + ]; +} +``` + +So we have a virtual `files` field (it's not an actual database column) that uses a [computed field](#computed-field) to display the list of Post's files names. The `->action()` calls and accepts an instance of a class that extends `Binaryk\LaravelRestify\Actions\Action`: + +```php +class AttachPostFileRestifyAction extends Action +{ + public function handle(RestifyRequest $request, Post $post): void + { + $post->addMediaFromRequest('file') + ->toMediaCollection(); + } +} +``` + +The action gets the `$request` and the current `$post` model. Let's say the frontend has to create a post with a file: + +```javascript +const data = new FormData; +data.append('file', blobFile); +data.append('title', 'Post title'); + +axios.post(`api/restify/posts`, data); +``` + +We were able to create the post and attach a file using media library in a single request. Otherwise, it would have implied creating 2 separate requests (post creation and file attaching). + +Actionable fields handle [store](/repositories#store-request), put, [bulk store](/repositories#store-bulk-flow) and bulk update requests. + +## Fallbacks + +### Default Stored Value + +Usually, there is necessary to store a field as `Auth::id()`. This field will be automatically populated by Restify if +you specify the `value` value for it: + +```php +Field::new('user_id')->value(Auth::id()); +``` + +or by using a closure: + +```php +Field::new('user_id')->hidden()->value(function(RestifyRequest $request, $model, $attribute) { + return $request->user()->id; +}); +``` + +### Default Displayed Value + +If you have a field which has `null` value into the database, you might want to return a fallback default value for +the frontend: + +```php +Field::new('description')->default('N/A'); +``` + +Now, for the fields that don't have a description into the database, it will return `N/A`. + + +The default value is ONLY used for the READ, not for WRITE requests. + + +### Default Stored Value + +During any (update or store requests), this is called after the fill and store callbacks. + +You can pass a callable or a value, and it will be attached to the model if no value provided otherwise. + +Imagine it's like `attributes` in the model: + +```php +field('currency')->defaultCallback('EUR'), +``` + +## Customizations + +### Field label + +Field label, so you can replace a field attribute spelling when it is returned to the frontend: + +``` +Field::new('created_at')->label('sent_at') +``` + +If you want to populate this value from a frontend request, you can use the label as a payload key. + +### Hidden field + +Field can be setup as hidden: + +```php +Field::new('token')->hidden(); // this will not be visible +``` + +However, you can populate the field value when the entity is stored by using `value`: + +```php +Field::new('token')->value(Str::random(32))->hidden(); +``` + +### MCP Visibility Control + +When using Laravel Restify with Model Context Protocol (MCP), you can control field visibility specifically for MCP requests using dedicated methods: + +```php +// Hide field from MCP requests completely +Field::new('secret_key')->hideFromMcp() + +// Show field only in MCP requests (hide from regular API) +Field::new('mcp_metadata')->showOnIndex(false)->showOnShow(false)->showOnMcp(true) + +// Conditionally hide based on user permissions +Field::new('admin_notes')->hideFromMcp(function($request, $repository) { + return !$request->user()->isAdmin(); +}) + +// Show field in MCP based on user role +Field::new('sensitive_data')->showOnMcp(function($request, $repository) { + return $request->user()->can('view-sensitive', $repository); +}) +``` + +#### MCP Visibility Methods + +- **`showOnMcp($callback = true)`** - Control whether the field should be visible in MCP requests +- **`hideFromMcp($callback = true)`** - Hide the field from MCP requests (inverse of showOnMcp) + +Both methods accept either a boolean value or a callback function that receives the request and repository as parameters. + + +MCP visibility rules take precedence over regular `showOnIndex`/`showOnShow` rules when processing MCP requests. Fields are visible in MCP by default unless explicitly hidden. + + +#### How It Works + +The MCP visibility system automatically detects when a request is coming from an MCP tool and applies the appropriate visibility rules: + +1. **Regular API requests** use `showOnIndex()` and `showOnShow()` rules +2. **MCP requests** use `showOnMcp()` and `hideFromMcp()` rules +3. **Default behavior** - fields are visible in MCP unless explicitly hidden + +This allows you to have different field visibility for your regular API consumers versus AI agents accessing your data through MCP tools. + +### Field Descriptions + +Fields can have custom descriptions that are used when generating schema documentation, particularly useful for MCP tools and API documentation: + +```php +public function fields(RestifyRequest $request) +{ + return [ + field('status') + ->description('The current status of the item') + ->rules(['required', 'string']), + + field('feedbackable_id') + ->description('This is the id of the employee.') + ->rules(['required', 'string', 'max:26']), + + field('priority') + ->description(function($generatedDescription, $field, $repository) { + return $generatedDescription . ' - Values range from 1 (low) to 5 (high)'; + }), + ]; +} +``` + +The `description()` method accepts either: +- **String**: A static description text +- **Closure**: A callback that receives the auto-generated description, field instance, and repository for dynamic modifications + +When using a closure, you can: +- Modify the automatically generated description +- Add context-specific information +- Access field and repository data for dynamic descriptions + +The description callback receives three parameters: +- `$generatedDescription` - The automatically generated description based on field type and validation rules +- `$field` - The field instance +- `$repository` - The repository context + +### Custom Tool Schema + +When using MCP, you can define custom schema definitions for individual fields using the `toolSchema()` method: + +```php +Field::new('status')->toolSchema(function ($field, $request, $repository) { + return [ + 'type' => 'string', + 'enum' => ['draft', 'published', 'archived'], + 'description' => 'The publication status of the content' + ]; +}); + +Field::new('settings')->toolSchema(function ($field, $request, $repository) { + return [ + 'type' => 'object', + 'properties' => [ + 'theme' => ['type' => 'string'], + 'notifications' => ['type' => 'boolean'] + ], + 'description' => 'User configuration settings' + ]; +}); +``` + +The `toolSchema()` callback receives: +- `$field` - The field instance +- `$request` - The current request +- `$repository` - The parent repository + +This allows you to provide detailed schema information that helps MCP tools understand the structure and constraints of your data fields. + +## Hooks + +### After store + +You can handle the after field store callback: + +```php +Field::new('title')->afterStore(function($value) { + dump($value); +}) +``` + +### After update + +You can handle the after field is updated callback: + +```php +Field::new('title')->afterUpdate(function($value, $oldValue) { + dump($value, $oldValue); +}) +``` + +## File fields + +To illustrate the behavior of Restify file upload fields, let's assume our application's users can upload "avatar +photos" to their account. Our users' database table will have an `avatar` column. This column will contain the path +to the profile on disk, or, when using a cloud storage provider such as Amazon S3, the profile photo's path within its +bucket. + +### Defining the field + +Next, let's attach the file field to our `UserRepository`. In this example, we will create the field and instruct it to +store the underlying file on the `public` disk. This disk name should correspond to a disk name in your `filesystems` +configuration file: + +```php +use Binaryk\LaravelRestify\Fields\File; + +public function fields(RestifyRequest $request) +{ + return [ + File::make('avatar')->disk('public') + ]; +} +``` + + + +You can use `field('avatar')->file()` instead of `File::make('avatar')` as well. + + + +### How Files Are Stored + +When a file is uploaded by using this field, Restify will use +Laravel's [Filesystem integration](https://laravel.com/docs/filesystem) to store the file from the disk of your choice +with a randomly generated filename. Once the file is stored, Restify will store the relative path to the file in the +file field's underlying database column. + +### URL Input Support + +File fields also accept URL strings as input, providing flexibility when working with remote files or existing URLs: + +```php +// You can send either a file upload or a URL string +POST /api/restify/users +{ + "name": "John Doe", + "avatar": "https://example.com/images/avatar.jpg" +} + +// Or upload a file traditionally +POST /api/restify/users +Content-Type: multipart/form-data +name: John Doe +avatar: [binary file data] +``` + +When a valid URL is provided: +- The URL is stored directly in the database column +- If `storeOriginalName()` is configured, the filename from the URL is extracted and stored +- Validation rules are automatically adjusted to accept both files and URLs + +To illustrate the default behavior of the `File` field, let's take a look at an equivalent route that would store the +file in the same way: + +```php +use Illuminate\Http\Request; + +Route::post('/avatar', function (Request $request) { + $path = $request->avatar->store('/', 'public'); + + $request->user()->update([ + 'avatar' => $path, + ]); +}); +``` + +If you are using the `public` disk with the `local` driver, you should run the `php artisan storage:link` Artisan +command to create a symbolic link from `public/storage` to `storage/app/public`. To learn more about file storage in +Laravel, check out the [Laravel file storage documentation](https://laravel.com/docs/filesystem). + +### Image + +The `Image` field behaves exactly like the `File` field; however, it will instruct Restify to only accept mimetypes of +type `image/*` for it: + +```php +Image::make('avatar')->storeAs('avatar.jpg') +``` + +### Storing Metadata + +In addition to storing the path to the file within the storage system, you may also instruct Restify to store the +original client filename and its size (in bytes). You may accomplish this using the `storeOriginalName` and `storeSize` +methods. Each of these methods accepts the name of the column that you would want to store the file's information in: + +```php +Image::make('avatar') + ->storeOriginalName('avatar_original') + ->storeSize('avatar_size') + ->storeAs('avatar.jpg') +``` + +The image above will store the file with the name `avatar.jpg` in the `avatar` column, the original file name +into `avatar_original` column and file size in bytes under `avatar_size` column (only if these columns are fillable on +your model). + + + +You can use `field('avatar')->image()` instead of `Image::make('avatar')` as well. + + + +### Pruning & Deletion + +File fields are deletable by default, so check out the following field definition: + +```php +File::make('avatar') +``` + +You have a request to delete the avatar of the user with the id 1: + +```http request +DELETE: api/restify/users/1/field/avatar +``` + +You can override this behavior by using the `deletable` method: + +```php +File::make('Photo')->disk('public')->deletable(false) +``` + +Now, the field will not be deletable anymore. + +### Customizing File Storage + +Previously we learned that, by default, Restify stores the file using the `store` method of +the `Illuminate\Http\UploadedFile` class. However, you may fully customize this behavior based on your application's +needs. + +#### Customizing The Name / Path + +If you only need to customize the name or path of the stored file on disk, you may use the `path` and `storeAs` methods +of the `File` field: + +```php +use Illuminate\Http\Request; + +File::make('avatar') + ->disk('s3') + ->path($request->user()->id.'-attachments') + ->storeAs(function (Request $request) { + return sha1($request->attachment->getClientOriginalName()); + }), +``` + +#### Customizing The Entire Storage Process + +However, if you would like to take **full** control over the file storage logic of a field, you may use the `store` +method. The `store` method accepts a callable which receives the incoming HTTP request and the model's instance associated +with the request: + +```php +use Illuminate\Http\Request; + +File::make('avatar') + ->store(function (Request $request, $model) { + return [ + 'attachment' => $request->attachment->store('/', 's3'), + 'attachment_name' => $request->attachment->getClientOriginalName(), + 'attachment_size' => $request->attachment->getSize(), + ]; + }), +``` + +As you can see in the example above, the `store` callback is returning an array of keys and values. These key / value +pairs are mapped onto your model's instance before it is saved to the database, allowing you to update one or many of the +model's database columns after your file is stored. + +### Customizing File Display + +By default, Restify will display the file's stored path name. However, you may customize this behavior. + +#### Displaying temporary url + +For disks such as S3, you may instruct Restify to display a temporary URL to the file instead of the stored path name: + +```php + field('path') + ->file() + ->path("documents/".Auth::id()) + ->resolveUsingTemporaryUrl() + ->disk('s3'), + +``` + +The `resolveUsingTemporaryUrl` accepts 3 arguments: + + +- `$resolveTemporaryUrl` - a boolean to determine if the temporary url should be resolved. Defaults to `true`. + +- `$expiration` - A CarbonInterface to determine the time before the URL expires. Defaults to 5 minutes. + +- `$options` - An array of options to pass to the `temporaryUrl` method of the `Illuminate\Contracts\Filesystem\Filesystem` implementation. Defaults to an empty array. + +#### Displaying full url + +For disks such as `public`, you may instruct Restify to display a full URL to the file instead of the stored path name: + +```php + field('path') + ->file() + ->path("documents/".Auth::id()) + ->resolveUsingFullUrl() + ->disk('public'), + +``` + +#### Storeables + +Of course, performing all of your file storage logic within a Closure can cause your resource to become bloated. For +that reason, Restify allows you to pass an "Storable" class to the `store` method: + +```php +File::make('avatar')->store(AvatarStore::class), +``` + +The storable class should be a simple PHP class that implements the `Binaryk\LaravelRestify\Repositories\Storable` contract: + +```php + $request->file('avatar')->storeAs('/', 'avatar.jpg', 'customDisk') + ]; + } +} +``` + +### Command + + +You can use the php artisan restify:store AvatarStore command to generate a store file. + + +## Lazy Loading + +Fields can be configured to lazy load relationships, which is particularly useful for computed attributes that depend on related models. This helps avoid N+1 queries by ensuring relationships are loaded only when needed. + +### Making Fields Lazy + +Use the `lazy()` method to mark a field for lazy loading: + +```php +public function fields(RestifyRequest $request) +{ + return [ + // Lazy load the 'tags' relationship when displaying profileTagNames + field('profileTagNames', fn() => $this->model()->profileTagNames) + ->lazy('tags'), + + // Lazy load using the field's attribute name (if it matches the relationship) + field('tags', fn() => $this->model()->tags->pluck('name')) + ->lazy(), + + // Another example with user relationship + field('authorName', fn() => $this->model()->user->name ?? 'Unknown') + ->lazy('user'), + ]; +} +``` + +### How It Works + +When you have a model attribute like this: + +```php +class Post extends Model +{ + public function getProfileTagNamesAttribute(): array + { + return $this->tags()->pluck('name')->toArray(); + } + + public function tags() + { + return $this->belongsToMany(Tag::class); + } +} +``` + +You can create a field that efficiently loads this data: + +```php +field('profileTagNames', fn() => $this->model()->profileTagNames) + ->lazy('tags') +``` + +This ensures that: +1. The `tags` relationship is loaded before the field value is computed +2. Multiple fields using the same relationship won't cause additional queries +3. The computed value can safely access the relationship data + +### Lazy Loading Methods + +The `CanLoadLazyRelationship` trait provides the following methods: + +- `lazy(?string $relationshipName = null)` - Mark the field as lazy and optionally specify the relationship name +- `isLazy(RestifyRequest $request)` - Check if the field is configured for lazy loading +- `getLazyRelationshipName()` - Get the name of the relationship to lazy load + +### Benefits + +- **Performance**: Prevents N+1 queries when dealing with computed attributes +- **Efficiency**: Relationships are loaded only once, even if multiple fields depend on them +- **Flexibility**: Works with any relationship type (BelongsTo, HasMany, ManyToMany, etc.) +- **Clean Code**: Keeps your field definitions simple while ensuring optimal database usage + +## Utility Methods + +### Repository Management + +Fields can be assigned to repositories programmatically: + +```php +$field = Field::new('title'); +$field->setRepository($repository); +$field->setParentRepository($parentRepository); +``` + +These methods are primarily used internally by Restify but can be useful when building custom field logic. + +### Legacy Methods + +#### Deprecated append() Method + + + +The `append()` method has been deprecated in favor of `value()`. Use `value()` instead: + +```php +// Deprecated +field('user_id')->append(Auth::id()); + +// Recommended +field('user_id')->value(Auth::id()); +``` + + diff --git a/docs-v3/content/api/getters.md b/docs-v3/content/api/getters.md new file mode 100644 index 000000000..eeb350d6d --- /dev/null +++ b/docs-v3/content/api/getters.md @@ -0,0 +1,256 @@ +--- +title: Getters +menuTitle: Getters +category: API +position: 10 +--- + +## Motivation + +Restify provides powerful filters and gets routes with relationships. However, sometimes you might want to get some extra data for your repositories. + +Let's say you have a stripe user. This is how you retrieve the stripe user information through a get request: + +```php +Route::get('users/stripe-information', UserStripeController::class); + +// UserStripeController.php + +public function __invoke(Request $request) +{ + ... +} +``` + +The `classic` approach is good, although it has a few limitations. First, you have to take care of the route `middleware` manually, as the testability for these endpoints should be done separately, which might be hard to maintain. At last, the endpoint is disconnected from the repository, which makes it feel out of context so has a bad readability. + +That way, code readability, testability, and maintainability can become hard. + +## Invokable Getter Format + +The simplest way to define a getter is to use the `invokable` class format. + +Here's an example: + +```php +namespace App\Restify\Getters; + +class StripeInformationGetter +{ + public function __invoke() + { + return response()->json([ + 'foo' => 'bar', + ]); + } +} +``` + +Then add the getter instance to the repository `getters` method: + +```php +... +public function getters(RestifyRequest $request): array +{ + return [ + new StripeInformationGetter, + ]; +} +... +``` + +Bellow we will see how to define getters in a more advanced way. + +## Getter definition + +Getters are very similar to actions in this sense. The big difference is that getters only allow GET requests, and should not perform any kind of DB data writing: + +The getter is nothing more than a class that extends the `Binaryk\LaravelRestify\Getters\Getter` abstract class. + +An example of a getter class: + +```php +namespace App\Restify\Getters; + +use Binaryk\LaravelRestify\Getters\Getter; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request;use Illuminate\Support\Collection; + +class StripeInformationGetter extends Getter +{ + public static $uriKey = 'stripe-information'; + + public function handle(Request $request): JsonResponse + { + return response()->json([ + 'data' => $request->user()->asStripeUser() + ]); + } +} +``` + +### Register getter + +Then add the getter instance to the repository `getters` method: + +```php +// UserRepository.php + +public function getters(RestifyRequest $request): array +{ + return [ + StripeInformationGetter::new() + ]; +} +``` + +### Authorize getter + +You can authorize certain getters to be active for specific users: + +```php +public function getters(RestifyRequest $request): array +{ + return [ + StripeInformationGetter::new()->canSee(function (Request $request) { + return $request->user()->can('seeStripeInfo'), + }), + ]; +} +``` + +### Call getters + +To call a getter, you simply access: + +```http request +GET: api/restify/posts/getters/stripe-information +``` + +The `getter` query param value is the `ke-bab` form of the filter class name by default, or a custom `$uriKey` [defined in the getter](#custom-uri-key) + + +### Handle getter + +As soon the getter is called, the handled method will be invoked with the `$request`: + +```php +public function handle(Request $request) +{ + // + + return ok(); +} +``` + +## Getter customizations + +Getters could be easily customized. + +### Custom keys + +Since your class names could change along the way, you can define a `$uriKey` property to your getters, so the frontend will use always the same `getter` query when applying a getter: + +```php +class StripeInformationGetter extends Getter +{ + public static $uriKey = 'stripe-information'; + //... + +}; +``` + +## Getters scope + +By default, any getter could be used on [index](#index-getters) as well as on [show](#show-getters). However, you can choose to instruct your getter to be displayed to a specific scope. + +## Show getters + +Show getters are used when you have to apply them for a single item. + +### Show getter definition + +The show getter definition differs in how it receives arguments for the `handle` method. + +Restify automatically resolves Eloquent models defined in the route id and passes them to the getter's handle method: + +```php +public function handle(Request $request, User $user): JsonResponse +{ + +} + +``` + +### Show getter registration + +To register a show getter, we have to use the `->onlyOnShow()` accessor: + +```php +public function getters(RestifyRequest $request) +{ + return [ + StripeInformationGetter::new()->onlyOnShow(), + ]; +} +``` + +### Show getter call + +The post URL should include the key of the model we want Restify to resolve: + +```http request +GET: api/restfiy/users/1/getters/stripe-information +``` +### List show getters + +To get the list of available getters only for a specific model key: + +```http request +GET: api/api/restify/posts/1/getters +``` + +## Index getters + +Index getters are used when you have to apply them for many items. + +### Index getter definition + +The index getter definition differs in how it receives arguments for the `handle` method. + +```php +public function handle(Request $request): JsonResponse +{ + // +} + +``` + +### Index getter registration + +To register an index getter, we have to use the `->onlyOnIndex()` accessor: + +```php +public function getters(RestifyRequest $request) +{ + return [ + StripeInformationGetter::new()->onlyOnIndex(), + ]; +} +``` + +### Index getter call + +The post URL: + +```http request +GET: api/restfiy/posts/getters/stripe-information +``` + +### List index getters + +To get the list of available getters: + +```http request +GET: api/api/restify/posts/getters +``` diff --git a/docs-v3/content/api/relations.md b/docs-v3/content/api/relations.md new file mode 100644 index 000000000..a5aeeb97c --- /dev/null +++ b/docs-v3/content/api/relations.md @@ -0,0 +1,979 @@ +--- +title: Relations +menuTitle: Relations +category: API +position: 10 +--- + +## Introduction + +Eloquent provides a large variety of relationships. You can read about them [here](https://laravel.com/docs/eloquent-relationships). + +Restify handles all relationships and gives you an expressive way to list resource relationships. + +## Definition + +The list of relationships should be defined into a repository method called `related`: + +```php +public static function related(): array +{ + return []; +} +``` + +### Eager fields + +The `related` method will return an array that should be a key-value pair, where the key is the related name that the API will request, and the value could be an instance of `Binaryk\LaravelRestify\Fields\EagerField` or a relationship name defined in your model. + +Each `EagerField` declaration is similar to the `Field` one. The first argument is the `model` relationship name. The second argument is a repository that represents the related entity. + +Let's say we have a User that has a list of posts. We will define it this way: + +```php +HasMany::make('posts', PostRepository::class), +``` +or: +```php +HasMany::make('posts'), +``` + + +Restify 7+ will guess the serialization repository using the key, so you don't necessarily have to specify it: + + + +### Related Declaration + +Let's see how can we inform a repository about its relationships: + +```php +// CompanyRepository +public static function related(): array +{ + return [ + 'usersRelationship' => HasMany::make('users', UserRepository::class), + + HasMany::make('posts'), + + 'extraData' => fn() => ['location' => 'Romania'], + + 'extraMeta' => new Invokable(), + + 'country', + ]; +} +``` + +Above we can see a few types of relationships declarations that Restify provides. Let's explain them. + +#### Long definition + +```php +'usersRelationship' => HasMany::make('users', UserRepository::class), +``` + +This means that there is a relationship of the `hasMany` type declared in the Company model. The Eloquent relationship name is `users` (see the first argument of the HasMany field): + +```php +// app/Models/Company.php +public function users(): \Illuminate\Database\Eloquent\Relations\HasMany +{ + return $this->hasMany(User::class); +} +``` + +The key `usersRelationship` represents the query param the API exposes to load the list of users: + +```http request +GET: api/companies?related=usersRelationship +``` + +The `UserRepository` represents the repository class that serializes the users list. + +#### Short definition + +```php +HasMany::make('posts'), +``` + +Usually the key (query param) and the actual Eloquent relationship names are the same, so Restify provides a shorter version of defining the relationship. + +In this case the name of the query param will be the same as the relationship name - `posts`. The name of the repository `PostRepository` will be resolved based on the same key and $uriKey of the repository. + +The request will look like this: + +```http request +GET: api/companies?related=posts +``` + +#### Callables + +```php +'extraData' => fn() => ['location' => 'Romania'], + +'extraMeta' => new Invokable() +``` +Restify allows you to resolve specific data using callable functions or invokable (classes with a single public __invoke method). You can return any kind of data from these callables. It'll be serialized accordingly. The query param in this case should match the key: + +```http request +GET: api/companies?related=extraData,extraMeta +``` + +#### Forwarding + +```php +'country', +``` + +If you simply define a key in the `related`, Restify will forward your request to the associated model. Your model could return anything, as it might be an Eloquent relationship or any primary data. + + +Let's take a look over all the relationships that Restify provides: + +### Frontend request + +In order to get the related resources, you need to send a `GET` request to: + +```http request +GET `/api/restify/users?include=posts` +``` + +Sometimes, you might want to load specific columns from the database into the response. For example, if you have a `Post` model with an `id`, `title`, and a `description` column, you might want to load only the `title` and the `description` column in the response. + +In order to do this, you can use the following request: + +```http request +GET /users/1?include=posts[title|description] +``` + +### Nested relationships + +Let's assume you have the `CompanyRepository`: + +```php +// CompanyRepository +public static function related(): array +{ + return [ + HasMany::make('users'), + ]; +} +``` + +In the UserRepository you have a relationship to a list of user posts and roles: + +```php +// UserRepository +public static function related(): array +{ + return [ + HasMany::make('posts'), + MorphToMany::make('roles'), + ]; +} +``` + +In `PostRepository` you might have a list of comments for each post: + +```php +// PostRepository +public static function related(): array +{ + return [ + HasMany::make('comments'), + ]; +} +``` + +In order to get the company's users with their posts and roles, you can follow the [laravel syntax for eager loading](https://laravel.com/docs/master/eloquent-relationships#nested-eager-loading) into the request query: + +```http request +GET: /api/restify/companies?include=users.posts,users.roles +``` + +This request will return a list like this: + +```json +{ + "data": { + "id": "91c2bdd0-bf6f-4717-b1c4-a6131843ba56", + "type": "companies", + "attributes": { + "name": "Binar Code" + }, + "relationships": { + "users": [{ + "id": "3", + "type": "users", + "attributes": { + "name": "Eduard" + }, + "relationships": { + "posts": [{ + "id": "1", + "type": "posts", + "attributes": { + "title": "Post title" + } + }], + "roles": [{ + "id": "1", + "type": "roles", + "attributes": { + "name": "admin" + } + }] + } + }] + } + } +} +``` + +You can also specify and load the `comments` of the `posts`: + +```http request +GET: /api/restify/companies?include=users.posts.comments,users.roles +``` + +Or specify the exact columns that you want to load for each nested layer: + +```http request +GET: /api/restify/companies?include=users[name].posts[id|title].comments[comment],users.roles[name] +``` + + +Getting specific columns will make your requests more performant. + + + +### Meta information + +Starting with Restify 7+, meta information for related (in index requests) will not be displayed. For more details read the [repository meta](/api/repositories#index-item-meta). + +## BelongsTo & MorphOne + +The `BelongsTo` and `MorphOne` eager fields work in a similar way, so let's take the `BelongsTo` as an example. + +Let's assume each `Post` [belongsTo](https://laravel.com/docs/eloquent-relationships#one-to-many-inverse) a `User`. To return the post's owner, we will define it like this: + +```php +// PostRepository +public static function related(): array +{ + return [ + 'owner' => \Binaryk\LaravelRestify\Fields\BelongsTo::make('user', UserRepository::class), + ]; +} +``` + +The model should define the relationship `user`: + +```php +// Post.php + +public function user() +{ + return $this->belongsTo(User::class); +} +``` + +Now the frontend can list a post or posts including the following relationship: + +```http request +GET: api/restify/posts/1?include=owner +``` + +```json +{ + "data": { + "id": "91c2bdd0-bf6f-4717-b1c4-a6131843ba56", + "type": "posts", + "attributes": { + "title": "Culpa qui accusamus eaque sint.", + "description": "Id illo et quidem nobis reiciendis molestiae." + }, + "relationships": { + "owner": { + "id": "3", + "type": "users", + "attributes": { + "name": "Laborum vel esse dolorem amet consequatur.", + "email": "jacobi.ferne@gmail.com" + }, + "meta": { + "authorizedToShow": true, + "authorizedToStore": true, + "authorizedToUpdate": false, + "authorizedToDelete": false + } + } + }, + "meta": { + "authorizedToShow": true, + "authorizedToStore": true, + "authorizedToUpdate": true, + "authorizedToDelete": true + } + } +} +``` + +### Searchable belongs to + +The `BelongsTo` field allows you to use the search endpoint to [search over a column](/search/basic-filters#repository-search) from the `belongsTo` relationship by simply using the `searchables` call: + +```php +BelongsTo::make('user')->searchable('name', 'email') +``` + +The `searchable` method accepts multiple database attributes from the related entity (`users` in our case). + +Therefore, if we get the following search request, it'll also search into the related user's name and email: + +```http request +GET: api/restify/companies?related=user&search="John" +``` + +You can check if a relation is searchable using: + +```php +$field = BelongsTo::make('user')->searchable('name'); +$isSearchable = $field->isSearchable(); // true +$attributes = $field->getSearchables(); // ['name'] +``` + +#### Custom Search Callbacks + +For advanced search scenarios, you can provide a custom callback to completely control the search behavior: + +```php +BelongsTo::make('user')->searchable(function ($query, $request, $value, $field, $repository) { + return $query->whereHas('user', function ($q) use ($value) { + $q->where('name', 'ilike', "%{$value}%") + ->orWhere('email', 'ilike', "%{$value}%") + ->orWhere('phone', 'like', "%{$value}%"); + }); +}) +``` + +The callback receives the following parameters: +- `$query` - The main query builder instance +- `$request` - The current RestifyRequest instance +- `$value` - The search value from the request +- `$field` - The BelongsTo field instance +- `$repository` - The current repository instance + +This approach provides maximum flexibility for complex search requirements while maintaining the same API interface. + +## HasOne + +The `HasOne` field corresponds to a `hasOne` Eloquent relationship. + +For example, let's assume a `User` model `hasOne` `Phone` model. We may add the relationship to our `UserRepository` like so: + +```php +// UserRepository +public static function related(): array +{ + return [ + \Binaryk\LaravelRestify\Fields\HasOne::make('phone', PhoneRepository::class), + ]; +} +``` + +### Sortable HasOne Relations + +`HasOne` relations can be made sortable: + +```php +HasOne::make('phone')->sortable('number') +``` + +This allows sorting by the related model's attributes: + +```http request +GET: api/restify/users?sort=phone.number +``` + +The json response structure will be the same as previously: + +```json +{ + "data": { + "id": "1", + "type": "users", + "attributes": { + "name": "Et maxime voluptatem cumque accusamus sit." + }, + "relationships": { + "phone": { + "id": "2", + "type": "phones", + "attributes": { + "phone": "+40 766 444 22" + }, + "meta": { + "authorizedToShow": false, + "authorizedToStore": true, + "authorizedToUpdate": false, + "authorizedToDelete": false + } + }, + ... +``` + +## HasMany & MorphMany + +The `HasMany` and `MorphMany` fields correspond to a `hasMany` and `morphMany` Eloquent relationship. For example, let's assume a User +model `hasMany` `Post` models. We may add the relationship to our `UserRepository` as shown: + +```php +// UserRepository +public static function related(): array +{ + return [ + \Binaryk\LaravelRestify\Fields\HasMany::make('posts', PostRepository::class), + ]; +} +``` + +In addition, you will get back the `posts` relationship: + +```json +{ + "data": { + "id": "1", + "type": "users", + "attributes": { + "name": "Et maxime voluptatem cumque accusamus sit." + }, + "relationships": { + "posts": [ + { + "id": "91c2bdd0-ccf6-49ec-9ae9-8bae1d39c100", + "type": "posts", + "attributes": { + "title": "Rem suscipit tempora ullam accusantium in rerum.", + "description": "Vero nostrum quasi velit molestiae animi neque." + }, + "meta": { + "authorizedToShow": true, + "authorizedToStore": true, + "authorizedToUpdate": true, + "authorizedToDelete": true + } + } + ] + }, + "meta": { + "authorizedToShow": true, + "authorizedToStore": true, + "authorizedToUpdate": false, + "authorizedToDelete": false + } + } +} +``` + +### Paginate + +`HasMany` field returns 15 entries in the `relationships`. This could be customizable from the repository (the +repository being in this case the class of the related resource) class by using: + +```php +public static int $defaultRelatablePerPage = 100; +``` + + +### Relatable per page + +You can also use the query `?relatablePerPage=100`. + +```http request +GET: api/restify/users?related=posts&relatablePerPage=100 +``` + + + +When using `relatablePerPage` query param, it will paginate all the relatable entities with that size. + + + +## BelongsToMany & MorphToMany + +The `BelongsToMany` and `MorphToMany` field corresponds to a `belongsToMany` or `morphToMany` Eloquent relationship. For example, let's assume a `User` +model `belongsToMany` Role models. We may add the relationship to our UserRepository like this: + +```php +// CompanyRepository +public static function related(): array +{ + return [ + \Binaryk\LaravelRestify\Fields\BelongsToMany::make('users', UserRepository::class), + ]; +} +``` + +### Pivot fields + +If your `belongsToMany` relationship interacts with additional "pivot" attributes that are stored on the intermediate +table of the `many-to-many` relationship, you may also attach those to your `BelongsToMany` Restify Field. Once these +fields are attached to the relationship field and the relationship has been defined on both sides, they will be +displayed on the request. + +For example, let's assume our `User` model `belongsToMany` Role models. On our `user_role` intermediate table, let's +imagine we have a `policy` field that contains a simple text about the relationship. We can attach this pivot field +to the `BelongsToMany` field by using the fields method: + +```php +BelongsToMany::make('users', RoleRepository::class)->withPivot( + field('is_admin') +), +``` + +You might also need to define this in the `User` model: + +```php +public function users() +{ + return $this->belongsToMany(User::class, 'user_company')->withPivot('is_admin'); +} +``` + +Now, let's try to get the list of companies with users: + +```http request +GET: /api/restify/company/1?include=users +``` + +```json +{ + "data": { + "id": "1", + "type": "companies", + "attributes": { + "name": "ut" + }, + "relationships": { + "users": [ + { + "id": "1", + "type": "users", + "attributes": { + "name": "Linnea Rowe Sr.", + "email": "tledner@example.com", + }, + "meta": { + "authorizedToShow": true, + "authorizedToStore": true, + "authorizedToUpdate": true, + "authorizedToDelete": true + }, + "pivots": { + "is_admin": true + } + } + ] + }, + "meta": { + "authorizedToShow": true, + "authorizedToStore": true, + "authorizedToUpdate": true, + "authorizedToDelete": true + } + } +} +``` + +### Attach related + +Once you have defined the `BelongsToMany` field, you can now attach User to a Company just like this: + +```http request +POST: api/restify/companies/1/attach/users +``` + +Payload: + +```json +{ + "users": [1, 2], + "is_admin": true +} +``` + +### Authorize attach + +You have a few options to authorize the `attach` endpoint. + +First, you can define the policy method `attachUsers`. The name should start with `attach` and suffix with the `CamelCase` name of the model's relationship name: + +```php +// CompanyPolicy.php + +public function attachUsers(User $authenticatedUser, Company $company, User $userToBeAttached): bool +{ + return $authenticatedUser->isAdmin(); +} +``` + +The policy `attachUsers` method will be called for each individual `userToBeAttached`. However, if you attach - [1, 3] ids, this method will be called twice. + +Another way to authorize this is by using the `canAttach` method to the Eager field directly. This method accepts an invokable class instance or a closure: + +```php +'users' => BelongsToMany::make('users', UserRepository::class) + ->canAttach(function ($request, $pivot) { + return $request->user()->isAdmin(); + }), +``` + +### Override attach + +You are free to intercept the attach operation entirely and override it by using a closure or an invokable: + +```php +'users' => BelongsToMany::make('users', UserRepository::class) + ->attachCallback(function ($request, $repository, $company) { + $company->users()->attach($request->input('users')); + }), +``` + +Or using an invokable : + +```php +'users' => BelongsToMany::make('users', UserRepository::class) + ->attachCallback(new AttachCompanyUsers), +``` + +and then define the class: + +```php +use Illuminate\Http\Request; + +class AttachCompanyUsers +{ + public function __invoke(Request $request, CompanyRepository $repository, Company $company): void + { + $company->users()->attach($request->input('users')); + } +} +``` + + +### Sync related + +You can also `sync` your `BelongsToMany` field. Say you have to sync permissions to a role. You can do it like this: + +```http request +POST: api/restify/roles/1/sync/permissions +``` + +Payload: + +```json +{ + "permissions": [1, 2] +} +``` + +Under the hood this will call the `sync` method on the `BelongsToMany` relationship: + +```php +// $role of the id 1 + +$role->permissions()->sync($request->input('permissions')); +``` + +### Authorize sync + +You can define a policy method `syncPermissions`. The name should start with `sync` and suffix with the plural `CamelCase` name of the model's relationship name: + +```php +// RolePolicy.php + +public function syncPermissions(User $authenticatedUser, Company $company, Collection $keys): bool +{ + // $keys are the primary keys of the related model (permissions in our case) Restify is trying to `sync` +} +``` + +### Detach related + +As soon we declared the `BelongsToMany` relationship, Restify automatically registers the `detach` endpoint: + +```http request +POST: api/restify/companies/1/detach/users +``` + +Using the payload: + +```json +{ + "users": [1] +} +``` + +### Authorize detach + +You have a few options to authorize the `detach` endpoint. + +Primarily, you can define the policy method `detachUsers`, as the name should start with `detach` and suffix with the `CamelCase` name of the model relationship name: + +```php +// CompanyPolicy.php + +public function detachUsers(User $authenticatedUser, Company $company, User $userToBeDetached): bool +{ + return $authenticatedUser->isAdmin(); +} +``` + +The policy `detachUsers` method will be called for each individual `userToBeDetached`. If you detach - [1, 3] ids, this method will be called twice. + +Another way to authorize this is by using the `canDetach` method to the Eager field directly. This method accepts an `invokable` class instance or a `closure`: + +```php +'users' => BelongsToMany::make('users', UserRepository::class) + ->canDetach( + fn($request, $pivot) => $request->user()->can('detach', $pivot) + ), +``` + +### Override detach + +You are free to intercept the detach method entirely and override it by using a closure or an invokable: + +```php +'users' => BelongsToMany::make('users', UserRepository::class) + ->detachCallback(function ($request, $repository, $company) { + $company->users()->detach($request->input('users')); + }), +``` + +Or using an invokable : + +```php +'users' => BelongsToMany::make('users', UserRepository::class) + ->detachCallback(new DetachCompanyUsers), +``` + +and then define the class: + +```php +use Illuminate\Http\Request; + +class DetachCompanyUsers +{ + public function __invoke(Request $request, CompanyRepository $repository, Company $company): void + { + $company->users()->detach($request->input('users')); + } +} + +## Validation for Attach Operations + +You can add custom validation for attach operations: + +```php +BelongsToMany::make('users', UserRepository::class) + ->validationCallback(function ($request, $pivot) { + return [ + 'users.*' => 'exists:users,id', + 'is_admin' => 'boolean' + ]; + }) + ->unique() // Prevents duplicate attachments +``` + +The `validationCallback` receives the request and pivot data, and should return validation rules. The `unique()` method prevents duplicate attachments automatically. + +## Column Selection in Relations + +You can specify which columns to load for relations using Laravel's column selection syntax: + +### Basic Column Selection + +```http request +GET: /api/restify/users?include=posts[id,title,created_at] +``` + +### Nested Column Selection + +```http request +GET: /api/restify/companies?include=users[id,name].posts[title].comments[comment] +``` + +### Mixed Column Selection + +```php +// In your repository +HasMany::make('posts')->columns(['id', 'title', 'published_at']) +``` + +## Advanced Sorting + +### Sorting by Related Fields + +Both `BelongsTo` and `HasOne` relations support sorting: + +```php +// BelongsTo sorting +BelongsTo::make('user')->sortable('name') + +// HasOne sorting +HasOne::make('profile')->sortable('bio') +``` + +### JSON Attribute Sorting + +Relations can sort by JSON attributes: + +```php +BelongsTo::make('user')->sortable('preferences->theme') +``` + +### Custom Sort Logic + +You can define custom sorting logic: + +```php +use Binaryk\\LaravelRestify\\Filters\\SortableFilter; + +SortableFilter::make() + ->usingClosure(function ($query, $direction) { + return $query->orderBy('custom_logic', $direction); + }) +``` + +## Morph Relations + +Laravel Restify supports all morph relationship types: + +### MorphOne + +```php +// CommentRepository +public static function related(): array +{ + return [ + MorphOne::make('commentable', PostRepository::class), + ]; +} +``` + +### MorphMany + +```php +// PostRepository +public static function related(): array +{ + return [ + MorphMany::make('comments', CommentRepository::class), + ]; +} +``` + +### MorphToMany + +```php +// PostRepository +public static function related(): array +{ + return [ + MorphToMany::make('tags', TagRepository::class)->withPivot('created_at'), + ]; +} +``` + +## Relationship Authorization + +### Repository-Level Authorization + +Relations inherit authorization from their target repositories. You can customize this: + +```php +HasMany::make('posts')->canEnableRelationship(function ($request) { + return $request->user()->can('view-posts'); +}) +``` + +### Policy-Based Authorization + +Define policy methods for relation operations: + +```php +// In your Policy class +public function viewPosts(User $user, Company $company): bool +{ + return $user->can('view', $company); +} + +public function attachUsers(User $user, Company $company, User $userToAttach): bool +{ + return $user->isAdmin(); +} + +public function detachUsers(User $user, Company $company, User $userToDetach): bool +{ + return $user->isAdmin(); +} + +public function syncPermissions(User $user, Role $role, Collection $permissionIds): bool +{ + return $user->can('manage-permissions'); +} +``` + +## Performance Optimizations + +### Eager Loading Prevention + +Relations automatically prevent circular references and deep nesting to avoid performance issues. + +### Pagination Control + +Control relation pagination globally: + +```php +// In your Repository +public static int $defaultRelatablePerPage = 50; +``` + +Or per request: + +```http request +GET: /api/restify/users?include=posts&relatablePerPage=25 +``` + +### Selective Column Loading + +Always specify only needed columns: + +```http request +GET: /api/restify/users?include=posts[id,title]&fields[users]=id,name +``` + +## Debugging Relations + +### Relation State + +Check relation loading state: + +```php +$related = Related::make('posts', $field); +$isEager = $related->isEager(); // boolean +$relation = $related->getRelation(); // string +``` + +### Query Analysis + +Relations support query state tracking: + +```php +$relatedQuery = RelatedQuery::fromToken('posts[id,title]'); +$columns = $relatedQuery->columns(); // ['id', 'title'] +$isSerialized = $relatedQuery->isSerialized(); // boolean +``` diff --git a/docs-v3/content/api/repositories-advanced.md b/docs-v3/content/api/repositories-advanced.md new file mode 100644 index 000000000..cfee4c1e3 --- /dev/null +++ b/docs-v3/content/api/repositories-advanced.md @@ -0,0 +1,534 @@ +--- +title: Repositories advanced +menuTitle: Advanced +category: API +position: 7 +--- + +## Query Builder + +To perform any request to the database, Restify has to create a query builder instance. The query builder is passed through a few static methods from the repository, so you can override them and intercept the builder to add your custom statements. + +### Main query + +The `mainQuery` method is called for ALL repository operations and serves as the base query that other query methods build upon. This is the foundational query method that's applied to `show`, `index`, `global search`, and all other requests: + +```php +// PostRepository + +use Binaryk\LaravelRestify\Http\Requests\RestifyRequest; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Relations\Relation; + +public static function mainQuery(RestifyRequest $request, Builder | Relation $query) +{ + return $query->where('company_id', $request->user()->company_id); +} +``` + +This method is ideal for: +- **Global scoping** (e.g., multi-tenancy isolation) +- **Common filtering logic** that applies to all operations +- **Security constraints** that should never be bypassed +- **Global eager loading** for frequently used relationships + +### Index query + +The `indexQuery` method is specifically called for listing operations (`GET /api/restify/posts`) and global search requests. It builds on top of the `mainQuery`: + +```php +// PostRepository + +use Binaryk\LaravelRestify\Http\Requests\RestifyRequest; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Relations\Relation; + +public static function indexQuery(RestifyRequest $request, Builder | Relation $query) +{ + return $query->where('status', 'published') + ->with('author:id,name') + ->orderBy('published_at', 'desc'); +} +``` + +This method is perfect for: +- **Index-specific filtering** (e.g., only show published items) +- **Default sorting** for listings +- **Performance optimizations** for list views +- **Lightweight eager loading** for index displays + +### Show query + +The `showQuery` method is applied specifically for individual resource requests (`GET /api/restify/posts/1`). It allows you to customize queries when fetching a single resource: + +```php +// PostRepository + +use Binaryk\LaravelRestify\Http\Requests\RestifyRequest; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Relations\Relation; + +public static function showQuery(RestifyRequest $request, Builder | Relation $query) +{ + return $query->with(['author', 'categories', 'tags', 'comments.user']); +} +``` + +This method is useful for: +- **Detailed eager loading** for full resource display +- **Show-specific constraints** or permissions +- **Performance optimizations** for single resource fetching + +### Scout query + +When using Laravel Scout for full-text search, you can customize the Scout query builder: + +```php +// PostRepository + +public static function scoutQuery(RestifyRequest $request, $scoutBuilder) +{ + return $scoutBuilder->where('status', 'published') + ->where('tenant_id', $request->user()->tenant_id); +} +``` + +### Query Method Hierarchy + +The query methods are applied in this specific order: + +1. **Base Query**: `query()` - Creates the initial query builder from the model +2. **Main Query**: `mainQuery()` - Applied to ALL operations for global constraints +3. **Specific Query**: `indexQuery()` or `showQuery()` - Applied based on the operation type +4. **Search/Filters**: Applied by Restify's search service based on request parameters +5. **Scout Query**: `scoutQuery()` - Only applied when using Laravel Scout search + +### Complete Example: Multi-tenant Blog Repository + +```php +class PostRepository extends Repository +{ + // Step 2: Applied to ALL operations - ensures tenant isolation + public static function mainQuery(RestifyRequest $request, $query) + { + return $query->where('tenant_id', $request->user()->tenant_id) + ->whereNull('deleted_at'); // Global soft delete check + } + + // Step 3a: Only for listing - show published posts with minimal data + public static function indexQuery(RestifyRequest $request, $query) + { + return $query->where('status', 'published') + ->with('author:id,name,avatar') + ->orderBy('published_at', 'desc'); + } + + // Step 3b: Only for individual posts - load complete relationships + public static function showQuery(RestifyRequest $request, $query) + { + return $query->with([ + 'author', + 'categories', + 'tags', + 'comments' => function ($query) { + $query->where('approved', true)->with('user:id,name'); + } + ]); + } + + // Step 5: Scout search within tenant boundaries + public static function scoutQuery(RestifyRequest $request, $scoutBuilder) + { + return $scoutBuilder->where('tenant_id', $request->user()->tenant_id) + ->where('status', 'published'); + } +} +``` + +## Repository prefix + +The default prefix of all Restify routes (except `login` and `register`) lives under the `restify->base` config: + +```php +// config/restify.php +... +'base' => '/api/restify', +... +``` + +Thus, Restify generates the URI for the repository in the following way: + +```php +config('restify.base') . '/' . UserRepository::uriKey() . '/' +``` + +For example, let's assume we have the `restify.base` equal with: `api/restify`. The default URI generated for the +UserRepository is: + +```http request +GET: /api/restify/users +``` + +However, you can prefix the repository with your own: + +```php +// UserRepository +public static $prefix = 'api/v1'; +``` + +Now, the generated URI will look like this: + +```http request +GET: /api/v1/users +``` + + + +For the rest of the repositories the prefix will stay as it is, the default one. Keep in mind that this custom prefix +will be used for all the endpoints related to the user repository. + + + +## Repository middleware + +Each repository has the middlewares from the config `restify.middleware` out of the box for the CRUD methods. However, +you're free to add your own middlewares for a specific repository. + +```php + // PostRepository.php + + public static $middleware = [ + NeedsCompanyMiddleware::class, + ]; + +``` + +This `NeedsCompanyMiddleware` is a custom middleware, and it will be applied over all CRUD routes for this repository. + +If you need the current request, you can override the `collectMiddlewares` method and use the current request: + +```php +public static function collectMiddlewares(RestifyRequest $request): ?Collection +{ + if ($request->isShowRequest()) + { + return collect([ + NeedsCompanyMiddleware::class, + ]); + } + + if ($request->isIndexRequest()) + { + return collect([ + SampleIndexRequest::class, + ]); + } + + return null; +} +``` + +## Repository registration + +Laravel Restify registers all repositories automatically in the App namespace. However, you can register your own repositories from any service provider using the InteractsWithRestifyRepositories trait. Here's an example: + +```php +loadRestifyFrom(__DIR__.'/Restify', __NAMESPACE__.'\\Restify\\'); + + // The rest of your package's registration code goes here. + } +} +``` + +If you want to load Restify from your own service provider, you must use the InteractsWithRestifyRepositories trait in the service provider class. The loadRestifyFrom method takes the path to the directory containing the repositories and the namespace under which the repositories will be registered. + +## Dependency injection + +The Laravel [service container](https://laravel.com/docs/7.x/container) is used to resolve all the Laravel Restify +repositories. As a result, you are able to type-hint any dependencies your `Repository` may need in its constructor. The +declared dependencies will automatically be resolved and injected into the repository's instance: + + + +Important: Don't forget to call the parent `constructor`. + + + +```php +use App\Services\PostService; +use App\Restify\Repository; + +class PostRepository extends Repository +{ + private PostService $postService; + + public function __construct(PostService $service) + { + parent::__construct(); + + $this->postService = $service; + } +} +``` + +### Custom CRUD + +Restify injects all `CRUD`'s operations for you. However, sometimes you may want to intercept or override +the entire logic of a specific action. Let's say your `save` method needs to perform additional operations beyond the default action. In +this case you can easily override each action ([defined here](/repositories#actions-handled-by-the-repository)) in the repository: + +### index + +```php + public function index(RestifyRequest $request) + { + // Silence is golden + } +``` + +### show + +```php + public function show(RestifyRequest $request, $repositoryId) + { + // Silence is golden + } +``` + +### store + +```php + public function store(RestifyRequest $request) + { + // Silence is golden + } +``` + +### store bulk + +```php + public function storeBulk(RepositoryStoreBulkRequest $request) + { + // Silence is golden + } +``` + +### update + +```php + public function update(RestifyRequest $request, $repositoryId) + { + // Silence is golden + } +``` + +### update bulk + +```php + // $row is the payload row to be updated + public function updateBulk(RestifyRequest $request, $repositoryId, int $row) + { + // Silence is golden + } +``` + +### destroy + +```php + public function destroy(RestifyRequest $request, $repositoryId) + { + // Silence is golden + } +``` + +## Custom routes + +Laravel Restify has its own "CRUD" routes, although you're able to define your custom routes right from your Repository +class: + +```php +/** + * Defining custom routes + * + * The default prefix of this route is the uriKey (e.g. 'api/restify/posts'), + * + * The default namespace is AppNamespace/Http/Controllers + * + * The default middlewares are the same from config('restify.middleware') + * + * All options could be overrided by passing an $attributes argument and set $wrap to false + * + * @param \Illuminate\Routing\Router $router + * @param $attributes + */ +public static function routes(\Illuminate\Routing\Router $router, $attributes = [], $wrap = true) +{ + $router->get('last-posts', function () { + return static::makeModel()->latest()->first(); + }); + + $router->post('make-primary/{post}', [static::class, 'makePrimary']); +} + +public function makePrimary(Post $post) +{ + // Handle + // ... + return response('Done'); +} +``` + +Let's examine a more practical example. Let's use the Post repository we defined above: + + + +Route wrapping: The `$wrap` argument determines whether your route should be wrapped with the default `middlewares`, +`controllers namespace`, and `prefix` your routes with the repository's base (i.e., `/api/restify/posts/`). + + + +```php +use App\Restify\Repository; + +class PostRepository extends Repository +{ + public static function routes(\Illuminate\Routing\Router $router, $attributes = [], $wrap = true) + { + $router->get('/{id}/kpi', 'PostController@kpi'); // /api/restify/posts/1/kpi + } +} +``` + +At this moment Restify is building the new route as a child of the `posts`, so it has the following route for instance: + +```http request +GET: /api/restify/posts/{id}/kpi +``` + +This route is pointing to the `PostsController@kpi`. Let's define it: + +```php +response(); + } +} +``` + +### Route prefix + +As we saw in the example above, the route is a child of the current repository. However, you might want to +have a separate prefix occasionally, which could be outside the URI of the current repository. Restify provides an easy way to do this by +adding a default value `prefix` for the second `$attributes` argument: + +```php +/** + * @param \Illuminate\Routing\Router $router + * @param $options + */ +public static function routes(Router $router, $attributes = ['prefix' => 'api',], $wrap = true) +{ + $router->get('hello-world', function () { + return 'Hello World'; + }); +} +```` + +Now, the generated route will look like this: + +```http request +GET: '/api/hello-world +``` + +With `api` as a custom prefix. + +### Route middleware + +All routes declared in the `routes` method will have the same middlewares defined in your `restify.middleware` +configuration file. Overriding default middlewares is straightforward with Restify: + +```php +/** + * @param \Illuminate\Routing\Router $router + * @param $attributes + */ +public static function routes(Router $router, $attributes = ['middleware' => [CustomMiddleware::class],], $wrap = true) +{ + $router->get('hello-world', function () { + return 'Hello World'; + }); +} +```` + +In that case, the single middleware of the route will be defined by the `CustomMiddleware` class. + +### Route Namespace + +By default, each route defined in the `routes` method will have the namespace `AppRootNamespace\Http\Controllers`. You +can override it easily by using `namespace` configuration key: + +```php +/** + * @param \Illuminate\Routing\Router $router + * @param $attributes + */ +public static function routes(Router $router, $attributes = ['namespace' => 'App\Services',], $wrap = true) +{ + $router->get('hello-world', 'WorldController@hello'); +} +```` + + + +Non-wrapped routes: When `$wrap` is false, your routes will only have the Route group `$attributes`, which means that no +prefix, middleware, or namespace will be applied automatically, even if you defined them as default arguments in +the `routes` method. You should be careful about this behavior. + + + + +## Repository Lifecycle + +Each repository has several lifecycle methods. The most useful is `booted`, which is called as soon as the repository is loaded with the resource: + +````php +// PostRepository.php +protected static function booted() +{ + // +} +```` + + + + diff --git a/docs-v3/content/api/repositories.md b/docs-v3/content/api/repositories.md new file mode 100644 index 000000000..0880292cc --- /dev/null +++ b/docs-v3/content/api/repositories.md @@ -0,0 +1,1447 @@ +--- +title: Repositories +menuTitle: Repositories +category: API +position: 6 +--- + +The Repository is the core of the Laravel Restify. + +## Quick start + +For convenience, Restify includes a `restify:repository` Artisan command. This command will create a repository +in `app/Restify` directory that is associated with the `App\Models\Post` model: + +```shell script +php artisan restify:repository PostRepository +``` + +The newly created repository will be placed in the `app/Restify/PostRepository.php` file. + +By default, the generation repository command doesn't require any option. However, you can specify `--app` option to +instruct Restify to generate the migrations, policy, and model (in `app/Models`). + +## Defining Repositories + +The basic repository form looks like this using the modern attribute approach: + +```php +namespace App\Restify; + +use App\Models\Post; +use App\Restify\Repository; +use Binaryk\LaravelRestify\Attributes\Model; + +#[Model(Post::class)] +class PostRepository extends Repository +{ + public function fields(RestifyRequest $request): array + { + return []; + } +} +``` + +Or using the traditional static property approach: + +```php +namespace App\Restify; + +use App\Models\Post; +use App\Restify\Repository; + +class PostRepository extends Repository +{ + public static string $model = Post::class; + + public function fields(RestifyRequest $request): array + { + return []; + } +} +``` + + +If you don't specify the model using an attribute or the $model property, Restify will try to guess the model automatically based on the repository class name. + + + +The `fields` method returns the default set of attributes definitions that should be applied during API requests. + +### Model & Repository Discovery Conventions + +Restify will discover recursively all classes from the `app\Restify\*` directory that extend +the `Binaryk\LaravelRestify\Repositories\Repository` class. + +For model resolution, Restify follows this priority order: +1. **`#[Model]` attribute** (highest priority) +2. **`$model` static property** +3. **Auto-guessing** from repository class name (lowest priority) + +When auto-guessing, Restify uses the prefix of the Repository name. For example, `UserPostRepository` class will try to find the `UserPost` model. + +### Actions handled by the Repository + +Having this in place you're basically ready for the CRUD actions over posts. You now have available the following endpoints: + +| Verb | URI | Action | +|:-----------|:------------------------------------------------------|:---------------------------------------------| +| **GET** | `/api/restify/posts` | index | +| **GET** | `/api/restify/posts/actions` | display index actions | +| **GET** | `/api/restify/posts/getters` | display index getters | +| **GET** | `/api/restify/posts/{post}` | show | +| **GET** | `/api/restify/posts/{post}/actions` | display individual actions | +| **GET** | `/api/restify/posts/{post}/getters` | display individual getters | +| **POST** | `/api/restify/posts` | store | +| **POST** | `/api/restify/posts/actions?action=actionName` | perform index actions | +| **GET** | `/api/restify/posts/getters?getter=getterName` | retrieve index getters | +| **POST** | `/api/restify/posts/bulk` | store multiple | +| **DELETE** | `/api/restify/posts/bulk/delete` | delete multiple | +| **POST** | `/api/restify/posts/bulk/update` | update multiple | +| **PATCH** | `/api/restify/posts/{post}` | partial update | +| **PUT** | `/api/restify/posts/{post}` | full update | +| **POST** | `/api/restify/posts/{post}` | partial of full update including attachments | +| **POST** | `/api/restify/posts/{post}/actions?action=actionName` | perform individual actions | +| **GET** | `/api/restify/posts/{post}/getters?getter=getterName` | retrieve individual getter | +| **DELETE** | `/api/restify/posts/{post}` | destroy | + + + +As you can see, we provided 3 Verbs for the model update (PUT, PATCH, POST). The reason for that is +because you just simply cannot send files via `PATCH` or `PUT` verbs, so we have `POST` as a result. The `PUT` or `PATCH` could be used +for full model update, and respectively partial update. + + + +## Model Definition + +As we already noticed, each repository basically works as a wrapper over a specific resource. The fancy +naming `resource` is nothing more than a database entity (posts, users etc.). To make the repository aware of the +entity it should handle, we need to define the model associated with this resource. + +Laravel Restify provides three ways to define the model, with the following priority order: + +### 1. Modern Approach: PHP Attributes (Recommended) + +The most modern and clean approach uses PHP 8+ attributes: + +```php +use Binaryk\LaravelRestify\Attributes\Model; + +#[Model(Post::class)] +class PostRepository extends Repository +{ + // Clean - no static property needed + public function fields(RestifyRequest $request): array + { + return [ + field('title'), + field('content'), + ]; + } +} +``` + +You can also use string class names: + +```php +#[Model('App\Models\Post')] +class PostRepository extends Repository +{ + // Fields... +} +``` + +**Benefits of using attributes:** +- Modern, declarative approach +- Better IDE support and static analysis +- Cleaner code (no need for static properties) +- More discoverable with reflection tools +- Type-safe when using `::class` syntax + +### 2. Traditional Approach: Static Property + +The classic approach using static properties (still fully supported): + +```php +class PostRepository extends Repository +{ + public static string $model = Post::class; + + // Or with string + public static string $model = 'App\\Models\\Post'; +} +``` + +### 3. Auto-Guessing (Fallback) + +If neither attribute nor static property is defined, Restify will automatically guess the model from the repository class name: + +- `UserRepository` → tries `App\Models\User` +- `BlogPostRepository` → tries `App\Models\BlogPost` + + +The attribute approach takes the highest priority, followed by the static property, and finally auto-guessing as a fallback. + + +## Public repository + +Sometimes, you might find yourself facing the risk of exposing public information (allowing unauthenticated users to access it). + + + +We highly recommend avoiding this kind of exposure. If you need to expose custom data, you can use the [serializer](/api/serializer) to return a json:api format from any custom route/controller (still using the power of repositories). + + + +Restify allows you to define a public repository by adding the `$public` property on true: + + +```php +public static bool|array $public = true; +``` + +When adding the `$public` flag, the repository will expose ONLY GET requests publicly. These requests are: + + +| Verb | URI | Action | +|:-----------|:------------------------------------------------------|:---------------------------------------------| +| **GET** | `/api/restify/posts` | index | +| **GET** | `/api/restify/posts/getters` | display index getters | +| **GET** | `/api/restify/posts/{post}` | show | +| **GET** | `/api/restify/posts/{post}/getters` | display individual getters | +| **GET** | `/api/restify/posts/getters?getter=getterName` | retrieve index getters | +| **GET** | `/api/restify/posts/{post}/getters?getter=getterName` | retrieve individual getter | + +In order to get the public functionality you need to take a few extra steps to inform your setup that now it has public access. + +### Public gate + +Make sure you allow your global gate a nullable user: + +```php +// app/Providers/RestifyApplicationServiceProvider.php + +protected function gate(): void +{ + Gate::define('viewRestify', function ($user = null) { + if (is_null($user)) { + return true; + } + + return in_array($user->email, [...]) + }); +} +``` + +### Public Policies + +As we know, each model should be protected by a policy. The policy that corresponds to a public repository should also allow a nullable authenticated user: + +```php +// ie: PostPolicy +public function allowRestify(User $user = null): bool +{ + return true; +} + +public function show(User $user = null, User $model): bool +{ + return true; +} +``` + +Having these configurations in place, you should be good to expose the repository publicly. + +## Repository key + +The repository URI segment is automatically generated by using the repository's name. The php method that does that is: + +```php +public static function uriKey(): string +{ + if (property_exists(static::class, 'uriKey') && is_string(static::$uriKey)) { + return static::$uriKey; + } + + $kebabWithoutRepository = Str::kebab(Str::replaceLast('Repository', '', class_basename(get_called_class()))); + + /** + * e.g. UserRepository => users + * e.g. LaravelEntityRepository => laravel-entities. + */ + return Str::plural($kebabWithoutRepository); +} +``` + +As you can see, you can override this or define your own `public static string $uriKey` to the repository, so you get a custom repository uri segment. For example, if we want to call our users as `members` we will do as in the example below: + +```php +// UserRepository + +public static string $uriKey = 'members'; +``` + +So the request is: + +```http request +GET: api/restify/members +``` + +## Fields + +Fields are the main component of the Repository definition. These fields represent the model's attributes that will be +exposed through the repository's endpoints. A good practice for the API is to expose as minimum fields as you can, so +your API will be as private as possible. + +To some extent, `fields` are similar to the `toArray` method from +the [laravel resource](https://laravel.com/docs/eloquent-resources#concept-overview) concept. + +Let's define some fields for our Post model: + +```php +use Binaryk\LaravelRestify\Fields\Field; +use Binaryk\LaravelRestify\Repositories\Repository; +use Binaryk\LaravelRestify\Http\Requests\RestifyRequest; + +class PostRepository extends Repository +{ + public function fields(RestifyRequest $request) + { + return [ + field('title'), + + field('description'), + ]; + } +} +``` + + + +Field class has many mutations, validators and interactions that you can use. These are documented [here](/api/fields) + + + +## Show request + +Now, your `GET` endpoint will expose the `title` and the `description` of the Post. The json response of +the `api/restify/posts/1` route: + +```json +{ + "data": { + "id": "1", + "type": "posts", + "attributes": { + "title": "Amet ratione est quas quia ut nemo.", + "description": null + }, + "meta": { + "authorizedToShow": true, + "authorizedToStore": true, + "authorizedToUpdate": false, + "authorizedToDelete": false + } + } +} +``` + +Let's explain each piece of the response and see how we can impact or modify it. + +The `id` field by default is the `id` of the response (your table primary key). You can modify this by defining your +own `$id` property into the repository: + +### ID + +```php +// PostRepository.php + +public static string $id = 'uuid'; +``` + +The next piece is the resource type and this is the table name. However, you can always change that by using the `$type` property: + +### Type + +```php +// PostRepository.php + +public static string $type = 'articles'; +``` + +Then, we have the `attributes` that are defined into the `fields` method. + +### Meta +The last piece would be the `meta`, where we have some authorizations over the entity. Authorizations are +computed based on the policy methods. For example, the `authorizedToShow` represents the response of the `show` method +from the related policy (PostPolicy in our example). + +You can customize the `meta` by creating your own `resolveShowMeta` method: + +```php + // PostRepository.php + + public function resolveShowMeta($request) + { + return [ + 'is_published' => $this->model()->isPublished(), + ]; + } +``` + + + +Keep in mind that you always have access to the current model in your not static methods of the repository. In the case above, the ` +$this->model()` represents the `Post` model with the `id=1`, because we're looking for the route: `/api/restify/posts/1`. + + + +As we saw before, there are many ways to partially modify the serialized response for the `show` request, although you +are free to customize the entire response at once by defining: + +```php +// PostRepository.php + +public function serializeForShow(RestifyRequest $request): array +{ + return [ + // + ]; +} +``` + +### Custom show + +You can take full control over the show method: + +```php +public function show(RestifyRequest $request, $repositoryId) +{ + return response($this->model()); +} +``` + +## Index request + +Since we already understood how the `show` method works, let's take a closer look over the endpoint that returns all +your entities and how it actually authorizes and serializes them. + +This is a standard index `api/restify/posts` response: + +```json +{ + "meta": { + "current_page": 1, + "from": 1, + "last_page": 4, + "path": "http://restify-app.test/api/restify/posts", + "per_page": 15, + "to": 15, + "total": 50 + }, + "links": { + "first": "http://restify-app.test/api/restify/posts?page=1", + "last": "http://restify-app.test/api/restify/posts?page=4", + "prev": null, + "next": "http://restify-app.test/api/restify/posts?page=2" + }, + "data": [ + { + "id": "91ad2f77-e30c-4090-a79c-49417540fdaa", + "type": "posts", + "attributes": { + "title": "Nihil assumenda sit pariatur.", + "description": null + }, + "meta": { + "authorizedToShow": true, + "authorizedToStore": true, + "authorizedToUpdate": false, + "authorizedToDelete": false + } + }, + ... + } + ] +} +``` + + + +From Restify 7+, the meta on index requests will not be loaded anymore due to performance reasons. See [index item meta](/api/repositories#index-item-meta) for more details. + + + +### Index main meta + +First, we have the `meta` object. By default this includes pagination information, so your frontend could adapt +accordingly. + +If you want to modify it, you can easily do so in the following repository: + +```php +public function resolveIndexMainMeta(RestifyRequest $request, Collection $items, array $paginationMeta): ?array +{ + return array_merge($paginationMeta, [ + 'published_items_count' => $items->filter->isPublished()->count(), + ]); +} +``` + +In the `resolveIndexMainMeta` you get as arguments - the Restify request, a collection of items (matching the current +request) and the original pagination metadata information. + +In the previous example we appended the property `published_items_count`, which counts published posts. Let's see this meta: + +```json +{ + "meta": { + "current_page": 1, + "from": 1, + "last_page": 4, + "path": "http://restify-app.test/api/restify/posts", + "per_page": 15, + "to": 15, + "total": 50, + "published_items_count": 10 + }, + ... +``` + +You can return `null` if you don't need meta information. + +### Index links + +Next, we get an object called `links`. This one contains navigation links that could be used in the frontend table +component. + +You can customize it as well: + +```php +public function resolveIndexLinks(RestifyRequest $request, Collection $items, array $links): ?array +{ + return $links; +} +``` + +You can return `null` if you don't need `links` information to be displayed at all. + +The next important property is the `data`. Here we have listed items matching the request query, filtered by +the `show` authorization policy. So in terms of seeing a model, you should be authorized by the model policy `show` method to do +so, and if not, it will be filtered out from this response. + +### Index item meta + +In order to optimize requests, Restify 7+ will not provide any meta information about the repositories (including nested relationships) for index requests (ie / `posts`). You can enable them by editing the config `restify.repositories.serialize_index_meta`. + +Or you can specifically enable them per request by adding the query param `withMeta=true`: + +```http request +GET: /api/restify/posts?withMeta=true +``` + +This also applies for any related information. + +The individual item object format is pretty much the same as we have for the [show](#show-request). However, you can +specify a custom metadata for these items by using: + +```php +public function resolveIndexMeta($request) +{ + return [ + //... + ]; +} +``` + +### Custom index + +You're also free to define your own index method from scratch: + +```php +public function index(RestifyRequest $request) +{ + return response(Post::all()); +} +``` + +### Index fields + +By default, attributes used to serialize the index item are the same from the `fields` method. Nonetheless, you can define individual fields for the index: + +```php +public function fieldsForIndex(RestifyRequest $request): array +{ + return [ + field('title'), + ]; +} +``` + + + +Specific fields per request type could be defined for other requests. For example: `fieldsForIndex`, `fieldsForShow`, `fieldsForStore` +and `fieldsForUpdate`. + + + +## Store request + +Store is a `post` request that is usually used to create/store entities. Let's take a closer look at the fields list for the `PostRepository`: + +```php + public function fields(RestifyRequest $request) + { + return [ + field('title'), + + field('description'), + ]; + } +``` + +Well, for the `store` request, Restify will use the same fields and will assign the value from the request matching the +attribute name. + + + +Fillable Restify will fill your model's attributes (defined in the `fields` method) even if they are listed as `$guarded`. + + + +Here is the payload: + +```json +{ + "title": "Beautiful day!", + "description": "Comming soon..." +} +``` + +Then we have the request: + +```http request +POST: http://restify-app.test/api/restify/posts +``` + +Restify will store the new post and will return an `201` (created) status, a `Location` header containing the URL to +the newly created entity: `/api/restify/posts/1`, and a `data` object with the newly created entity: + +```json +{ + "data": { + "id": "91ad557d-5780-4e4b-bedc-c35d400d8594", + "type": "posts", + "attributes": { + "title": "Beautiful day!", + "description": "Comming soon..." + }, + "meta": { + "authorizedToShow": true, + "authorizedToStore": true, + "authorizedToUpdate": false, + "authorizedToDelete": false + } + } +} +``` + +### Store Validation + +In a normal Laravel application, you have a store method into a controller and you have to validate fields by using this request: + +```php +$request->validate([ + 'description' => 'required', +]) +``` + +To do this in Restify, you have to apply the Field's `storingRules`: + +```php +field('description')->storingRules('required'), +``` + +The rules list will be applied for the underlining field. + +### Custom store + +You can always take ownership over the store method by overwriting it in the repository: + +```php +// PostRepository.php + +public function store(RestifyRequest $request) +{ + // +} +``` + + + +The validation and authorization are done according to the `store` method. This method is called only if you have access and the field's validation passes. + + + +## Update request + +Update request is similar with the [store](#store-request). Taking the payload: + +```json +{ + "description": "Ready to be published!" +} +``` + +And the endpoint: + +```http request +PUT: http://restify-app.test/api/restify/posts/1 +``` + + + +As we saw before, we were denied by the policy from updating the operation ( "authorizedToUpdate": +false). Now, we have to update the policy `update` method to return `true`. + + + +The Restify response contains the http 200 status and the following response: + +```json +{ + "data": { + "id": "91ad557d-5780-4e4b-bedc-c35d400d8594", + "type": "posts", + "attributes": { + "title": "Beautiful day!", + "description": "Ready to be published!" + }, + "meta": { + "authorizedToShow": true, + "authorizedToStore": true, + "authorizedToUpdate": true, + "authorizedToDelete": false + } + } +} +``` + +### Update validation + +To validate certain fields, we can use the Field's `updatingRules` method: + +```php +field('description')->updatingRules('required'), +``` + +### Custom update + +You can override the update method entirely: + +```php +public function update(RestifyRequest $request, $repositoryId) +{ + // +} +``` + +Keep in mind that this method is called only when the policy authorization and fields validation pass. + +## Delete request + +This request is a simple one (don't forget to allow the policy): + +```http request +DELETE: http://restify-app.test/api/restify/posts/1 +``` + +If you're allowed to delete the resource, you will get back a `204 No content` response. + +### Custom destroy + +You can override the `destory` method: + +```php +public function destroy(RestifyRequest $request, $repositoryId) +{ + // +} +``` + +### Soft deletion + +Now, Restify uses the `->delete()` eloquent method to delete the model. So if you're using soft deletion, it will softly delete it. + +## Store bulk flow + +The bulk store means that you can create many entries at once. For example, if you have a list of invoice entries, +usually you have to create those in a single Database Transaction. That's why we have this way to create so many entries at +once: + +```http request +POST: /api/restify/posts/bulk +``` + +With the payload: + +```json +[ + { + "title": "Post 1", + "description": "Description post 1" + }, + { + "title": "Post 2", + "description": "Description post 2" + } +] +``` + +### Bulk store field validations + +Similar with `store` and `update` methods, `bulk` rules has their own field rule definition: + +```php +->storeBulkRules('required', function () {}, Rule::in('posts:id')) +``` + +The validation rules will be merged with the rules provided into the `rules()` method. The validation will be performed +by using a native Laravel validator, so you will have exactly the same experience. The validation `messages` could still +be used as usual. + +### Unauthorize to bulk store + +In the `PostPolicy` you can define a method against the bulk store actions: + +```php +/** + * Determine whether the user can create multiple models at once. + * + * @param User $user + * @return mixed + */ +public function storeBulk(User $user) +{ + return true; +} +``` + +### Bulk after store + +After storing an entity, the repository will call the static `storedBulk` method from the repository, which you can +override: + +```php +public static function storedBulk(Collection $repositories, $request) +{ + // +} +``` + +## Update bulk flow + +Like store bulk, update bulk uses a DB transaction to perform the action. This ensures that if any entry fails, none will be updated. + +### Bulk update field validations + +```php +->updateBulkRules('required', Rule::in('posts:id')) +``` + +### Bulk update Payload + +The payload for a bulk update should contain an array of objects and each object should contain an `id` key. Based on this, +the Laravel Restify will find the entity: + +```http request +POST: /api/restify/posts/bulk/update +``` + +Payload: + +```json +[ + { + "id": 1, + "title": "First post" + }, + { + "id": 2, + "title": "Second post" + } +] +``` + +## Bulk delete flow + +The payload for a bulk delete should contain an array of primary keys for the models that you want to delete: + +```json +[ + 1, 10, 15 +] +``` + +These models will be resolved from the database and checked for the `deleteBulk` policy permission. If any of the models are not allowed to be deleted, no entries will be deleted. + +## Force eager loading + +Although Laravel Restify [provides eager](/search/) loading based on the query `related` property, you may want to force +eager load a relationship when using it in fields: + +```php +// UserRepository.php + +public static $withs = ['posts']; +``` + + + +`withs` is not a typo. Laravel uses the `with` property on models, on repositories we use `$withs`, it's not a typo. + + + +## Group by + +The group by filter is useful when you want to group the results by a certain column. + +```php +class PostRepository extends Repository +{ + public static array $groupBy = ['user_id']; +} +``` + + +## Repository Collections and Transforms + +### Index Collection Transform + +You can transform the collection of models before they are serialized for the index response: + +```php +public function indexCollection(RestifyRequest $request, Collection $items): Collection +{ + // Transform the entire collection + return $items->filter(function ($post) { + return $post->published_at <= now(); + }); +} +``` + +This method is called after the query is executed but before authorization and serialization. + +## Repository Labels and Identifiers + +### Custom Repository Label + +You can customize how the repository appears in API documentation and admin interfaces: + +```php +class PostRepository extends Repository +{ + public static string $label = 'Blog Articles'; + + // Or dynamically + public static function label(): string + { + return __('repository.posts'); + } +} +``` + +### Title Field + +Specify which field should be used as the display title for the resource: + +```php +class PostRepository extends Repository +{ + public static string $title = 'title'; // Default is 'id' + + public function title(): string + { + return $this->title ?: $this->id; + } + + public function subtitle(): ?string + { + return "By {$this->author->name}"; + } +} +``` + +## Scout Integration + +### Scout Configuration + +When your model uses Laravel Scout, configure search behavior: + +```php +class PostRepository extends Repository +{ + // Number of results for global search + public static int $globalSearchResults = 5; + + // Number of results for Scout search + public static int $scoutSearchResults = 200; + + // Whether this repository should appear in global search + public static bool $globallySearchable = true; + + public static function usesScout(): bool + { + return true; // Detected automatically + } +} +``` + +## Serialization Control + +### Custom Serialization + +Override serialization methods for complete control: + +```php +public function serializeForIndex(RestifyRequest $request): array +{ + return [ + 'id' => $this->id, + 'title' => $this->title, + 'excerpt' => Str::limit($this->content, 100), + 'meta' => [ + 'word_count' => str_word_count(strip_tags($this->content)) + ] + ]; +} + +public function serializeForShow(RestifyRequest $request): array +{ + $data = parent::serializeForShow($request); + + // Add custom data + $data['computed'] = [ + 'reading_time' => ceil(str_word_count($this->content) / 200), + 'related_posts' => $this->getRelatedPosts(3) + ]; + + return $data; +} +``` + +### RestifyJS Integration + +Configure how the repository appears in RestifyJS: + +```php +public function restifyjsSerialize(RestifyRequest $request): array +{ + return [ + 'uriKey' => static::uriKey(), + 'related' => static::collectRelated(), + 'sort' => static::collectFilters('sortables'), + 'match' => static::collectFilters('matches'), + 'searchables' => static::collectFilters('searchables'), + 'actions' => $this->resolveActions($request)->values(), + 'getters' => $this->resolveGetters($request)->values(), + ]; +} +``` + +## Repository URI and Routing + +### Custom URI Key + +Override the default URI generation: + +```php +class PostRepository extends Repository +{ + public static string $uriKey = 'articles'; // Instead of 'posts' + + // Or dynamically + public static function uriKey(): string + { + return config('app.locale') === 'es' ? 'articulos' : 'articles'; + } +} +``` + +### Custom Routes + +Define custom routes within the repository context: + +```php +public static function routes(Router $router, array $attributes, $wrap = true) +{ + $router->group($attributes, function () use ($router) { + $router->get('trending', TrendingPostsController::class); + $router->post('{post}/publish', [PostController::class, 'publish']); + $router->get('stats', [PostStatsController::class, 'index']); + }); +} +``` + +These routes will be available at: +- `GET /api/restify/posts/trending` +- `POST /api/restify/posts/{post}/publish` +- `GET /api/restify/posts/stats` + +## Middleware and Security + +### Repository Middleware + +Apply middleware to all repository routes: + +```php +class PostRepository extends Repository +{ + public static array $middleware = [ + 'throttle:60,1', + 'verified', + CustomMiddleware::class, + ]; + + public static function collectMiddlewares(RestifyRequest $request): Collection + { + $middleware = collect(static::$middleware); + + // Add conditional middleware + if ($request->user()?->isGuest()) { + $middleware->push('guest'); + } + + return $middleware; + } +} +``` + +## MCP Integration + +Laravel Restify provides first-class support for Model Context Protocol (MCP), allowing AI agents to efficiently interact with your APIs. You can define MCP-specific field methods to optimize token usage and provide tailored data for AI consumption. + +### MCP Field Methods + +MCP field methods follow the same pattern as regular field methods but are prefixed with `fieldsForMcp`: + +```php +class PostRepository extends Repository +{ + // Regular fields for human consumption + public function fields(RestifyRequest $request): array + { + return [ + field('title'), + field('content'), + field('excerpt'), + field('meta_description'), + field('tags'), + field('author_id'), + field('published_at'), + field('created_at'), + field('updated_at'), + ]; + } + + // Optimized fields for AI index requests (saves 60-70% tokens) + public function fieldsForMcpIndex(RestifyRequest $request): array + { + return [ + field('id'), + field('title'), + field('excerpt'), + field('published_at'), + ]; + } + + // Focused fields for AI detail views (saves 40-50% tokens) + public function fieldsForMcpShow(RestifyRequest $request): array + { + return [ + field('title'), + field('content'), + field('author', fn() => $this->author->name), + field('tags'), + field('published_at'), + ]; + } + + // Fields AI agents can use for creation + public function fieldsForMcpStore(RestifyRequest $request): array + { + return [ + field('title')->required(), + field('content')->required(), + field('excerpt'), + field('tags'), + ]; + } + + // Fields AI agents can modify + public function fieldsForMcpUpdate(RestifyRequest $request): array + { + return [ + field('title'), + field('content'), + field('excerpt'), + field('tags'), + ]; + } +} +``` + +### MCP Bulk Operations + +```php +// Efficient AI bulk creation +public function fieldsForMcpStoreBulk(RestifyRequest $request): array +{ + return [ + field('title')->required(), + field('content')->required(), + field('status')->value('draft'), + ]; +} + +// Efficient AI bulk updates +public function fieldsForMcpUpdateBulk(RestifyRequest $request): array +{ + return [ + field('title'), + field('status'), + field('published_at'), + ]; +} +``` + +### MCP Getters + +Provide analytical and computed fields specifically for AI consumption: + +```php +public function fieldsForMcpGetter(RestifyRequest $request): array +{ + return [ + field('word_count', fn() => str_word_count(strip_tags($this->content))), + field('reading_time', fn() => ceil(str_word_count(strip_tags($this->content)) / 200)), + field('sentiment_score', fn() => $this->calculateSentiment()), + field('related_topics', fn() => $this->extractTopics()), + ]; +} +``` + +### Field Priority for MCP + +When an MCP request is made, Restify follows this priority order: + +1. **MCP-specific methods** (`fieldsForMcpIndex`, `fieldsForMcpShow`, etc.) +2. **Request-specific methods** (`fieldsForIndex`, `fieldsForShow`, etc.) +3. **Default fields method** (`fields`) + +This allows you to provide optimized field sets for AI agents while maintaining full functionality for human users. + +## Repository Lifecycle Events + +Laravel Restify provides several lifecycle hooks that allow you to perform actions at specific points during the repository's operations. + +### Single Resource Events + +```php +class PostRepository extends Repository +{ + // Called after a single resource is successfully stored + public static function stored($model, $request) + { + // Log the creation + Log::info("Post created: {$model->title}"); + + // Send notifications + NotificationService::notifyNewPost($model); + + // Update caches + cache()->forget('recent_posts'); + } + + // Called after a single resource is successfully updated + public static function updated($model, $request) + { + // Log the update + Log::info("Post updated: {$model->title}"); + + // Clear related caches + cache()->forget("post_{$model->id}"); + + // Index for search + $model->searchable(); + } + + // Called after a single resource is successfully deleted + public static function deleted($status, $request) + { + // Log deletion + Log::info("Post deleted, status: {$status}"); + + // Clean up related data + if ($status) { + cache()->flush(); + } + } +} +``` + +### Bulk Operation Events + +```php +class PostRepository extends Repository +{ + // Called after bulk store operation completes + public static function storedBulk(Collection $models, $request) + { + Log::info("Bulk created {$models->count()} posts"); + + // Bulk index for search + $models->searchable(); + + // Send bulk notifications + NotificationService::notifyBulkCreation($models); + } + + // Called after bulk update operation completes + public static function updatedBulk(Collection $models, $request) + { + Log::info("Bulk updated {$models->count()} posts"); + + // Clear caches + cache()->tags(['posts'])->flush(); + } + + // Called after bulk save operation (both store and update bulk) + public static function savedBulk(Collection $models, $request) + { + // Common logic for all bulk save operations + SearchIndexService::updateBatch($models); + } + + // Called after bulk delete operation completes + public static function deletedBulk(Collection $models, $request) + { + Log::info("Bulk deleted {$models->count()} posts"); + } +} +``` + +### Authorization Methods + +Override authorization logic for fine-grained control: + +```php +class PostRepository extends Repository +{ + // Control if user can view the resource + public function allowToShow($request): self + { + if (!$this->model()->isPublished() && !$request->user()->isAdmin()) { + throw new AuthorizationException('Cannot view unpublished post'); + } + + return $this; + } + + // Control if user can create resources + public function allowToStore(RestifyRequest $request, $payload = null): self + { + if ($request->user()->posts()->today()->count() >= 10) { + throw new AuthorizationException('Daily post limit reached'); + } + + return $this; + } + + // Control if user can update this resource + public function allowToUpdate(RestifyRequest $request, $payload = null): self + { + if ($this->model()->isPublished() && !$request->user()->isEditor()) { + throw new AuthorizationException('Cannot edit published posts'); + } + + return $this; + } + + // Control if user can delete this resource + public function allowToDestroy(RestifyRequest $request): self + { + if ($this->model()->comments()->exists()) { + throw new AuthorizationException('Cannot delete post with comments'); + } + + return $this; + } + + // Control bulk operations + public function allowToBulkStore(RestifyRequest $request, $payload = null, $row = null): self + { + if (count($payload) > 100) { + throw new AuthorizationException('Cannot create more than 100 posts at once'); + } + + return $this; + } + + public function allowToUpdateBulk(RestifyRequest $request, $payload = null): self + { + // Custom bulk update authorization + return $this; + } + + public function allowToDestroyBulk(RestifyRequest $request, $payload = null): self + { + // Custom bulk delete authorization + return $this; + } +} +``` + +### Relationship Authorization + +```php +class PostRepository extends Repository +{ + public function allowToAttach(RestifyRequest $request, Collection $attachers): self + { + // Validate attaching related models + $methodGuesser = 'attach'.Str::studly($request->relatedRepository); + + $attachers->each(function ($model) use ($request, $methodGuesser) { + $this->authorizeToAttach($request, $methodGuesser, $model); + }); + + return $this; + } + + public function allowToSync(RestifyRequest $request, Collection $attachers): self + { + // Validate syncing relationships + return $this; + } + + public function allowToDetach(RestifyRequest $request, Collection $attachers): self + { + // Validate detaching related models + return $this; + } +} +``` + +### Event Usage Examples + +These lifecycle methods are perfect for: + +- **Logging and Auditing**: Track all changes to your resources +- **Cache Management**: Clear or update caches when data changes +- **Search Indexing**: Update search indexes after modifications +- **Notifications**: Send emails, push notifications, or webhooks +- **Data Validation**: Perform complex business rule validation +- **External API Integration**: Sync changes with third-party services +- **File Cleanup**: Remove associated files when records are deleted diff --git a/docs-v3/content/api/repository-generation.md b/docs-v3/content/api/repository-generation.md new file mode 100644 index 000000000..9b8755348 --- /dev/null +++ b/docs-v3/content/api/repository-generation.md @@ -0,0 +1,427 @@ +--- +title: Repository Generation +menuTitle: Repository Generation +category: API +position: 11 +--- + +# Repository Generation + +Laravel Restify provides powerful repository generation commands for both individual and bulk repository creation, with intelligent path detection and automatic relationship generation. + +## Intelligent Path Detection + +The repository generator now automatically detects your project's repository organization pattern and creates new repositories in the appropriate location. + +### Supported Patterns + +1. **Grouped by Model** - `App/Restify/Users/UserRepository.php` +2. **Domain Driven** - `App/Restify/Domains/User/UserRepository.php` +3. **Module Based** - `App/Restify/Admin/UserRepository.php` +4. **Flat Structure** - `App/Restify/UserRepository.php` (default) + +### How It Works + +When you run: +```bash +php artisan restify:repository PostRepository +``` + +The command will: +1. First check the `app/Restify` directory for existing repositories +2. If none found in `app/Restify`, scan the entire `app/` directory +3. Analyze the location patterns of found repositories +4. Apply the same pattern to the new repository +5. Display the detected pattern and target location + +This prioritization ensures that repositories in the standard `App/Restify` location are preferred over other locations. + +### Example Output + +```bash +$ php artisan restify:repository PostRepository +Detected repository pattern: grouped-by-model +Repository will be created in: App\Restify +Repository created successfully. +``` + +If your project has `UserRepository` in `App/Restify/Users/`, the new `PostRepository` will be created in `App/Restify/Posts/`. + +## Automatic Relationship Detection + +When you run the repository generation command: + +```bash +php artisan restify:repository PostRepository +``` + +The command will: +1. Analyze your database schema for foreign key columns +2. Generate regular fields in the `fields()` method +3. Generate BelongsTo and HasMany relationships in a separate `static include()` method + +## Generated Structure + +For a `posts` table with `user_id` and `category_id` columns, and a `comments` table with `post_id`, the generated repository will look like: + +```php +required(), + field('content')->textarea()->required(), + field('created_at')->datetime()->readonly(), + field('updated_at')->datetime()->readonly(), + ]; + } +} +``` + +## How It Works + +### BelongsTo Detection +- Columns ending with `_id` (except `id` itself) are detected as BelongsTo relationships +- The relationship name is derived from the column name (e.g., `user_id` → `user`) +- The command attempts to find the related repository class automatically + +### HasMany Detection +- The command scans other tables for foreign keys pointing to the current model +- For example, if `comments` table has `post_id`, it generates `HasMany::make('comments')` +- Repository classes are automatically resolved when possible + +### Repository Resolution +The command searches for repository classes in these locations: +- `App\Restify\{Model}Repository` +- `App\Http\Restify\{Model}Repository` + +If a repository isn't found, the relationship is still generated without the repository parameter, allowing Laravel Restify to auto-resolve it. + +## Benefits + +1. **Separation of Concerns**: Fields and relationships are kept in separate methods +2. **Clean Code**: Foreign key fields are not duplicated in the fields array +3. **Automatic Detection**: Reduces manual work when setting up repositories +4. **Follows Best Practices**: Uses the `static include()` method as recommended in Laravel Restify documentation + +## Customization + +You can always modify the generated relationships after creation: + +```php +public static function include(): array +{ + return [ + BelongsTo::make('user', UserRepository::class)->searchable('name'), + BelongsTo::make('category')->nullable(), + HasMany::make('comments')->sortable('created_at'), + + // Add more relationships manually + MorphMany::make('tags'), + BelongsToMany::make('subscribers')->withPivot('subscribed_at'), + ]; +} +``` + +## Override Confirmation + +If a repository already exists at the target location, the command will ask for confirmation before overriding: + +```bash +$ php artisan restify:repository UserRepository +Detected repository pattern: flat +Repository will be created in: App\Restify +Repository already exists at: /path/to/app/Restify/UserRepository.php +Do you want to override it? (yes/no) [no]: +``` + +You can skip this confirmation by using the `--force` option: + +```bash +php artisan restify:repository UserRepository --force +``` + +## Disabling Automatic Generation + +If you prefer to handle relationships manually, use the `--no-fields` option: + +```bash +php artisan restify:repository PostRepository --no-fields +``` + +This will generate a repository with only the `id()` field and no relationships. + +## Bulk Repository Generation + +For new projects or when you need to generate repositories for multiple models at once, Laravel Restify provides a bulk generation command that can analyze all your models and create repositories automatically. + +### Basic Usage + +```bash +php artisan restify:generate:repositories +``` + +This command will: + +1. **Discover all models** in your application automatically +2. **Analyze database schema** to generate appropriate field definitions +3. **Show a detailed preview** of what will be generated +4. **Ask for confirmation** before creating any files +5. **Generate repositories** with proper field mappings + +### Interactive Preview + +Before generating any files, the command shows a comprehensive preview: + +``` +📋 Preview of repositories to be generated: +═══════════════════════════════════════════════════════ + +🔍 Found 3 models: + • User (table: users, 8 fields) + • Post (table: posts, 6 fields) + • Comment (table: comments, 4 fields) + +📂 Repository configuration: + Structure: flat + Base namespace: App\Restify + Force overwrite: No + +📄 Repositories that will be generated: + 1. app/Restify/UserRepository.php + 2. app/Restify/PostRepository.php + 3. app/Restify/CommentRepository.php + +📝 Sample repository preview: + ┌─────────────────────────────────────────────────────┐ + │ class UserRepository extends Repository │ + │ { │ + │ public static string $model = User::class; │ + │ │ + │ public function fields(RestifyRequest $request) │ + │ { │ + │ return [ │ + │ id(), │ + │ field('name'), │ + │ field('email')->email(), │ + │ field('created_at')->datetime()->readonly(), │ + │ # ... 5 more fields │ + │ ]; │ + │ } │ + │ } │ + └─────────────────────────────────────────────────────┘ +``` + +### Command Options + +| Option | Description | Example | +|--------|-------------|---------| +| `--force` | Overwrite existing repositories | `--force` | +| `--skip-preview` | Skip preview and generate immediately | `--skip-preview` | +| `--structure=flat\|domains` | Choose repository structure | `--structure=domains` | +| `--only=Model1,Model2` | Only generate for specific models | `--only=User,Post` | +| `--except=Model1,Model2` | Exclude specific models | `--except=User,Post` | + +### Repository Structures + +The command supports two organizational patterns: + +#### Flat Structure (Default) + +``` +app/Restify/ +├── UserRepository.php +├── PostRepository.php +└── CommentRepository.php +``` + +#### Domains Structure + +``` +app/Restify/Domains/ +├── User/ +│ └── UserRepository.php +├── Post/ +│ └── PostRepository.php +└── Comment/ + └── CommentRepository.php +``` + +Choose the structure interactively or specify with `--structure`: + +```bash +# Interactive structure selection +php artisan restify:generate:repositories + +# Force domains structure +php artisan restify:generate:repositories --structure=domains +``` + +### Field Type Detection + +The command automatically maps database columns to appropriate Restify fields: + +| Database Type | Restify Field | Example | +|---------------|---------------|---------| +| `string`, `varchar` | `field()` | `field('name')` | +| Email columns | `field()->email()` | `field('email')->email()` | +| Password columns | `field()->password()->storable()` | `field('password')->password()->storable()` | +| `text`, `longtext` | `field()->textarea()` | `field('description')->textarea()` | +| `integer`, `bigint` | `field()->number()` | `field('count')->number()` | +| `boolean`, `tinyint` | `field()->boolean()` | `field('is_active')->boolean()` | +| `date` | `field()->date()` | `field('birth_date')->date()` | +| `datetime`, `timestamp` | `field()->datetime()` | `field('created_at')->datetime()` | +| `decimal`, `float` | `field()->number()` | `field('price')->number()` | +| `json` | `field()->json()` | `field('metadata')->json()` | + +### Special Field Handling + +- **Timestamps**: `created_at`, `updated_at`, `deleted_at` → automatically marked as `readonly()` +- **Foreign Keys**: Columns ending with `_id` are excluded (handled as relationships) +- **Email Fields**: Columns containing "email" → mapped to `email()` field +- **Password Fields**: Columns containing "password" → mapped to `password()->storable()` + +### Filtering Models + +#### Generate Only Specific Models + +```bash +php artisan restify:generate:repositories --only=User,Post +``` + +#### Exclude Specific Models + +```bash +php artisan restify:generate:repositories --except=User,Post +``` + +This is useful when you want to exclude certain models like: +- Third-party package models (Spatie permissions, etc.) +- Internal system models +- Models that don't need API endpoints + +### Examples + +#### Quick Setup for New Project + +```bash +# Generate all repositories with preview +php artisan restify:generate:repositories +``` + +#### Production Setup with Domains Structure + +```bash +# Generate with domains structure, skip preview +php artisan restify:generate:repositories \ + --structure=domains \ + --skip-preview \ + --force +``` + +#### Selective Generation + +```bash +# Only generate for core models +php artisan restify:generate:repositories \ + --only=User,Post,Comment,Category \ + --structure=flat +``` + +#### Excluding System Models + +```bash +# Generate all except system models +php artisan restify:generate:repositories \ + --except=PersonalAccessToken,PasswordReset,Permission,Role +``` + +### Generated Repository Structure + +Each generated repository includes: + +```php +email(), + field('email_verified_at')->datetime()->readonly(), + field('created_at')->datetime()->readonly(), + field('updated_at')->datetime()->readonly(), + ]; + } +} +``` + +### Integration with Individual Generation + +The bulk generation command works seamlessly with the individual repository command. You can: + +1. Use bulk generation to create the initial repositories +2. Use individual generation to add new repositories as needed +3. Both commands respect the same path detection and organizational patterns + +### Best Practices + +1. **Review Generated Files**: Always review generated repositories before committing +2. **Add Relationships**: The bulk generator focuses on fields; add relationships manually +3. **Configure Authorization**: Set up policies for the generated repositories +4. **Test Endpoints**: Verify that all generated endpoints work as expected + +### Troubleshooting + +#### No Models Found + +If the command reports "No models found", ensure: +- Models are in the `app/Models` directory (or `app/` for older Laravel versions) +- Models extend `Illuminate\Database\Eloquent\Model` +- Models are not in excluded paths (`Http`, `Console`, `Exceptions`, `Providers`, `Restify`) + +#### Field Detection Issues + +If fields are missing or incorrect: +- Ensure database tables exist and are migrated +- Check that model `$table` property is set correctly +- Verify database connection is working + +#### Permission Errors + +If you encounter permission errors during generation: +- Ensure the `app/Restify` directory is writable +- Check file permissions in your Laravel application \ No newline at end of file diff --git a/docs-v3/content/api/rest-methods.md b/docs-v3/content/api/rest-methods.md new file mode 100644 index 000000000..94b8d005b --- /dev/null +++ b/docs-v3/content/api/rest-methods.md @@ -0,0 +1,433 @@ +--- +title: REST Methods +menuTitle: Controllers +category: API +position: 12 +--- + +## Introduction + +The API response format must stay consistent throughout the application. Ideally, it would be good to follow a standard such as +the [JSON:API](https://jsonapi.org/format/), so your frontend app could align with the API nicely. + +Restify provides several different approaches to respond consistently to the application's incoming request. By default, +Restify's base rest controller class uses a `RestResponse` structure which provides a convenient method to respond to +the HTTP request with a variety of handy magical methods. + +## Restify Response Quickstart + +To learn about Restify's helpful response, let's take a look at a complete example of responding to a request and returning the data +back to the client. + +### Defining The Route + +First, let's assume we have the following routes defined in our `routes/api.php` file: + +```php +Route::post('users', 'UserController@store'); + +Route::get('users/{id}', 'UserController@show'); +``` + +The `GET` route will return back a user for the given `id`. + +### Creating The Controller + +Next, let's take a closer look at a simple `API` controller that handles this route. We'll leave the `show` and `store` methods +empty for now: + +```php +response(User::find($id)); +} +``` + +As you can see, we pass the desired data into the `respond` method. This method will wrap the passed data into a JSON +object and attach it to the `data` response's property. + +### Receiving API Response + +Once the `respond` method wraps up the data, the HTTP request will receive back a response with the following structure: + +```json +{ + "data": { + "id": 1, + "name": "User name", + "email": "kshlerin.hertha@example.com", + "email_verified_at": "2019-12-20 09:48:54", + "created_at": "2019-12-20 09:48:54", + "updated_at": "2020-01-10 12:01:17" + } +} + +``` + +or: + +```json +{ + "errors": [] +} +``` + +## Response factory + +In addition, the parent `RestController` provides a powerful `response` factory method. To understand this, let's return +back to our `store` method from the `UserController`: + +```php +/** + * Store a newly created resource in storage. + * + * @param Request $request + * @return Response + */ +public function store(Request $request) +{ + return $this->response(); +} +``` + +The `response()` method will be an instance of `Binaryk\LaravelRestify\Controllers\RestResponse`. For more information +on working with this object instance, +[check out its documentation](#rest-response-methods). + +```php +$this->response() +->data($user) +->message('This is the first user'); +``` + +The response will look like: + +```json +{ + "data": { + "id": 1, + "name": "User name", + "email": "kshlerin.hertha@example.com", + "email_verified_at": "2019-12-20 09:48:54", + "created_at": "2019-12-20 09:48:54", + "updated_at": "2020-01-10 12:01:17" + }, + "meta": { + "message": "This is the first user" + } +} +``` + +### Displaying Response Errors + +As we saw above, the response always contains an `errors` property. This can be either an empty array or a list with +errors. For example, what if the incoming request parameters can not pass the given validation rules? This can be handled +by the `errors` proxy method: + +```php +/** + * Store a newly created resource in storage. + * + * @param Request $request + * @return Response + */ +public function store(Request $request) +{ + try { + $this->validate($request, [ + 'title' => 'required|unique:users|max:255', + ]); + + // The user is valid + } catch (ValidationException $exception) { + // The user is not valid + return $this->errors($exception->errors()); + } +} +``` + +The returned `API` response will have the `400` HTTP code and the following format: + +```json +{ + "errors": { + "title": [ + "The title field is required." + ] + } +} +``` + +## Custom Header + +Sometimes you may need to respond with a custom header, according to [JSON:API](https://jsonapi.org/format/#crud-creating-responses-201). +After storing an entity, we should respond with a `Location` header that has the value endpoint to the resource: + +```php +return $this->response() + ->header('Location', 'api/users/1') + ->data($user); +``` + +## Optional Attributes + +Therefore, Restify returns the `data` and `errors` attributes in the API's response. It also wraps the message into a `meta` +object. But what if we have to send some custom attributes? In addition to generating the default fields, you can add extra +fields to the response by using the `setMeta` method from the `RestResponse` object: + +```php +return $this->response() + ->data($user) + ->setMeta('related', [ 'William Shakespeare', 'Agatha Christie', 'Leo Tolstoy' ]); +``` + +## Hiding Default Attribute + +Restify has a list of predefined attributes, such as: `'line', 'file', 'stack', 'data', 'errors', 'meta'`. + +Some of these are hidden in production though: `'line', 'file', 'stack'`, since they are only used for tracking exceptions. + +If you would like the API's response to not contain any of these fields (or hide a specific one like `errors`, for example), +this action can be done by setting in the application provider the: + +```php +RestResponse::$RESPONSE_DEFAULT_ATTRIBUTES = ['data', 'meta']; +``` + +## Rest Response Methods + +The `$this->response()` returns an instance of `Binaryk\LaravelRestify\Controllers\RestResponse`. This exposes multiple +magical methods for your consistent API response. + +### Attach data + +As we have already seen, attaching data to the response can be done by using: + +```php +->data($info) +``` + +### Headers setup + +The header could be set by using `header` method, as it accepts only two arguments - the header's name and header's value: + +```php +->header('Location', 'api/users/1') +``` + +### Meta information + +In addition to the `data`, you may want to send some extra attributes to the client. A message would be a good example, or even anything +else for that matter: + +```php +->setMeta('name', 'Eduard Lupacescu') +``` + +```php +->message(__('Silence is golden.')) +``` + +## Response code modifiers + +Oftentimes, we have to send an informative response code. The following methods are used for setting the code's response: + +### Refresh 103 + +```php +->refresh() +```` + +### Success 200 + +```php +->success() +```` + +### Created 201 + +```php +->created() +```` + +### Deleted (No Content) 204 + +```php +->deleted() +```` + +```php +->blank() +```` + +### Invalid 400 + +```php +->invalid() +```` + +### Unauthorized 401 + +```php +->unauthorized() +```` + +### Forbidden 403 + +```php +->forbidden() +```` + +### Missing 404 + +```php +->missing() +```` + +### Throttle 429 + +```php +->throttle() +``` + +### Unavailable 503 + +```php +->unavailable() +```` + +## Debugging + +The following methods could be used to debug some information in the dev mode: + +### Line debugging + +```php +$lineNumber = 201; +$this->line($lineNumber) +``` + +### Debug to file + +This could be used for debugging the file's name + +```php +$this->file($exception->getFile()) +``` + +### Stack traces + +With this you can log the exception stach trace + +```php +$this->stack($exception->getTraceAsString()) +``` + +### Errors methods + +The following methods could be used for adding errors to the response: + +### Adding multiple errors + +Adding a set of errors at once: + +```php +$this->errors([ 'Something went wrong' ]) +``` + +### addError function + +Adding error by error in a response's instance: + +```php +$this->addError('Something went wrong') +``` + +## Custom Paginator + +Every so often you have a customed paginator collection. You want to keep the same response format, just as the `Repository`does. + +You can use this static call: + +```php + $paginator = User::query()->paginate(5); + + $response = Binaryk\LaravelRestify\Controllers\RestResponse::index( + $paginator + ); + +``` + +The `$paginator` argument should be an instance of: `Illuminate\Pagination\AbstractPaginator`. + +The expected response will contain: + +```json +{ + "meta": { + "current_page": 1, + "from": 1, + "last_page": 1, + "path": "http://localhost", + "per_page": 5, + "to": 1, + "total": 1 + }, + "links": { + "first": "http://localhost?page=1", + "last": "http://localhost?page=1", + "prev": null, + "next": null + }, + "data": [] +} + +``` + diff --git a/docs-v3/content/api/serializer.md b/docs-v3/content/api/serializer.md new file mode 100644 index 000000000..3ff60f50e --- /dev/null +++ b/docs-v3/content/api/serializer.md @@ -0,0 +1,108 @@ +--- +title: Serializer +menuTitle: Serializer +category: API +position: 12 +--- + +## Introduction + +The API response format must stay consistent throughout the application. Ideally, it would be good to follow a standard as +the [JSON:API](https://jsonapi.org/format/) so your frontend app could align with the API. + +Restify provides a convenient way to quickly return a response in a consistent format. + + +## rest + +```php +return rest(Company::first()) + ->related('users') + ->sortDesc('id'); +``` + +The `rest` helper accepts a list of models and returns a `\Binaryk\LaravelRestify\Repositories\Serializer` instance, so you can call its fluent API. + +The `Serializer` will look for the repository associated with your models. If there is a repository associated with your Company (ie CompanyRepository), Serializer will use that repository to serialize your models accordingly: + +```json +{ + "data": { + "id": "1", + "type": "companies", + "attributes": { + "name": "BinarCode" + }, + "relationships": { + "users": [ + { + "id": "1", + "type": "users", + "attributes": { + "name": "Eduard", + "email": "eduard.lupacescu@binarcode.com" + }, + "meta": { + "authorizedToShow": true, + "authorizedToStore": true, + "authorizedToUpdate": true, + "authorizedToDelete": true + }, + "pivots": { + "is_admin": true + } + } + ] + }, + "meta": { + "authorizedToShow": true, + "authorizedToStore": true, + "authorizedToUpdate": true, + "authorizedToDelete": true + } + } +} +``` + +In case there isn't a repository associated with your models, the response will simply be a data object with models. + +The `rest` helper accepts a model as well as a list (collection) of models, and it'll serialize the response accordingly: + +```php +rest(Post::all()) + ->related('user') + ->sortDesc('id') + ->perPage(20) +``` + +## data + +```php +data(User::first(), 200) +``` + +This helper simply wraps the provided data into an object with a `data` key: + +```json +{ + "data": { + "id": 1, + "name": "User name", + "email": "kshlerin.hertha@example.com" + } +} +``` + +### ok + +```php +ok('All good!') +``` + +`ok` helper accepts an optional message as argument, so you can return a successful response with a custom message. + +```json +{ + "message": "All good!" +} +``` diff --git a/docs-v3/content/api/validation-methods.md b/docs-v3/content/api/validation-methods.md new file mode 100644 index 000000000..40d57fbcd --- /dev/null +++ b/docs-v3/content/api/validation-methods.md @@ -0,0 +1,319 @@ +--- +title: Validation Methods +menuTitle: Validation Methods +category: API +position: 9 +--- + +# Fluent Validation Methods + +Laravel Restify provides a fluent API for adding validation rules to fields, similar to Laravel Nova. This makes it easy to chain validation methods for cleaner and more readable code. + +## Basic Usage + +Instead of using the traditional `rules()` method with string rules, you can now use fluent validation methods: + +```php +// Traditional approach +field('email')->rules('required', 'email', 'unique:users'); + +// Fluent approach +field('email')->required()->email()->unique('users'); +``` + +## Available Validation Methods + +### Common Validation Methods + +#### Required and Nullable + +```php +field('name')->required(); +field('bio')->nullable(); +``` + +#### Type Validation + +```php +field('email')->email(); +field('age')->integer(); +field('price')->numeric(); +field('is_active')->boolean(); +field('tags')->array(); +field('description')->string(); +field('metadata')->json(); +field('website')->url(); +field('uuid')->uuid(); +field('birthday')->date(); +field('created_at')->datetime(); +``` + +#### Numeric Constraints + +```php +field('age')->integer()->min(18)->max(100); +field('price')->numeric()->between(0, 99999.99); +field('quantity')->integer()->min(0); +field('rating')->numeric()->between(1, 5); +``` + +#### String Constraints + +```php +field('username')->string()->min(3)->max(20); +field('title')->string()->max(255); +field('code')->string()->size(6); // Exactly 6 characters +``` + +#### Password Validation + +```php +field('password')->required()->password()->confirmed(); +field('password')->required()->password(10); // Minimum 10 characters +``` + +#### Unique and Exists Validation + +```php +// Basic unique validation +field('email')->unique('users'); + +// Unique with custom column +field('slug')->unique('posts', 'slug'); + +// Unique with ignore (useful for updates) +field('email')->unique('users', 'email', $userId); + +// Exists validation +field('category_id')->exists('categories', 'id'); +field('user_id')->required()->exists('users'); +``` + +#### Date Validation + +```php +field('start_date')->date()->after('today'); +field('end_date')->date()->afterOrEqual('start_date'); +field('birth_date')->date()->before('today'); +field('expired_at')->datetime()->beforeOrEqual('2024-12-31'); +field('scheduled_at')->datetime()->dateFormat('Y-m-d H:i:s'); +``` + +#### File Validation + +```php +field('document')->isFile()->max(5120); // 5MB +field('avatar')->isImage()->max(2048); // 2MB +``` + +#### Pattern Validation + +```php +field('phone')->regex('/^[0-9]{10}$/'); +field('username')->alphaDash(); // Letters, numbers, dashes, underscores +field('name')->alpha(); // Letters only +field('code')->alphaNum(); // Letters and numbers only +``` + +#### IP Address Validation + +```php +field('ip')->ip(); +field('ipv4')->ipv4(); +field('ipv6')->ipv6(); +``` + +#### Conditional Validation + +```php +// Required if another field has a specific value +field('phone')->requiredIf('contact_method', 'phone'); + +// Required unless another field has a specific value +field('reason')->requiredUnless('status', 'approved'); + +// Required with other fields +field('password_confirmation')->requiredWith('password'); + +// Required with all specified fields +field('state')->requiredWithAll(['country', 'city']); + +// Required without other fields +field('email')->requiredWithout('phone'); +``` + +#### In/Not In Validation + +```php +field('status')->in(['pending', 'approved', 'rejected']); +field('role')->notIn(['admin', 'super-admin']); +``` + +#### Other Useful Methods + +```php +// Field must be accepted (yes, on, 1, or true) +field('terms')->accepted(); + +// Field must be confirmed (field_confirmation must exist) +field('email')->confirmed(); + +// Field must be different from another field +field('new_password')->different('current_password'); + +// Field must be the same as another field +field('password_confirmation')->same('password'); + +// Field must match current user's password +field('current_password')->currentPassword(); + +// Field must be filled if present +field('description')->filled(); + +// Field must be present in request +field('token')->present(); + +// String must start/end with specific values +field('url')->startsWith(['http://', 'https://']); +field('filename')->endsWith(['.jpg', '.png', '.pdf']); + +// Timezone validation +field('timezone')->timezone(); + +// MAC address validation +field('mac')->macAddress(); + +// Multiple of value +field('quantity')->integer()->multipleOf(5); +``` + +## Complex Examples + +### User Registration Form + +```php +public function fields(RestifyRequest $request) +{ + return [ + field('name')->required()->string()->min(2)->max(100), + + field('email')->required()->email()->unique('users'), + + field('username') + ->required() + ->string() + ->min(3) + ->max(20) + ->alphaDash() + ->unique('users'), + + field('password') + ->required() + ->password() + ->confirmed(), + + field('age')->nullable()->integer()->min(13)->max(120), + + field('terms_accepted')->required()->accepted(), + + field('notification_email') + ->requiredIf('receive_notifications', true) + ->email(), + ]; +} +``` + +### Product Form + +```php +public function fields(RestifyRequest $request) +{ + return [ + field('name')->required()->string()->max(255), + + field('slug')->required()->string()->unique('products'), + + field('price')->required()->numeric()->min(0)->max(999999.99), + + field('sale_price')->nullable()->numeric()->between(0, 999999.99), + + field('sku')->required()->string()->size(8)->unique('products'), + + field('status')->required()->in(['draft', 'published', 'archived']), + + field('published_at') + ->nullable() + ->datetime() + ->afterOrEqual('today'), + + field('category_id')->required()->exists('categories', 'id'), + + field('weight')->nullable()->numeric()->min(0), + + field('is_featured')->boolean(), + ]; +} +``` + +### Article Form with Conditional Rules + +```php +public function fields(RestifyRequest $request) +{ + return [ + field('title')->required()->string()->max(200), + + field('content')->required()->string()->min(100), + + field('excerpt') + ->requiredUnless('auto_excerpt', true) + ->string() + ->max(500), + + field('featured_image') + ->requiredIf('is_featured', true) + ->isImage() + ->max(5120), + + field('publish_date') + ->requiredIf('status', 'published') + ->date() + ->afterOrEqual('today'), + + field('tags')->nullable()->array(), + + field('meta_description') + ->nullable() + ->string() + ->between(50, 160), + ]; +} +``` + +## Combining with Traditional Rules + +You can still combine fluent methods with the traditional `rules()` method when needed: + +```php +field('email') + ->required() + ->email() + ->rules('unique:users,email,' . $userId) + ->rules(new CustomEmailRule); +``` + +## Custom Validation Messages + +Validation methods can be combined with custom messages: + +```php +field('email') + ->required() + ->email() + ->unique('users') + ->messages([ + 'required' => 'Email address is required.', + 'email' => 'Please provide a valid email address.', + 'unique' => 'This email is already registered.', + ]); +``` \ No newline at end of file diff --git a/docs-v3/content/auth/authentication.md b/docs-v3/content/auth/authentication.md new file mode 100644 index 000000000..e67cdc3c9 --- /dev/null +++ b/docs-v3/content/auth/authentication.md @@ -0,0 +1,419 @@ +--- +title: Authentication setup +menuTitle: Authentication +category: Auth +position: 1 +--- + +Laravel Restify has the support for a facile authentication with [Laravel Sanctum](https://laravel.com/docs/sanctum#api-token-authentication). + +Now you can finally enjoy the auth setup (`register`, `login`, `forgot`, and `reset password`). + +## Quick start + +tl;dr: + +If you run on Laravel 10 or higher, you can use this command that will do all the setup for you: + +```shell script +php artisan restify:setup-auth +``` + +This command will: + +- **ensures** that `Sanctum` is installed and configured as the authentication provider in the `config/restify.php` file +- **appends** the `Route::restifyAuth();` line to the `routes/api.php` file to add the authentication routes + +## Prerequisites + +Migrate the `users`, `password_resets` table (they already exist into a fresh Laravel app). + + + +Laravel 10 automatically ships with Sanctum, so you don't have to install it. + + + +### Install sanctum + +See the docs [here](https://laravel.com/docs/sanctum#installation). You don't need to add `\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,` in your `'api'` middleware group. + +You only have to run these 3 commands: + +```shell script +composer require laravel/sanctum +php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider" +php artisan migrate +``` + +### Define auth model + +Define your authenticatable class in the config file: + +```php +// config/restify.php + +'auth' => [ + ... + 'user_model' => \App\Models\User::class, +] +``` + +The `User` model should extend the `Illuminate\Foundation\Auth\User` class or implement the `Illuminate\Contracts\Auth\Authenticatable` interface. + + + +Make sure you have the `\Laravel\Sanctum\HasApiTokens` trait to your `User` model. +Laravel 10 will automatically add this trait to your `User` model. + + + + +```php +// User.php + +use Illuminate\Foundation\Auth\User as Authenticatable; +use Laravel\Sanctum\HasApiTokens; + +class User extends Authenticatable +{ + use HasApiTokens; +``` + +## Define routes + +Restify provides you a simple way to add all of your auth routes prepared. Simply add in your `routes/api.php`: + +```php +Route::restifyAuth(); +``` + +And voilà, now you have auth routes ready to be used. + +These are the default routes provided by restify: + +| Verb | URI | Action | +| :------------- |:-----------------------------------------|:---------------| +| **POST** | `/api/register` | register | +| **POST** | `/api/login` | login | +| **POST** | `/api/restify/forgotPassword` | forgotPassword | +| **POST** | `/api/restify/resetPassword` | resetPassword | +| **POST** | `/api/restify/verify/{id}/{emailHash}` | verifyEmail | + + + +The `register` and `login` routes are outside the base `restify` prefix because they don't have to follow the `auth` middleware defined in the `config/restify.php` config file. + + + + +You can also pass an `actions` argument, which is an array of actions you want to register. For example: + +```php +Route::restifyAuth(actions: ['login', 'register']); +``` + +By using the `actions` argument, only the specified routes will be registered. If no `actions` argument is passed, Restify will register all the routes by default. + + +## Sanctum Middleware + +Next, add the `auth:sanctum` middleware after the `api` middleware in your config file to protect all the restify's routes: + +```php +/config/restify.php + 'middleware' => [ + 'api', + 'auth:sanctum', + ... + ], +``` + +## Login + +Let's ensure the authentication is working correctly. Create a user in the `DatabaseSeeder` class: + +```php +// DatabaseSeeder.php +\App\Models\User::factory()->create([ + 'name' => 'Test User', + 'email' => 'test@example.com', + 'password' => \Illuminate\Support\Facades\Hash::make('password'), +]); +``` + +Seed it: + +```shell +php artisan db:seed +``` + +Now you can test the login with Curl or Postman: + +```shell +curl -X POST "http://restify-app.test/api/login" \ + -H "Accept: application/json" \ + -H "Content-Type: application/json" \ + -d '{ + "email": "test@example.com", + "password": "password" + }' +``` + +So you should see the response like this: + +```json +{ + "id": "11", + "type": "users", + "attributes": { + "name": "Test User", + "email": "test@example.com" + }, + "meta": { + "authorizedToShow": true, + "authorizedToStore": false, + "authorizedToUpdate": false, + "authorizedToDelete": false, + "token": "1|f7D1qkALtM9GKDkjREKpwMRKTZg2ZnFqDZTSe53k" + } +} +``` + +### Authorization + +We will discuss the authorization in more details here [Authorization](/auth/authorization). But for now let's see a simple example. + +After a successful login, you will receive an authentication token. You should include this token as a `Bearer` token in the Authorization header for your subsequent API requests using [Postman](https://learning.postman.com/docs/sending-requests/authorization/#bearer-token), axios library, or cURL. + +Here's an axios example for retrieving the user's profile with the generated token: + +```js +import axios from 'axios'; + +const token = '1|f7D1qkALtM9GKDkjREKpwMRKTZg2ZnFqDZTSe53k'; + +axios.get('http://restify-app.test/api/restify/profile', { + headers: { + 'Authorization': `Bearer ${token}`, + 'Accept': 'application/json' + } +}) +.then(response => { + console.log(response.data); +}) +.catch(error => { + console.error(error); +}); +``` + +Here's a cURL example for retrieving the user's profile with the generated token: +```bash +curl -X GET "http://restify-app.test/api/restify/profile" \ + -H "Accept: application/json" \ + -H "Authorization: Bearer 1|f7D1qkALtM9GKDkjREKpwMRKTZg2ZnFqDZTSe53k" +``` + +Replace `http://restify-app.test` with your actual domain and use the authentication token you received after logging in. + +## Register + +Let's see how to register a new user in the application. You can test the registration using Curl or Postman. + +Use the following endpoint for registration: + +`http://restify-app.test/api/register` + +And send this payload: + +```json +{ + "name": "John Doe", + "email": "demo@restify.com", + "password": "secret!", + "password_confirmation": "secret!" +} +``` + +Note: Email and password fields are required. + +Now, you can send a POST request with Curl: + +```shell +curl -X POST "http://restify-app.test/api/register" \ + -H "Accept: application/json" \ + -H "Content-Type: application/json" \ + -d '{ + "name": "John Doe", + "email": "demo@restify.com", + "password": "secret!", + "password_confirmation": "secret!" + }' +``` + +You should see the response like this: + +```json +{ + "id": "12", + "type": "users", + "attributes": { + "name": "John Doe", + "email": "demo@restify.com" + }, + "meta": { + "authorizedToShow": true, + "authorizedToStore": false, + "authorizedToUpdate": false, + "authorizedToDelete": false, + "token": "2|z8D2rkBLtN8GKDkjREKpwMRKTZg2ZnFqDZTSe53k" + } +} +``` + +## Forgot Password + +To initiate the password reset process, use the following endpoint: + +`{{host}}/api/forgotPassword` + +And send this payload: + +```json +{ + "email": "demo@restify.com" +} +``` + +After making a POST request to this endpoint, an email will be sent to the provided email address containing a link to reset the password. The link looks like this: + +`'password_reset_url' => env('FRONTEND_APP_URL').'/password/reset?token={token}&email={email}',` + +This configuration can be found in the `config/restify.php` file. The FRONTEND_APP_URL should be set to the URL of your frontend app, where the user lands when they click the action button in the email. The "token" is a variable that will be used to reset the password later on. + +To view the email content during development, you can change the following configuration in your .env file: + +```dotenv +MAIL_MAILER=log +``` + +This will log the email content to the `laravel.log` file, allowing you to see the password reset email without actually sending it. + +Now, you can send a POST request with Curl: + +```shell +curl -X POST "http://restify-app.test/api/forgotPassword" \ + -H "Accept: application/json" \ + -H "Content-Type: application/json" \ + -d '{ + "email": "demo@restify.com" + }' +``` + +If the email is successfully sent, you'll receive a response similar to the following: + +```json +{ + "message": "Reset password link sent to your email." +} +``` + +Now, the user can follow the link in the email to reset their password. + + +## Reset Password + +After the user has received the password reset email from the Forgot Password process, they can reset their password using the following endpoint: + +`http://restify-app.test/api/resetPassword` + +The payload should include the token and email received from the password reset email: + +```json +{ + "token": "7e474bb9118e736306de27126343644a7cb0ecdaec558fdef30946d15225bc07", + "email": "demo@restify.com", + "password": "new_password", + "password_confirmation": "new_password" +} +``` +Now, you can send a POST request with Curl: + +```shell +curl -X POST "http://restify-app.test/api/resetPassword" \ + -H "Accept: application/json" \ + -H "Content-Type: application/json" \ + -d '{ + "token": "0d20b6cfa48f2bbbb83bf913d5e329207149f74d7b22d59a383d321c7af7fd5e", + "email": "demo@restify.com", + "password": "new_password", + "password_confirmation": "new_password" + }' +``` + +If the password reset is successful, you should receive a response similar to the following: + +```json +{ + "message": "Your password has been successfully reset." +} +``` + +Now the user's password has been successfully reset, and they can log in with their new password. + + +## Customizing Authentication Controllers + +You can publish the authentication controllers from the Restify package to your own application, allowing you to customize their behavior as needed. To publish the controllers, run the following command: + +```shell +php artisan restify:auth +``` + +This command will copy the authentication controllers to the `app/Http/Controllers/Restify` directory in your Laravel project. + +The command accepts an optional `--actions` parameter, which allows you to specify which controllers you want to publish. If no action is passed, the command will publish all controllers and the `ForgotPasswordNotification`. For example, to publish only the `login` and `register` controllers, run: + +```shell +php artisan restify:auth --actions=login,register +``` + +Now, you can make any necessary changes to these controllers to fit your specific requirements. + +### Customizing the Register Route + +In a real-world scenario, you might need to customize only the register route. To do this, you can use the `restify:auth` command with the `--actions` option to publish only the register controller: + + ```shell +php artisan restify:auth --actions=register +``` + +After running the command, the register controller will be published to your application, and you can modify it to fit your requirements. + + + +Important Note: If you want to publish other actions in the future, you'll need to manually update the `routes/api.php` file before running the restify:auth command again. Remove any previously published Restify routes, and keep the `Route::restifyAuth();` line so that the new routes can be correctly published. + + + +For example, if you previously published the register route, your `routes/api.php` file might look like this: + +```php +// ... + +Route::restifyAuth(actions: ["login", "resetPassword", "forgotPassword", "verifyEmail"]); + +// ... +``` + +Before running the `restify:auth` command again, revert the file to its original state: + +```php +// ... + +Route::restifyAuth(); + +// ... +``` + +Now you can run the `restify:auth` command with other actions, and the routes will be published correctly. diff --git a/docs-v3/content/auth/authorization.md b/docs-v3/content/auth/authorization.md new file mode 100644 index 000000000..bd3d2c6d6 --- /dev/null +++ b/docs-v3/content/auth/authorization.md @@ -0,0 +1,467 @@ +--- +title: Authorization +menuTitle: Authorization +category: Auth +position: 1 +--- + +After setting up the Restify configuration and the authentication, the next logical step is to protect your API Repositories against unauthorized users. + +## Request lifecycle + +Before diving into details about authorization, it is important for you to understand what is the actual lifecycle of the request. On that account, you can know what to expect and how to debug your app at any point. + +### Booting + +When you run a request (ie via Postman), it hits the Laravel application. Laravel will load every single Service Provider it has defined into `config/app.php` and [auto discovered ](https://laravel.com/docs/packages#package-discovery) providers as well. + +Restify injects the `RestifyApplicationServiceProvider` in your `config/app.php` and it also has an auto discovered provider called `\Binaryk\LaravelRestify\LaravelRestifyServiceProvider`. + +- The `LaravelRestifyServiceProvider` is booted first. This will basically push the `RestifyInjector` middleware at the end of the middleware stack. + +- Then, the `RestifyApplicationServiceProvider` is booted. This will define the gate, will load repositories and make the auth routes macro. You now have full control over this provider. + +- The `RestifyInjector` will be handled. It will register all the routes. + +- On each request, if the requested route is a Restify route, Laravel will handle other middlewares defined in the `restify.php` -> `middleware`. Here is where you should have the `auth:sanctum` middleware to protect your API against unauthenticated users. + +## Prerequisites + +Before we dive into the details of authorization, we need to make sure that you have a basic understanding of how Laravel's authorization works. If you are not familiar with it, we highly recommend reading the [documentation](https://laravel.com/docs/authorization) before you move forward. + +You may also visit the [Authentication/login](/auth/authentication#authorization) section to learn how to login and use the Bearer token. + + +## View Restify + +Since we are now aware of how Restify boots itself, let's see how to guard it. + +Let's take a closer look at the package's global gate: + + This gate is only active in a non-local environment. + +```php +// app/Providers/RestifyServiceProvider.php + +protected function gate() +{ + Gate::define('viewRestify', function ($user) { + return in_array($user->email, [ + // + ]); + }); +} +``` + +This is the first gate to access the Restify repositories. In a real-life project, you may allow every authenticated user to have access to repositories and just after that, by using policies you can restrict certain specific actions. To do so: + +```php +Gate::define('viewRestify', function ($user) { + return true; +}); +``` + +If you want to allow unauthenticated users to be authorized to see the restify routes, you can nullify the `$user`: + +```php +Gate::define('viewRestify', function ($user = null) { + return true; +}); +``` + +From this point, it's highly recommended to have a policy for each model exposed via Restify. Otherwise, users may access unauthorized resources, which is not what we want. + +## Policies + +If you are not aware of what a policy is, we highly recommend reading the [documentation](https://laravel.com/docs/authorization#creating-policies) before you move forward. + +You can use the Laravel command for generating a policy. It is greatly recommended to generate a policy using the Restify command because it will scaffold Restify's CRUD authorization methods for you: + +```shell script +php artisan restify:policy UserPolicy +``` + +It will automatically detect the `User` model (the word before `Policy`). However, you can set out the following example: + +```shell script +php artisan restify:policy PostPolicy --model=Post +``` + + +It will ultimately be considered that the model lives into the `app/Models` directory. + + + +By default, Restify will unauthorize any requests if there isn't a defined policy method associated to the request's endpoint. Or, if you don't have a policy at all, all requests from that repository will be unauthorized. + + +If you already have a policy, here is the Restify default scaffolded one so you can apply these methods on your own: + +```php +namespace App\Policies; + +use App\Models\Post; +use App\Models\User; +use Illuminate\Auth\Access\HandlesAuthorization; + +class PostPolicy +{ + use HandlesAuthorization; + + public function allowRestify(User $user = null): bool + { + // + } + + public function show(User $user, Post $model): bool + { + // + } + + public function store(User $user): bool + { + // + } + + public function storeBulk(User $user): bool + { + // + } + + public function update(User $user, Post $model): bool + { + // + } + + public function updateBulk(User $user, Post $model): bool + { + // + } + + public function delete(User $user, Post $model): bool + { + // + } + + public function deleteBulk(User $user, Post $model): bool + { + // + } + + public function restore(User $user, Post $model): bool + { + // + } + + public function forceDelete(User $user, Post $model): bool + { + // + } +} +``` + + +For the examples below, we will consider PostRepository as being a pertinent example. + + +### Allow restify + +Just after Restify detects the repository class, it will invoke this method to check if the given user can load this repository in any manner. You can also check if the user is an admin for some specific repositories, such as: + +```php +// PostPolicy +/** + * Determine whether the user can use restify feature for each CRUD operation. + * So if this is not allowed, all operations will be disabled + * @param User $user + * @return mixed + */ +public function allowRestify(User $user) +{ + return $user->isAdmin(); +} +``` + +### Allow show + +From here, each policy corresponds to an exposed Restify route. + +In addition, the `show` method, corresponds to the following routes: + +```http request +POST: /api/restify/posts // it will filter out the entities you don't have access to from the pagination +``` + +and: + +```http request +POST: /api/restify/posts/{id} // it will give a 403 Forbidden status if you don't have access to the resource +``` + +Definition: + +```php +/** + * Determine whether the user can get the model. + * + * @param User $user + * @param Post $model + * @return mixed + */ +public function show(User $user, Post $model) +{ + // +} +``` + +### Allow store + +Determine if a specific user has access to the POST's route in order to create an entity. + +The `store` method, corresponds to the following route: + +```http request +POST: /api/restify/posts +``` + +Definition: + +```php +/** + * Determine whether the user can create models. + * + * @param User $user + * @return mixed + */ +public function store(User $user) +{ + // +} +``` +### Allow storeBulk + +Determine if the user can store multiple entities at once. + +The `storeBulk` method corresponds to the following route: + +```http request +POST: api/posts/bulk +``` + +Definition: + +```php +/** + * Determine whether the user can create multiple models at once. + * + * @param User $user + * @return mixed + */ +public function storeBulk(User $user) +{ + // +} +``` + +### Allow update + +Determine if the user can update a specific model. + +The `update` method corresponds to the following routes: + + + + + + ```http request + PUT: api/restify/posts/{id} + ``` + + + + + ```http request + PATCH: api/restify/posts/{id} + ``` + + + + + ```http request + POST: api/restify/posts/{id} + ``` + + + + +Definition: + +```php +/** + * Determine whether the user can update the model. + * + * @param User $user + * @param Post $model + * @return mixed + */ +public function update(User $user, Post $model) +{ + // +} +``` + +### Allow updateBulk +Determine if the user can update multiple entities at once. When you bulk update, this method will be invoked for each entity you're trying to update. If at least one will return false - none will be updated. The reason behind that is that the bulk update is a DB transaction. + +The `updateBulk` method, corresponds to the following route: + +```http request +POST: api/restify/posts/bulk/update +``` + +Definition: +```php +/** + * Determine whether the user can update bulk the model. + * + * @param User $user + * @param Post $model + * @return mixed + */ +public function updateBulk(User $user = null, Post $model) +{ + return true; +} +``` + +### Allow delete + +The delete endpoint policy. + +The `delete` method, corresponds to the following route: + +```http request +DELETE: api/restify/posts/{id} +``` + +Definition: + +```php +/** + * Determine whether the user can delete the model. + * + * @param User $user + * @param Post $model + * @return mixed + */ +public function delete(User $user, Post $model) +{ + // +} +``` + + +### Allow deleteBulk + +Determine if the user can delete multiple entities at once. When performing bulk deletion, this method will be invoked for each entity you're trying to delete. + +The deleteBulk method corresponds to the following route: + +```http request +DELETE: api/restify/posts/bulk/delete +``` + +Definition: + +```php +/** + * Determine whether the user can delete multiple models at once. + * + * @param User $user + * @param Post $model + * @return mixed + */ +public function deleteBulk(User $user, Post $model) +{ + // +} +``` + + +### Allow Attach + + + +Here is where we're talking about pivot tables. Many to many relationships. + + + +When attaching a model to another, we should check if the user is also able to do that. For example, attaching posts to a user: + +```http request +POST: api/restify/users/{id}/attach/posts +``` +```json +{ "posts": [1, 2, 3] } +``` + +Restify will guess the policy's name by the related entity. For this reason, it will be `attachPost`: + +```php +// UserPolicy.php + +/** + * Determine if the post could be attached to the user. + * + * @param User $user + * @param Post $model + * @return mixed + */ +public function attachPost(User $user, Post $model) +{ + return $user->is($model->creator()->first()); +} +``` + +The `attachPost` method will be called for each individual post. + +### Allow Detach + + + +Here we're talking about pivot tables. Many to many relationships. + + + +When detaching a model from another, we should check if the user is also able to do that. For example, detaching posts from a user: + +```http request +POST: api/restify/users/{id}/detach/posts +``` +```json +{ "posts": [1, 2, 3] } +``` + + Restify will guess the policy's name by the related entity. For this reason, it will be `detachPost`: + +```php +/** + * Determine if the post could be attached to the user. + * + * @param User $user + * @param Post $model + * @return mixed + */ +public function detachPost(User $user, Post $model) +{ + return $user->is($model->creator()->first()); +} +``` + +The `detachPost` method, will be called for each post in part. + +## Register Policy + +A common mistake is that sometimes you may define a policy, but you don't attach it to a model in your `app/Providers/AuthServiceProvider.php`. Make sure you have it figured out here. + +See [documentation](https://laravel.com/docs/authorization#registering-policies). diff --git a/docs-v3/content/auth/profile.md b/docs-v3/content/auth/profile.md new file mode 100644 index 000000000..a7a5db4bd --- /dev/null +++ b/docs-v3/content/auth/profile.md @@ -0,0 +1,375 @@ +--- +title: User Profile +menuTitle: Profile +category: Auth +position: 1 +--- + +## Prerequisites + +Make sure you followed the [Authentication](/docs/auth/authentication) guide before, because one common mistake is that people do not add this middleware: + +```php +// config/restify.php +'middleware' => [ +// ... + 'auth:sanctum', +// ... +] +``` + +## Get profile + +Before retrieving the user's profile, you need to log in and obtain an authentication token. You can refer to the [login documentation](/auth/authentication#login) for details on how to authenticate a user. Make sure to include the `Bearer {$token}` in the `Authorization` header for the subsequent API requests, either using Postman or cURL. + +When retrieving the user's profile, it is serialized by using the `UserRepository`. + +```http request +GET: /api/restify/profile +``` + +Here's an example of a cURL request for retrieving the user's profile with a random token: + +```bash +curl -X GET "http://your-domain.com/api/restify/profile" \ + -H "Accept: application/json" \ + -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9..." +``` + +Replace `http://your-domain.com` with your actual domain and `eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...` with the authentication token you obtained after logging in. + +This is what we have for a basic profile: + +```json +{ + "id": "7", + "type": "users", + "attributes": { + "name": "Eduard", + "email": "interstelar@me.com" + }, + "meta": { + "authorizedToShow": true, + "authorizedToStore": true, + "authorizedToUpdate": true, + "authorizedToDelete": true + } +} +``` + +You can add more `fields` in your `UserRepository` if you want to display them. + +```php +public function fields(RestifyRequest $request): array +{ + return [ + field('name')->rules('required'), + + field('email')->rules('required')->storingRules('unique:users'), + + field('age') + ]; +} +``` + +Since the profile is nicely set on by using the UserRepository, you can now benefit from the power of the related entities. For example, +if you want to return user roles: + +```php +//UserRepository + +public static array $related = [ + 'roles', +]; +``` + +Also, make sure that the `User` model has this method that returns a relationship from another table. You can do that or you can simply +return an array: + +```php +//User.php + +public function roles(): array +{ + // In a real project, here you will get this information from the database. + return [ + 'owner', + 'admin' + ]; +} +``` + +Now, let's get the profile by using the `roles` relationship: + +```http request +GET: /api/restify/profile?include=roles +``` + +The result will look like this: + +```json +{ + "id": "7", + "type": "users", + "attributes": { + "name": "Eduard", + "email": "interstelar@me.com" + }, + "relationships": { + "roles": [ + "owner", + "admin" + ] + }, + "meta": { + "authorizedToShow": true, + "authorizedToStore": true, + "authorizedToUpdate": true, + "authorizedToDelete": true + } +} +``` + +### Without repository + +In some cases, you might choose not to use the repository for the profile serialization. Afterwards, you should add the +trait `Binaryk\LaravelRestify\Repositories\UserProfile` into your `UserRepository`: + +```php +// UserProfile + +use Binaryk\LaravelRestify\Repositories\UserProfile; + +class UserRepository extends Repository +{ + use UserProfile; + + public static $model = 'App\\Models\\User'; + + //... +} +``` + +The profile will return the model directly: + +### Relations + + +Note that when you're not using the repository, the `?include` will not work anymore. + + + +```http request +/api/restify/profile +``` + +You will get: + +```json +{ + "data": { + "id": 7, + "name": "Eduard", + "email": "interstelar@me.com", + "email_verified_at": null, + "created_at": "2020-12-24T08:49:30.000000Z", + "updated_at": "2020-12-24T08:52:37.000000Z" + } +} +``` + +### Conditionally use repository + +In rare cases you may want to utilize the repository only for non admin users. Make sure to serialize +specific fields for the users: + +```php +use Binaryk\LaravelRestify\Fields\Field; +use Binaryk\LaravelRestify\Http\Requests\RestifyRequest; +use Binaryk\LaravelRestify\Repositories\UserProfile; +use Illuminate\Http\Request; + +class UserRepository extends Repository +{ + use UserProfile; + + public static $model = 'App\\Models\\User'; + + public static function canUseForProfile(Request $request) + { + return $request->user()->isAdmin(); + } + + public function fields(RestifyRequest $request) + { + return [ + field('name')->rules('required'), + + field('email')->rules('required') + ->storingRules('unique:users')->messages([ + 'required' => 'This field is required.', + ]), + ]; + } +} +``` + +Thus, you instruct Restify to only use the repository for users who are admins of your application. + +## Update Profile using repository + +By default, Restify will validate and fill only the fields presented in your `UserRepository` for updating the user's +profile. Let's get as an example the following repository fields: + +```php +// UserRepository + +public function fields(RestifyRequest $request) +{ + return [ + field('name')->rules('required'), + + field('email')->storingRules('required', 'unique:users')->messages([ + 'required' => 'This field is required.', + ]), + ]; +} +``` + +If we will try to call the `PUT` method to update the profile without data: + +```json +{} +``` + +We will get back a `4xx` validation: + + + +Accept header if you test it via Postman (or other HTTP client) and make sure you always pass the `Accept` +header `application/json`. This will instruct Laravel to return you back the json formatted data: + + + +```json +{ + "message": "The given data was invalid.", + "errors": { + "name": [ + "The name field is required." + ] + } +} +``` + +Let's say we have to populate the user `name` in the payload: + +```json +{ + "name": "Eduard Lupacescu" +} +``` + +Since the payload is valid now, Restify will update the user's profile (a name, in our case): + +```json +{ + "id": "7", + "type": "users", + "attributes": { + "name": "Eduard Lupacescu", + "email": "interstelar@me.com" + }, + "meta": { + "authorizedToShow": true, + "authorizedToStore": true, + "authorizedToUpdate": true, + "authorizedToDelete": true + } +} +``` + +### Update without repository + +If you [don't use the repository](./#get-profile-using-repository) for the user's profile, Restify will only +update the `fillable` user attributes that are present in the request payload: `$request->only($user->getFillable())`. + +```http request +PUT: /api/restify/profile +``` + +Payload: + +````json +{ + "name": "Eduard Lupacescu" +} +```` + +The response will be the updated user: + +```json +{ + "data": { + "id": 7, + "name": "Eduard", + "email": "interstelar@me.com", + "email_verified_at": null, + "created_at": "2020-12-24T08:49:30.000000Z", + "updated_at": "2020-12-24T09:34:48.000000Z" + } +} +``` + +## User avatar + +To prepare your users for avatars, you can add the `avatar` column in your users' table: + +```php +// Migration +public function up() +{ + Schema::table('users', function( Blueprint $t) { + $t->string('avatar')->nullable(); + }); +} +``` + +Now, you should specify in the user repository that the user has an avatar file: + +```php +use Binaryk\LaravelRestify\Fields\Image; + +public function fields(RestifyRequest $request) +{ + return [ + field('name')->rules('required'), + + field('avatar')->image()->storeAs('avatar.jpg') + ]; +} +``` + +You can use the Restify's profile update and give the avatar as an image. + +### Post request + + + +You cannot upload a file by using PUT or PATCH verbs, so we should use a POST request instead. + + + +```http request +POST: /api/restify/profile +``` + +The payload should be a form-data, with an image under the `avatar` key: + +```json +{ + "avatar": "binary image in form data request" +} +``` + +If you have to customize the path or disk of the storage file, check the [image field](../repository-pattern/field.html#file-fields) diff --git a/docs-v3/content/boost/boost.md b/docs-v3/content/boost/boost.md new file mode 100644 index 000000000..24a34974b --- /dev/null +++ b/docs-v3/content/boost/boost.md @@ -0,0 +1,74 @@ +--- +title: Model Context Protocol (MCP) +menuTitle: Restify Boost +category: Boost +position: 20 +--- + +## MCP Server for Laravel Restify Developers + +Restify Boost provides a dedicated **MCP server for developers** that enhances the development experience when working with Laravel Restify APIs. + +**Repository**: [https://github.com/BinarCode/laravel-restify-boost](https://github.com/BinarCode/laravel-restify-boost) + +### Developer MCP Server Features + +The Laravel Restify MCP server provides AI agents with powerful development tools: + +- **📚 Documentation Access**: Query Laravel Restify documentation directly from your AI agent +- **🏗️ Repository Generation**: Create new repositories with proper structure and conventions +- **⚡ Action Creation**: Generate custom actions for your API resources with validation and best practices +- **🔍 Getter Development**: Build custom getters for specialized data retrieval operations +- **💡 Code Examples**: Get contextual code examples and implementation guidance +- **🎯 Best Practices**: Receive Laravel Restify best practices and architectural guidance + +### Installation & Setup + +#### Install the MCP Server + +```bash +composer require --dev binarcode/laravel-restify-boost +``` + +#### Configure AI Agents + +Configure your AI agent (Claude Desktop, Cursor, etc.) to use the MCP server: + +```json +{ + "mcpServers": { + "laravel-restify": { + "command": "php", + "args": [ + "artisan", + "restify-boost:start" + ] + } + } +} +``` + +#### Usage Examples + +Once configured, your AI agent can help with: + +**Creating Repositories:** +``` +AI: Create a PostRepository with title, content, and author fields +``` + +**Generating Actions:** +``` +AI: Create a PublishPostAction that validates publish dates and notifies subscribers +``` + +**Building Getters:** +``` +AI: Generate a PostAnalyticsGetter that returns engagement metrics for date ranges +``` + +**Documentation Queries:** +``` +AI: How do I implement field validation in Laravel Restify? +AI: Show me examples of custom repository authorization +``` diff --git a/docs-v3/content/graphql/graphql-generation.md b/docs-v3/content/graphql/graphql-generation.md new file mode 100644 index 000000000..9e60d05b8 --- /dev/null +++ b/docs-v3/content/graphql/graphql-generation.md @@ -0,0 +1,353 @@ +--- +title: GraphQL Schema Generation +menuTitle: Schema Generation +category: GraphQL +position: 17 +--- + +# GraphQL Schema Generation + +Laravel Restify can automatically generate GraphQL schemas and resolvers from your existing Restify repositories, allowing you to quickly add GraphQL capabilities to your API. + +## Overview + +The GraphQL generation feature analyzes your Restify repositories and creates: + +- **GraphQL Type Definitions** - Based on your repository fields +- **Query Operations** - For fetching individual resources and collections +- **Mutation Operations** - For creating, updating, and deleting resources +- **Input Types** - For mutation operations +- **Resolver Classes** - PHP classes that handle GraphQL operations (optional) + +## Installation + +### 1. Install Lighthouse GraphQL + +First, install the Lighthouse GraphQL package: + +```bash +composer require pusher/pusher-php-server lighthouse/lighthouse +``` + +### 2. Publish Lighthouse Configuration + +```bash +php artisan vendor:publish --tag=lighthouse-config +``` + +## Basic Usage + +### Generate GraphQL Schema + +The simplest way to generate a GraphQL schema from your repositories: + +```bash +php artisan restify:graphql:generate +``` + +This command will: +1. Analyze all registered Restify repositories +2. Show a preview of what will be generated +3. Ask for confirmation before proceeding +4. Generate a GraphQL schema file at `app/GraphQL/schema.graphql` + +### Generate with Resolvers + +To also generate PHP resolver classes: + +```bash +php artisan restify:graphql:generate --resolvers +``` + +This creates resolver classes in `app/GraphQL/Resolvers/` that handle the GraphQL operations. + +## Command Options + +### Basic Options + +| Option | Description | +|--------|-------------| +| `--force` | Overwrite existing files without prompting | +| `--skip-preview` | Skip the preview and generate files immediately | +| `--resolvers` | Generate PHP resolver classes | + +### Output Configuration + +| Option | Description | Default | +|--------|-------------|---------| +| `--output-path` | Directory for generated files | `app/GraphQL` | +| `--schema-file` | Name of the schema file | `schema.graphql` | + +### Examples + +```bash +# Generate to custom directory +php artisan restify:graphql:generate --output-path=resources/graphql + +# Use custom schema filename +php artisan restify:graphql:generate --schema-file=api-schema.graphql + +# Generate everything without prompts +php artisan restify:graphql:generate --resolvers --force --skip-preview +``` + +## Generated Schema Structure + +### Type Definitions + +For a `UserRepository`, the command generates: + +```graphql +type User { + id: ID! + name: String + email: String + created_at: String + updated_at: String +} + +input UserInput { + name: String + email: String +} +``` + +### Query Operations + +```graphql +type Query { + user(id: ID!): User + userList(first: Int = 15, page: Int = 1): [User!]! +} +``` + +### Mutation Operations + +```graphql +type Mutation { + createUser(input: UserInput!): User! + updateUser(id: ID!, input: UserInput!): User! + deleteUser(id: ID!): Boolean! +} +``` + +## Field Type Mapping + +Laravel Restify fields are automatically mapped to GraphQL types: + +| Restify Field | GraphQL Type | +|---------------|--------------| +| `Field`, `Text`, `Textarea` | `String` | +| `Number`, `Integer` | `Int` | +| `Float`, `Decimal` | `Float` | +| `Boolean`, `Toggle` | `Boolean` | +| `Date`, `DateTime` | `String` | +| `Json` | `JSON` | +| `MultiSelect` | `[String!]` | +| `BelongsTo` | `ID` (input) / `String` (output) | +| `HasMany` | `[ID!]` (input) / `[String!]` (output) | + +## Generated Resolvers + +When using `--resolvers`, the command creates resolver classes with standard CRUD operations: + +```php +findOrFail($args['id']); + + return $repository->setModel($model) + ->serializeForShow(RestifyRequest::createFrom(request())); + } + + public function index($root, array $args, $context, $info) + { + $repository = new UserRepository(); + $query = $repository::newModel()->query(); + + $page = $args['page'] ?? 1; + $perPage = $args['first'] ?? 15; + + return $query->paginate($perPage, ['*'], 'page', $page)->items(); + } + + public function create($root, array $args, $context, $info) + { + $repository = new UserRepository(); + $request = RestifyRequest::createFrom(request()); + $request->merge($args['input']); + + return $repository->store($request); + } + + public function update($root, array $args, $context, $info) + { + $repository = new UserRepository(); + $request = RestifyRequest::createFrom(request()); + $request->merge($args['input']); + + return $repository->update($request, $args['id']); + } + + public function delete($root, array $args, $context, $info) + { + $repository = new UserRepository(); + $request = RestifyRequest::createFrom(request()); + + $repository->destroy($request, $args['id']); + + return true; + } +} +``` + +## Configuration + +The generation process can be customized using the configuration file: + +```bash +php artisan vendor:publish --tag=restify-graphql-config +``` + +This publishes `config/restify-graphql.php` where you can configure: + +- Field type mappings +- Schema generation options +- Repository filtering +- Output formatting preferences + +## Preview Mode + +By default, the command shows a detailed preview before generating files: + +``` +📋 Preview of files to be generated: +═══════════════════════════════════════════════════════ + +🔍 Found 3 repositories: + • UserRepository + • PostRepository + • CompanyRepository + +📂 Output configuration: + Output directory: app/GraphQL + Schema file: schema.graphql + Generate resolvers: Yes + Force overwrite: No + +📄 Files that will be generated: + 1. app/GraphQL/schema.graphql + 2. Resolvers directory: app/GraphQL/Resolvers/ + 3. app/GraphQL/Resolvers/UserResolver.php + 4. app/GraphQL/Resolvers/PostResolver.php + 5. app/GraphQL/Resolvers/CompanyResolver.php + +📝 Sample GraphQL schema preview: + ┌─────────────────────────────────────────────────────┐ + │ type User { │ + │ id: ID! │ + │ name: String │ + │ email: String │ + │ created_at: String │ + │ updated_at: String │ + │ } │ + │ │ + │ type Query { │ + │ user(id: ID!): User │ + │ userList(first: Int, page: Int): [User!]! │ + │ } │ + │ │ + │ type Mutation { │ + │ createUser(input: UserInput!): User! │ + │ updateUser(id: ID!, input: UserInput!): User! │ + │ deleteUser(id: ID!): Boolean! │ + │ } │ + │ │ + │ # ... plus 2 more types │ + └─────────────────────────────────────────────────────┘ +``` + +## Lighthouse Integration + +After generating your schema and resolvers, configure Lighthouse to use them: + +### 1. Update Lighthouse Config + +Edit `config/lighthouse.php`: + +```php +'schema' => [ + 'register' => app_path('GraphQL/schema.graphql'), +], +``` + +### 2. Register Resolvers + +If you generated resolver classes, register them in your GraphQL schema by adding directives: + +```graphql +type Query { + user(id: ID!): User @field(resolver: "App\\GraphQL\\Resolvers\\UserResolver@show") + userList(first: Int = 15, page: Int = 1): [User!]! @field(resolver: "App\\GraphQL\\Resolvers\\UserResolver@index") +} + +type Mutation { + createUser(input: UserInput!): User! @field(resolver: "App\\GraphQL\\Resolvers\\UserResolver@create") + updateUser(id: ID!, input: UserInput!): User! @field(resolver: "App\\GraphQL\\Resolvers\\UserResolver@update") + deleteUser(id: ID!): Boolean! @field(resolver: "App\\GraphQL\\Resolvers\\UserResolver@delete") +} +``` + +### 3. Add GraphQL Route + +Add the GraphQL endpoint to your routes: + +```php +// routes/web.php or routes/api.php +Route::middleware(['api'])->group(function () { + Route::post('/graphql', \Nuwave\Lighthouse\Http\GraphQLController::class); +}); +``` + +## Authentication Context + +The GraphQL generation command automatically handles authentication mocking in console context. This ensures that repositories with permission checks (like `$request->user()->can()`) work properly during schema generation. + +The mock user created during generation: +- Always returns `true` for permission checks +- Provides basic user properties (`id: 1`) +- Handles any authentication-related method calls + +## Next Steps + +After generating your GraphQL schema: + +1. **Install Lighthouse** if not already installed +2. **Configure Lighthouse** to use the generated schema +3. **Register resolvers** in your GraphQL setup +4. **Test your GraphQL endpoint** using tools like GraphQL Playground +5. **Customize the schema** as needed for your specific requirements + +## Troubleshooting + +### Field Collection Issues + +If some fields are missing from the generated schema, ensure your repository's `fields()` method is properly implemented and doesn't have complex conditional logic that prevents field collection. + +### Permission Errors + +The command includes authentication mocking, but if you encounter permission-related errors, check that your repositories handle the mock authentication context properly. + +### Custom Field Types + +If you have custom field types that aren't mapped correctly, you can extend the type mapping in the configuration file or modify the generated schema manually. diff --git a/docs-v3/content/graphql/graphql.md b/docs-v3/content/graphql/graphql.md new file mode 100644 index 000000000..94db7b8a5 --- /dev/null +++ b/docs-v3/content/graphql/graphql.md @@ -0,0 +1,159 @@ +--- +title: GraphQL Integration +menuTitle: GraphQL +category: GraphQL +position: 16 +--- + +# GraphQL Integration + +Laravel Restify provides powerful GraphQL integration, allowing you to automatically generate GraphQL schemas and resolvers from your existing Restify repositories. This enables you to quickly add GraphQL capabilities to your API without rewriting your business logic. + +## Overview + +The GraphQL integration in Laravel Restify provides: + +- **Automatic Schema Generation** - Convert your Restify repositories into GraphQL type definitions +- **Resolver Generation** - Create PHP resolver classes for handling GraphQL operations +- **Field Mapping** - Intelligent mapping from Restify fields to GraphQL types +- **CRUD Operations** - Full Create, Read, Update, Delete operations via GraphQL +- **Authentication Context** - Proper handling of authentication in console/generation context +- **Preview Mode** - See what will be generated before creating files + +## Quick Start + +### 1. Install Dependencies + +First, install the required GraphQL packages: + +```bash +composer require pusher/pusher-php-server lighthouse/lighthouse +``` + +### 2. Generate Your Schema + +Use the Artisan command to generate GraphQL schema from your repositories: + +```bash +php artisan restify:graphql:generate --resolvers +``` + +This command will: +- Analyze your Restify repositories +- Generate GraphQL type definitions +- Create resolver classes (if `--resolvers` flag is used) +- Show a preview before generating files + +### 3. Configure Lighthouse + +Update your `config/lighthouse.php` to use the generated schema: + +```php +'schema' => [ + 'register' => app_path('GraphQL/schema.graphql'), +], +``` + +### 4. Add GraphQL Endpoint + +Add the GraphQL route to your application: + +```php +// routes/api.php +Route::middleware(['api'])->group(function () { + Route::post('/graphql', \Nuwave\Lighthouse\Http\GraphQLController::class); +}); +``` + +## Example Generated Schema + +For a `UserRepository` with fields like `name`, `email`, and `created_at`, the generator creates: + +```graphql +type User { + id: ID! + name: String + email: String + created_at: String + updated_at: String +} + +input UserInput { + name: String + email: String +} + +type Query { + user(id: ID!): User + userList(first: Int = 15, page: Int = 1): [User!]! +} + +type Mutation { + createUser(input: UserInput!): User! + updateUser(id: ID!, input: UserInput!): User! + deleteUser(id: ID!): Boolean! +} +``` + +## Benefits + +### Rapid Development +- Generate complete GraphQL APIs from existing Restify repositories +- No need to manually write type definitions or resolvers +- Maintain consistency between REST and GraphQL APIs + +### Automatic Type Safety +- Field types are automatically mapped to appropriate GraphQL types +- Input validation leverages existing Restify field definitions +- Type safety maintained throughout the stack + +### Seamless Integration +- Uses existing Restify authorization and field visibility rules +- Leverages repository business logic and relationships +- Maintains consistency with REST API behavior + +## Use Cases + +### API Unification +Convert your REST API to also support GraphQL without duplicating logic: + +```bash +# Generate GraphQL from existing repositories +php artisan restify:graphql:generate --resolvers --force +``` + +### Mobile App Backend +Provide GraphQL for mobile apps while maintaining REST for web clients: + +```bash +# Generate to mobile-specific directory +php artisan restify:graphql:generate --output-path=app/GraphQL/Mobile --resolvers +``` + +### Third-Party Integrations +Create GraphQL schemas for external services that prefer GraphQL: + +```bash +# Generate with custom schema naming +php artisan restify:graphql:generate --schema-file=external-api.graphql +``` + +## Next Steps + +1. **[Schema Generation](/graphql/graphql-generation)** - Learn about the schema generation command and its options +2. **[Lighthouse Documentation](https://lighthouse-php.com/)** - Explore advanced GraphQL features +3. **[GraphQL Playground](https://github.com/graphql/graphql-playground)** - Test your GraphQL API interactively + +## Configuration + +The GraphQL generation process can be customized through the configuration file. Publish it using: + +```bash +php artisan vendor:publish --tag=restify-graphql-config +``` + +This allows you to customize: +- Field type mappings +- Repository filtering +- Output formatting preferences +- Schema generation options diff --git a/docs-v3/content/index.md b/docs-v3/content/index.md new file mode 100644 index 000000000..325d6c56a --- /dev/null +++ b/docs-v3/content/index.md @@ -0,0 +1,53 @@ +--- +title: Introduction +description: One Codebase. REST for Humans, MCP for AI Agents. +menuTitle: Introduction +category: Getting Started +--- + +# Unified Laravel API Layer for Humans and AI. + +Laravel Restify turns your Eloquent models into both JSON:API endpoints and MCP servers -- automatically. Build once, and instantly serve APIs that work seamlessly for developers, apps, and AI agents. + + + +🚀 **Ready-Made API Starter Kits Available!** - Looking to build production-ready APIs in minutes instead of weeks? Check out our complete API templates at [RestifyPackages.com](https://restifytemplates.com). Get authentication, roles & permissions, team management, and more - all pre-built and ready to deploy. **Early adopters get free templates!** + + + +## Key Features + +- **JSON:API** endpoints from Laravel models +- **MCP Server** generation for AI agents +- **Authentication** with Laravel Sanctum +- **Search & Filtering** with powerful query capabilities +- **GraphQL** schema generation +- **Authorization** using Laravel policies + +## Accelerate Your Development + +Want to skip the boilerplate and launch faster? Our Restify Templates come with everything you need: + +- 🔐 Complete Authentication - Registration, login, password reset, email verification - all ready to go +- 👥 Teams & Permissions - Spatie's permissions package integrated with team management +- ✉️ Invitations System - Complete invitation workflow with approval system for platform onboarding +- 📸 Profile Photos - Full image upload with resizing, optimization and S3 integration +- 🤖 AI Error Handling - Smart error tracking with OpenAI-powered solutions and debugging hints +- 💬 MCP Client for Smart Chat - Pre-built chat interface that connects directly to your API via MCP protocol +- 🚀 CI/CD Pipeline - Complete GitHub Actions workflow with automated testing and deployment +- 🌱 Smart Seeders - Realistic data generation with interconnected profiles and demo content +- ⚡ Deploy in Minutes - Production-tested code with zero configuration needed +- 📦 Postman Collection - Test all endpoints instantly with our pre-configured collection + +[Get Started with Templates →](https://restifytemplates.com) + +## Playground + +You can find a playground in the [Restify Demo GitHub repository](https://github.com/BinarCode/restify-demo). + +## Videos + +You can find the [full course here](https://www.binarcode.com/learn/restify) with many useful features and insights on how Laravel Restify works. + + diff --git a/docs-v3/content/mcp/mcp.md b/docs-v3/content/mcp/mcp.md new file mode 100644 index 000000000..d0320d7df --- /dev/null +++ b/docs-v3/content/mcp/mcp.md @@ -0,0 +1,192 @@ +--- +title: Model Context Protocol (MCP) +menuTitle: MCP +category: MCP +position: 14 +--- + +Laravel Restify provides seamless integration with the Model Context Protocol (MCP), allowing AI agents to interact with your REST API resources through structured tool interfaces. So you can simply tranform your repositories into a tools for AI agents to consume. Incredible! + +## Setup & Registration + +### Basic Server Registration + +Register the MCP server in your application's service provider or routes file: + +```php +use Binaryk\LaravelRestify\MCP\RestifyServer; +use Laravel\Mcp\Facades\Mcp; + +// Register the MCP server +Mcp::web('restify', RestifyServer::class)->name('mcp.restify'); +``` + +This creates an MCP server endpoint at `/mcp/restify` that AI agents can connect to. + +### Adding Authentication & Middleware + +For production applications, you'll want to add authentication and other middleware: + +```php +use Binaryk\LaravelRestify\MCP\RestifyServer; +use Laravel\Mcp\Facades\Mcp; + +Mcp::web('restify', RestifyServer::class)->middleware([ + 'auth:sanctum', +])->name('mcp.restify'); +``` + +And that's it! Now you can access your Restify API through the MCP server with authentication. Go into n8n or your AI agent of choice and connect to the MCP server endpoint. + +### Terminal/STDIN Access (Local MCP) + +For terminal-based AI agents (like Claude Desktop, cursor, or other CLI tools that support MCP), you can expose your Restify API through STDIN/STDOUT using the `local` syntax. This allows direct integration without HTTP overhead. + +#### Registering a Local MCP Server + +Register your local MCP server in the `routes/ai.php` file: + +```php +use Laravel\Mcp\Facades\Mcp; +use App\Mcp\Servers\GroweeStdServer; + +// Register for terminal/STDIN access +Mcp::local('growee', GroweeStdServer::class); +``` + +#### Creating a Terminal-Accessible Server with Authentication + +When using terminal access, authentication must be handled within the server's `boot()` method since there's no HTTP middleware pipeline. Here's a complete example that extends RestifyServer and implements Sanctum authentication: + +```php +bearerToken(); + + // Fail if no API key is provided + if (! $bearerToken) { + throw new McpException('API key is required. Please provide a Bearer token in the Authorization header.'); + } + + // Try to authenticate using Sanctum + $token = PersonalAccessToken::findToken($bearerToken); + + if (! $token) { + throw new McpException('Invalid API key provided. Please check your Bearer token.'); + } + + // Verify the token is active + if (! $token->tokenable) { + throw new McpException('API token is not associated with a valid user.'); + } + + // Set the authenticated user on both sanctum and default guard + Auth::guard('sanctum')->setUser($token->tokenable); + Auth::setUser($token->tokenable); + + // Set the user resolver for the request + $request->setUserResolver(function () use ($token) { + return $token->tokenable; + }); + + // Call parent boot to discover tools, resources, and prompts + parent::boot(); + } +} +``` + +#### Key Differences from Web Access + +1. **No Middleware Pipeline**: Unlike `Mcp::web()`, the `local` syntax doesn't support middleware. All authentication and authorization must be implemented in the `boot()` method. + +2. **Direct API Token**: Terminal clients provide Bearer tokens directly through the Authorization header. + +3. **Request Context**: Access to the request is available via the `request()` helper function. + +4. **Error Handling**: Use `McpException` for authentication failures to provide clear error messages to the terminal client. + +5. **Registration Location**: Local MCP servers are typically registered in `routes/ai.php` instead of web routes. + +#### Client Configuration + +Terminal-based AI clients (like Claude Desktop) can connect to your local MCP server by configuring the connection with your API token. The exact configuration depends on your client, but typically involves: + +1. Setting the Authorization header with your Sanctum token +2. Specifying the server name (e.g., 'growee') +3. Pointing to your Laravel application's MCP endpoint + +#### Security Considerations + +- **Token Security**: API tokens are passed via the Authorization header and should be kept secure +- **Token Scopes**: Consider implementing token abilities/scopes to limit access +- **Rate Limiting**: Implement rate limiting at the application level since middleware isn't available +- **Audit Logging**: Log authentication attempts and API usage for security monitoring +- **Token Rotation**: Implement token expiration and rotation policies + +#### 🔒 **Security Best Practices** + +- Apply field visibility controls (`hideFromMcp()`) for sensitive data +- Audit MCP field access patterns +- Implement rate limiting for token-heavy operations + +## Common Issues + +### Schema Validation Error + +**Error**: `[ERROR: Received tool input did not match expected schema]` + +**Cause**: This occurs when the field type is not identified correctly by the MCP server, leading to schema mismatches between what the AI agent sends and what Laravel Restify expects. + +**Solution**: You need to explicitly override the field type for the MCP schema using the `toolSchema()` method: + +```php +field('project_id') + ->toolSchema(function(\Laravel\Mcp\Server\Tools\ToolInputSchema $schema) { + $schema->string('project_id') + ->description('The ID of the project associated with the timesheet entry.') + ->required(); + }), +``` + +This approach allows you to: +- Explicitly define the expected data type (string, integer, boolean, etc.) +- Add detailed descriptions for AI agents +- Set validation rules (required, optional) +- Override automatic type inference when it's incorrect + +## Configuration + +The MCP integration respects your existing Restify configuration and adds MCP-specific options: + +```php +// config/restify.php +'mcp' => [ + 'enabled' => true, + 'server_name' => 'My App MCP Server', + 'server_version' => '1.0.0', + 'default_pagination' => 25, + 'tools' => [ + 'exclude' => [ + // Tools to exclude from discovery + ], + 'include' => [ + // Additional tools to include + ], + ], +], +``` diff --git a/docs-v3/content/performance/performance.md b/docs-v3/content/performance/performance.md new file mode 100644 index 000000000..438f7fc32 --- /dev/null +++ b/docs-v3/content/performance/performance.md @@ -0,0 +1,228 @@ +--- +title: Performance +menuTitle: Performance +description: Performance +category: Advanced +position: 14 +--- + +## Policy Caching + +When loading a large number of models, Restify will check each policy method as `show` or `allowRestify` (including for all relations) before serializing them. + +In order to improve performance, Restify caches the policies. You simply have to enable the caching by setting the `restify.cache.policies.enabled` property to `true` in the `restify.php` configuration file: + +```php +'cache' => [ + 'policies' => [ + 'enabled' => true, + 'ttl' => 5 * 60, // seconds + ], +], +``` + +The caching is tight to the current authenticated user so if another user is logged in, the cache will be hydrated for the new user once again. + +Restify allows individual caching at the policy level with specific configurations. To enable this, a contract `Cacheable` must be implemented at the policy level, which enforces the use of the `cache()` method. + +``` php +class PostPolicy implements Cacheable +{ + public function cache(): ?CarbonInterface + { + return now()->addMinutes(); + } +``` +The `cache` method is expected to return a `CarbonInterface` or `null`. If `null` is returned, the current policy will `NOT` cached. + +## Disable index meta + +Index meta are policy information related to what actions are allowed on a resource for a specific user. However, if you don't need this information, you can disable the index meta by setting the `restify.repositories.serialize_index_meta` property to `false` in the `restify.php` configuration file: + +```php +'repositories' => [ + 'serialize_index_meta' => false, + + 'serialize_show_meta' => true, +], +``` + +This will give your application a boost, especially when loading a large amount of resources or relations. + +## Repository Index Caching + +Laravel Restify provides powerful caching for repository index requests to dramatically improve performance for expensive queries with filters, searches, sorts, and pagination. This feature can reduce response times by orders of magnitude for complex API endpoints. + +### Quick Setup + +Enable repository caching in your `.env` file: + +```bash +# Enable repository index caching +RESTIFY_REPOSITORY_CACHE_ENABLED=true + +# Cache TTL in seconds (default: 300 = 5 minutes) +RESTIFY_REPOSITORY_CACHE_TTL=300 + +# Optional: Specify cache store +RESTIFY_REPOSITORY_CACHE_STORE=redis +``` + +That's it! Your repository index endpoints will now be cached automatically. + +### Configuration + +All caching options are available in `config/restify.php`: + +```php +'repositories' => [ + 'cache' => [ + // Enable or disable caching globally + 'enabled' => env('RESTIFY_REPOSITORY_CACHE_ENABLED', false), + + // Default TTL in seconds + 'ttl' => env('RESTIFY_REPOSITORY_CACHE_TTL', 300), + + // Cache store to use (null = default) + 'store' => env('RESTIFY_REPOSITORY_CACHE_STORE'), + + // Skip caching for authenticated users + 'skip_authenticated' => false, + + // Enable in test environment (disabled by default) + 'enable_in_tests' => false, + + // Cache tags for efficient invalidation + 'tags' => ['restify', 'repositories'], + ], +], +``` + +### Repository-Specific Configuration + +Customize caching per repository: + +```php +class PostRepository extends Repository +{ + // Disable caching for this repository + public static bool $cacheEnabled = false; + + // Custom TTL (10 minutes) + public static int $cacheTtl = 600; + + // Use specific cache store + public static ?string $cacheStore = 'redis'; + + // Custom cache tags + public static array $cacheTags = ['posts', 'content']; +} +``` + +### Smart Cache Keys + +The system generates unique cache keys based on: + +- Repository type (users, posts, etc.) +- Request parameters (search, filters, sorting, pagination) +- User context (for authorization-sensitive data) +- Model timestamps (for automatic invalidation) + +Example cache key: +``` +restify:repository:posts:index:7ed77bab35bfc8f3fd4da03ffdde2370:user_1:v_1756392802 +``` + +### Cache Store Compatibility + +**Full Support (with cache tags):** +- ✅ Redis Store +- ✅ Memcached Store +- ✅ Array Store (testing) + +**Basic Support (TTL-based):** +- ✅ Database Store +- ✅ File Store + +The system automatically detects cache store capabilities and gracefully falls back when advanced features aren't supported. + +### Automatic Cache Invalidation + +Cache is automatically cleared when: + +```php +// Model events trigger cache clearing +$post = Post::create([...]); // Clears post cache +$post->update([...]); // Clears post cache +$post->delete(); // Clears post cache +``` + +### Manual Cache Management + +```php +// Clear cache for specific repository +PostRepository::clearCache(); + +// Configure caching at runtime +PostRepository::enableCache(); +PostRepository::disableCache(); +PostRepository::cacheTtl(600); // 10 minutes +PostRepository::cacheTags(['posts', 'content']); +``` + +### Performance Impact + +Caching provides dramatic performance improvements: + +- **Complex filters**: 50-90% faster response times +- **Large datasets**: Reduces database load significantly +- **Pagination**: Instant subsequent page loads +- **Search queries**: Eliminates expensive LIKE operations +- **Authorization**: Caches user-specific policy checks + +### Test Environment Safety + +**Caching is disabled by default in tests** to prevent test isolation issues: + +```php +// Tests automatically have caching disabled +class MyTest extends TestCase { + public function test_something() { + // Caching is off - no cache pollution between tests + } +} + +// Enable caching for specific tests +class CacheTest extends TestCase { + public function test_with_cache() { + $this->enableRepositoryCache(); + // Now caching is enabled for this test + } +} +``` + +### Best Practices + +1. **Production Focused**: Enable caching in production where it matters most +2. **Monitor TTL**: Set appropriate cache TTL based on data update frequency +3. **Use Redis**: Redis provides the best caching experience with full tag support +4. **Tag Strategy**: Use meaningful cache tags for efficient bulk invalidation +5. **Authorization-Aware**: Caching respects user permissions automatically + +### Example Usage + +```php +// Before caching: 500ms response time +GET /api/restify/posts?search=laravel&sort=created_at&page=2 + +// After caching: 20ms response time (25x faster!) +GET /api/restify/posts?search=laravel&sort=created_at&page=2 + +// Different parameters = different cache +GET /api/restify/posts?search=php&sort=title&page=1 // New cache entry + +// Cache respects user context +// User A and User B get different cached results based on permissions +``` + +This caching system provides a significant performance boost with zero code changes required - simply enable it in configuration and enjoy faster API responses! diff --git a/docs-v3/content/performance/solutions.md b/docs-v3/content/performance/solutions.md new file mode 100644 index 000000000..3b1628be9 --- /dev/null +++ b/docs-v3/content/performance/solutions.md @@ -0,0 +1,63 @@ +--- +title: AI Solution +menuTitle: AI Solution +description: AI Solution +category: Advanced +position: 14 +--- + +Inspired by the [Marcel's Article](https://beyondco.de/blog/ai-powered-error-solutions-for-laravel). + +## Generate solution + +Restify can generate an AI based solution to your problem. In order to enable that you need to extend the `App\Exceptions\Handler` with the `Binaryk\LaravelRestify\Exceptions\RestifyHandler`: + +```php +use Binaryk\LaravelRestify\Exceptions\RestifyHandler; +use Throwable; + +class Handler extends RestifyHandler +{ + //... +} +``` + + +This feature is only enabled when the `app.debug` is set to `true`. + + + +This feature is using the [openai-php/laravel](https://github.com/openai-php/laravel#get-started), you should also publish the config file: + +``` +php artisan vendor:publish --provider="OpenAI\Laravel\ServiceProvider" +``` + +and set the `OPENAI_API_KEY` in the `.env` file. + +The OpenAI key can be obtained from [here](https://platform.openai.com/account/api-keys). + + +Now the solution to your problems will automatically appear in the response: + +```json +{ + "restify-solution": "Line 67 in DocumentRepository.php file has an error because the method `resolveUsingFullPath()` is not defined. The code should look like this:\n```\n->resolveUsingTemporaryUrl($request->boolean('temporary'))\n```\n", + "message": "Call to undefined method Binaryk\\LaravelRestify\\Fields\\File::resolveUsingFullPath()", + "exception": "Error", + "file": "/Users/eduardlupacescu/Sites/binarcode/erp/app/Restify/DocumentRepository.php", + "line": 67, + "trace": [ +... +} +``` + +## Disable solution + + +If you want to disable the solution feature you can set the `restify.ai_solution` to `false` in the `config/restify.php` file so Restify will not call the OpenAI API even you extended the exception handler. This might be useful in automated tests or other environments: + +```php +// config/restify.php +'ai_solutions' => true, +``` diff --git a/docs-v3/content/quickstart.md b/docs-v3/content/quickstart.md new file mode 100644 index 000000000..b3e9a433d --- /dev/null +++ b/docs-v3/content/quickstart.md @@ -0,0 +1,232 @@ +--- +title: Quickstart +category: Getting Started +--- + +## Requirements + + +Laravel Restify has a few requirements that you should be mindful of before installing: + +- PHP ^8.0 +- Laravel Framework ^8.0 for Restify <= 6.x +- Laravel Framework ^9.0 for Restify ^7.x + +Or for newer versions: + +- PHP >= 8.1 +- Laravel Framework ^10.0 for Restify ^8.x + +## Installation + +```bash +composer require binaryk/laravel-restify +``` + +### Package Stability + + + +If you are not able to install Restify into your application because of your `minimum-stability` setting, consider +setting your `minimum-stability` option to `dev` and your `prefer-stable` option to `true`. This will allow you to +install Laravel Restify while still preferring stable package releases for your application. + + + +## Setup + +After the installation, the package requires a setup process: + +```shell script +php artisan restify:setup +``` + +The command above: + +- **publishes** the `config/restify.php` configuration file and `action_logs` table migration +- **creates** the `providers/RestifyServiceProvider` and will add it in the `config/app.php` +- **creates** a new `app/Restify` directory +- **creates** an abstract `app/Restify/Repository.php` +- **scaffolds** a `app/Restify/UserRepository` repository for users CRUD + +### Migrations + +After the setup, you should run the migrations: + +```shell script +php artisan migrate +``` + +## Generating Mock Data + +To generate mock data for your database, you need to install the `doctrine/dbal` package as a development dependency: + +```bash +composer require doctrine/dbal --dev +``` +After installing the package, you can use the restify:stub command to generate mock data for a specific table: + +```bash +php artisan restify:stub table_name --count=10 +``` + +Replace table_name with the name of the table you want to generate mock data for and use the --count option to specify the number of records you want to create. + +For example, to generate 10 users: + +```shell +php artisan restify:stub users --count=10 +``` + +## Quick start + +Having the package setup and users table migrated and seeded, you should be good to perform the first API request: + +```http request +GET: /api/restify/users?perPage=10&page=1 +``` + +or use the [json api](https://jsonapi.org/profiles/ethanresnick/cursor-pagination/#auto-id-pagesize) format: + +```http request +GET: /api/restify/users?page[size]=10&page[number]=1 +``` + +This should return the users list paginated and formatted according to [JSON:API](https://jsonapi.org/format/) standard. + +## Configurations + +### Prefix + +As you can see, the default prefix for the restify api is `/api/restify`. This can be changed from the `app/restify.php` +file: + +```php +'base' => '/api/restify', +``` + +### Middleware + +One important configuration is the restify's default middleware: + +```php +// config/restify.php + +'middleware' => [ + 'api', + // 'auth:sanctum', + Binaryk\LaravelRestify\Http\Middleware\DispatchRestifyStartingEvent::class, + Binaryk\LaravelRestify\Http\Middleware\AuthorizeRestify::class, +] +``` + +#### Sanctum authentication + +Normally, you would want to authenticate your api (allow access only to authenticated users). For this purpose, you can simply add another middleware. For the `sanctum`, you can add the `auth:sanctum`. Make sure you put this right after `api` middleware. + +We will cover this more in the [Authentication](/auth/authentication) section. + +## Generate repository + +Creating a new repository can be done via restify command: + +```shell script +php artisan restify:repository PostRepository +``` + +If you want to generate the `Policy`, `Model`, and `migration` as well, then you can use the `--all` option: + +```shell script +php artisan restify:repository PostRepository --all +``` + +## Generate repositories for all models + +For new projects or when you want to quickly generate repositories for all existing models in your application, you can use the bulk generation command: + +```shell script +php artisan restify:generate:repositories +``` + +This command will: + +1. **Discover all models** in your application +2. **Analyze model fields** from database schema +3. **Show a detailed preview** of what will be generated +4. **Ask for confirmation** before creating files +5. **Generate repositories** with appropriate field definitions + +### Command Options + +| Option | Description | +|--------|-------------| +| `--force` | Overwrite existing repositories without prompting | +| `--skip-preview` | Skip preview and generate files immediately | +| `--structure=flat\|domains` | Choose repository structure | +| `--only=Model1,Model2` | Only generate repositories for specific models | +| `--except=Model1,Model2` | Exclude specific models from generation | + +### Repository Structure Options + +The command allows you to choose between two organizational structures: + +**Flat Structure** (default): +``` +app/Restify/ +├── UserRepository.php +├── PostRepository.php +└── CompanyRepository.php +``` + +**Domains Structure**: +``` +app/Restify/Domains/ +├── User/ +│ └── UserRepository.php +├── Post/ +│ └── PostRepository.php +└── Company/ + └── CompanyRepository.php +``` + +### Examples + +```shell script +# Generate with preview and structure selection +php artisan restify:generate:repositories + +# Generate only for specific models +php artisan restify:generate:repositories --only=User,Post + +# Generate with domains structure, skip preview +php artisan restify:generate:repositories --structure=domains --skip-preview + +# Force overwrite existing repositories +php artisan restify:generate:repositories --force +``` + +### Field Detection + +The command automatically detects and maps database columns to appropriate Restify field types: + +- `string`/`varchar` → `field()` (or `email()` for email columns) +- `text` → `textarea()` +- `integer`/`bigint` → `number()` +- `boolean` → `boolean()` +- `date` → `date()` +- `datetime`/`timestamp` → `datetime()` +- `json` → `json()` + +Special handling for: +- Password fields → `password()->storable()` +- Timestamp fields → `readonly()` +- Foreign key fields → Excluded (handled as relationships) + +## Generate policy + +Since the authorization is based on using the Laravel Policies, a good way of generating a complete policy for an entity is by +using the restify command: + +```shell script +php artisan restify:policy PostPolicy +``` diff --git a/docs-v3/content/search/advanced-filters.md b/docs-v3/content/search/advanced-filters.md new file mode 100644 index 000000000..d76b992c6 --- /dev/null +++ b/docs-v3/content/search/advanced-filters.md @@ -0,0 +1,504 @@ +--- +title: Advanced filters +menuTitle: Advanced filters +category: Search & Filters +position: 12 +--- + +Restify has [base filters](/search/basic-filters) for usual `search` or `matching`. + + +Advanced filters will help you to build your own filters from scratch. + + +## Definition + +To declare an advanced filter you should create a class that extends the `Binaryk\LaravelRestify\Filters\AdvancedFilter`. + +Say we have a filter that filters all ready to publish posts: + +```php +use Binaryk\LaravelRestify\Filters\AdvancedFilter; +use Binaryk\LaravelRestify\Http\Requests\RestifyRequest; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Relations\Relation; + +class ReadyPostsFilter extends AdvancedFilter +{ + public function filter(RestifyRequest $request, Relation|Builder $query, $value) + { + // TODO: Implement filter() method. + } + + public function rules(Request $request): array + { + return []; + } + +}; +``` + +### Register filter + +Then add the filter to the repository `filters` method: + +```php +// PostRepository.php +public function filters(RestifyRequest $request): array +{ + return [ + ReadyPostsFilter::new(), + ]; +} +``` + +### Authorize filter + +You can authorize certain filters to be active for specific users: + +```php +// PostRepository.php +public function filters(RestifyRequest $request): array +{ + return [ + ReadyPostsFilter::new()->canSee( + fn($request) => $request->user()->isAdmin() + ), + ]; +} +``` + +### Apply advanced filter + +To apply an advanced filter, the frontend has to send the `filters` query param with a base64 encoded filter: + +```javascript +const filters = btoa(JSON.stringify([ + { + 'key': 'ready-posts-filter', + 'value': null, + } +])) + +const response = await axios.get(`api/restify/posts?filters=${filters}`); +``` + +The frontend has to encode into base64 an array of filters. Each filter contains 2 things: + +- `key` - which is the `ke-bab` form of the filter class name, or a custom `$uriKey` [defined in the filter](#custom-uri-key) + +- `value` - this is optional, and represents the value the advanced filter will as a third argument in the `filter` method + +## Apply advanced filters via POST Request (Version 9.3.0+) + +Starting from version 9.3.0, Laravel Restify introduces the ability to apply advanced filters using a POST request. This enhancement simplifies the process of sending complex filter payloads without the need for base64 encoding. Now, you can send the filters directly as JSON in the request body: + +```javascript +const filters = [ + { + 'key': 'ready-posts-filter', + 'value': null, + } +]; + +const response = await axios.post(`api/restify/posts/apply-restify-advanced-filters`, { filters }); +``` + + +### Custom uri key + +Since your class names could change along the way, you can define a `$uriKey` property to your filters, so the frontend will use always the same `key` when applying a filter: + +```php +class ReadyPostsFilter extends AdvancedFilter +{ + public static $uriKey = 'ready-posts'; + + //... + +}; +``` + +### Custom title + +```php +class ReadyPostsFilter extends AdvancedFilter +{ + public static $title = 'Ready to publish posts'; + + //... + +}; +``` + +### Custom description + +```php +class ReadyPostsFilter extends AdvancedFilter +{ + public static $description = 'Filter all posts that are ready to publish'; + + //... + +}; +``` + +### Custom meta + +```php +class ReadyPostsFilter extends AdvancedFilter +{ + public function meta(): array + { + return [ + 'icon' => 'icon', + 'color' => 'red', + 'operators' => [ + 'like' => 'Like', + 'eq' => 'Equal', + ] + ]; + } +}; +``` + +Meta will be rendered key/value in the frontend: + +```json +{ + ... + "icon": "icon", + "color": "red", + "operators": { + "like": "Like", + "eq": "Equal" + } +} +``` + +### Advanced filter value + +The third argument of the `filter` method is the raw value send by the frontend. Sometimes it might be an array, so you have to get the value using array access: + +```php +$value['activation']['active'] +``` + +To avoid this, there is an `input` method defined into the parent class, so you can use: + +```php + public function filter(RestifyRequest $request, Relation|Builder $query, $value) +{ + $value = $this->input('activation.active', false); +} +``` + +This method gets a default value as a second parameter in case the frontend didn't define it. + + +### Advanced filter rules + +The `rules` method return an associative array with laravel rules for the payload the frontend should send in the `value` property for this specific filter. The payload is validated right before it gets to the filter method: + +```php +public function rules(Request $request): array +{ + return [ + 'created_at' => ['required'], + ]; +} +``` + +So the frontend should send the `created_at` value: + +```javascript +{ + 'key': 'ready-posts-filter', + 'value': { created_at: '2021-01-01' } +} +``` + +And you can get this value into the `filter` method using the [advanced filter value](#advanced-filter-value): + +```php + $value = $this->input('created_at', now()); +``` + + + +## Variations + +Restify ships a few types of build in filter classes you can extend for specific needs. + +### Date filters + +Defining the filter: + +```php +use Binaryk\LaravelRestify\Http\Requests\RestifyRequest; +use Binaryk\LaravelRestify\Filters\TimestampFilter; + +class CreatedAfterDateFilter extends TimestampFilter +{ + public function filter(RestifyRequest $request, $query, $value) + { + $query->whereDate('created_at', '>', $value); + } +} +``` + +Using filter: + +```php +public function filters(RestifyRequest $request) +{ + return [ + CreatedAfterDateFilter::new(), + ]; +} +``` + +JavaScript implementation: + +```javascript +const filters = btoa(JSON.stringify([ + { + 'key': 'created-after-date-filter', + 'value': moment()->timestamp + } +])) + +const response = await axios.get('api/restify/posts?filters=' + filters); +``` + + +### Select Filters + +Defining the filter: + +```php +where('category', $value); + } + + public function options(Request $request) + { + return [ + 'Movie category' => 'movie', + + 'Article Category' => 'article', + ]; + } +} +``` + +Using filter: + + +```php +// App/Restify/PostRepository.php +public function filters(RestifyRequest $request) +{ + return [ + SelectCategoryFilter::new(), + ]; +} +``` + +JavaScript implementation: + +```javascript +const filters = btoa(JSON.stringify([ + { + 'key': 'select-category-filter', + 'value': 'article' + } +])) + +const response = await axios.get('api/restify/posts?filters=' + filters); +``` + +### Boolean filter + +Defining the filter: +```php +where('is_active', $value['is_active']); + } + + public function options(Request $request) + { + return [ + 'Is Active' => 'is_active', + ]; + } +} + +``` +Using filter: +```php +// App/Restify/PostRepository.php +public function filters(RestifyRequest $request) +{ + return [ + ActiveBooleanFilter::new(), + ]; +``` + +JavaScript implementation: + +```javascript +const filters = btoa(JSON.stringify([ + { + 'key': 'active-boolean-filter', + 'value': { + 'is_active': true, + } + } +])) + +const response = await axios.get('api/restify/posts?filters=' + filters); +``` + +## Multiple filters + +You can combine filters as you prefer: + + +```javascript +const filters = btoa(JSON.stringify([ + { + 'key': 'active-boolean-filter', + 'value': { + 'is_active': true, + } + }, + { + 'key': 'select-category-filter', + 'value': 'article' + }, +])) + +const response = await axios.get('api/restify/posts?filters=' + filters); +``` + +## Get available filters + +```javascript +await axios.get('resitfy-api/posts/filters'); +``` + +The response will look like this: + +```json +{ + "data": [ + { + "key": "active-boolean-filter", + "type": "boolean", + "options": [ + { + "label": "Is Active", + "property": "is_active" + } + ] + }, + { + "key": "select-category-filter", + "type": "select", + "options": [ + { + "label": "Movie category", + "property": "movie" + }, + { + "label": "Article Category", + "property": "article" + } + ] + }, + { + "key": "created-after-date-filter", + "type": "timestamp", + "options": [] + }, + { + "key": "email", + "type": "value", + "description": "Email", + "label": "Email", + "meta": { + "operator": "like" + } + } + ] +} +``` + +Along with custom filters, you can also include in the response the primary filters (as matches), by using `?include` query param: + +```http request +/api/restify/posts/filters?include=matches,searchables,sortables +``` + +## Handling Additional Payload Data in Advanced Filters + +In some scenarios, you might want to send additional data beyond the standard key and value in your filter payload. For instance, you may need to specify an operator or a column to apply more complex filtering logic. Laravel Restify Advanced Filters provide a way to handle these additional payload fields using the `$this->rest()` method. + +**Example Payload** + +Consider the following payload: +```json +const filters = [ + { + 'key': ValueFilter::uriKey(), + 'value': 'Valid%', + 'operator' => 'like', + 'column' => 'description', + } +]; + +const response = await axios.post(`api/restify/posts/apply-restify-advanced-filters`, {filters}); +``` + +In this payload, besides the standard key and value, we are also sending operator and column. The operator specifies the type of SQL operation, and the column specifies the database column to filter. + +Using `$this->rest()` to Access Additional Data + +To handle these additional fields in your filter class, you need to ensure they are accessible via the `$this->rest()` method. Here is how you can achieve that: + +```php +class ValueFilter extends AdvancedFilter +{ + public function filter(RestifyRequest $request, Builder|Relation $query, $value) + { + $operator = $this->rest('operator'); + $column = $this->rest('column'); + + $query->where($column, $operator, $value); + } + + public function rules(Request $request): array + { + return []; + } +} +``` + diff --git a/docs-v3/content/search/basic-filters.md b/docs-v3/content/search/basic-filters.md new file mode 100644 index 000000000..c881f5140 --- /dev/null +++ b/docs-v3/content/search/basic-filters.md @@ -0,0 +1,438 @@ +--- +title: Filters +menuTitle: Filters +category: Search & Filters +position: 11 +--- + +Restify provides few powerful ways to filter and search your data. + +## Global search + +Restify provides a global endpoint that searches over all repositories searchable fields. + +To define which repository fields are searchable, you may assign an array of database columns in the `search` property of your repository class. This includes id column by default, but you may override it to your needs: + +```php +class PostRepository extends Repository +{ + public static array $search = ['id', 'title']; +``` + +The endpoint to search is: + +```http request +GET: /api/restify/search?search="Test title" +``` + +It will search over all repositories that are authorized (has `allowRestify` policy on true). + +### Disabling global search + +There are 2 ways to disable the global search: for a repository, either return false from the `allowRestify` model policy method or + + + +So to disable the `Posts` from the global search using the repository property we do: + +```php +// PostRepository.php +public static bool $globallySearchable = false; +``` + +### Paginate global search + +You can limit the number of results that are returned in the global search by overriding the `globalSearchResults` property on the resource: + +```php +// PostRepository.php +public static int $globalSearchResults = 5; +``` + + + +Restify has built in support for laravel scout, so it will initialize the query using scout if you have setup it for the model. + + + +### Customize global search + +The default global search response looks like this: + +```json +{ + "data": [ + { + "repositoryName": "users", + "repositoryTitle": "Users", + "title": "Mrs. Lucie Parker Jr.", + "subTitle": null, + "repositoryId": 1, + "link": "/api/restify/users/1" + } + ] +} +``` + +Where the `title` is the repository column defined by the `$title` property. So you can customize it: + +```php +// UserRepository.php + +public static string $title = 'email'; +``` + +The `subTitle` could be customized by overriding the `subtitle` method. The returned value will be displayed here: + +```php +// UserRepository.php +public function subtitle(): ?string +{ + return 'User email: ' . $this->model()->email; +} +``` + +The `repositoryTitle` could be customized by overriding the `label` method or by defining the `$label` property. This will customize the displayed repository title in the global search response: + +```php +// UserRepository.php +public static string $label = 'Custom Repository Title'; + +// Or using the label method for dynamic titles: +public static function label(): string +{ + return 'Dynamic Title'; +} +``` + +## Repository Search + +The repository search works in a similar way as [global search](#global-search), however in this case the endpoint refers to the repository and the search will be applied for a certain repository. + +Say we want to search users by their `email` and `name`: + +```php +class UserRepository extends Repository +{ + public static array $search = ['name', 'email']; +``` + +So the endpoint will scope the the `users` repository now: + +```http request +GET: /api/restify/users?search="John Doe" +``` + +## Case-sensitive search + +By default, Restify search is case-sensitive. You can change this behavior by changing the configuration: + +```php +// restify.php + + 'search' => [ + /* + | Specify either the search should be case-sensitive or not. + */ + 'case_sensitive' => false, + ], +``` + +### Custom search filter + +The search could be customized by creating a class that extends the `\Binaryk\LaravelRestify\Filters\SearchableFilter`: + +```php +use Binaryk\LaravelRestify\Filters\SearchableFilter; + +class CustomTitleSearchFilter extends SearchableFilter +{ + public function filter(RestifyRequest $request, $query, $value) + { + return $query->orWhere('name', 'like', "%$value%"); + } +} +``` + +In the `filter` method you can define your own filtering over the `$query` builder and then attach the class instance to a column: + +```php +public static function searchables(): array +{ + return [ + 'title' => CustomTitleSearchFilter::make(), + ]; +} +``` + + + +As soon as you define the `searchables` method into the repository, the `$search` array is not taken into consideration anymore. So make sure you return all available search fields from this method. + + + +## Match + +Matching by specific attributes may be useful if you want an exact matching. + +Repository configuration: + +```php +class PostRepository extends Repository +{ + public static array $match = [ + 'id' => 'int', + 'title' => 'string', + ]; +} +``` + +As we may notice the match configuration is an associative array, defining the attribute name and type mapping. + +Available types: + +- [text (or `string`)](#match-string) +- [bool](#match-bool) +- [int (or `integer`)](#match-int) +- [datetime](#match-datetime) +- [between](#match-between) +- [array](#match-array) + +When performing the request you may pass the match field and value as query params: + +```http request +GET: /api/restify/posts?id=1 +``` + +or by title: + +```http request +GET: /api/restify/posts?title="Some title" +``` + +### Match string + +Definition: + +```php +class PostRepository extends Repository +{ + public static array $match = [ + 'title' => 'string', + ]; +} +``` + +Request: + +```http request +GET: /api/restify/posts?title="Title" +``` + +### Match bool + +Definition: + +```php +class PostRepository extends Repository +{ + public static array $match = [ + 'active' => 'bool', + ]; +} +``` + +Request: + +```http request +GET: /api/restify/posts?active=true +``` + +### Match int + +Definition: + +```php +class PostRepository extends Repository +{ + public static array $match = [ + 'id' => 'int', + ]; +} +``` + +Request: + +```http request +GET: /api/restify/posts?id=1 +``` + +### Match datetime + +The `datetime` filter add behind the scene an `whereDate` query. + +```php +class PostRepository extends Repository +{ + public static array $match = [ + 'published_at' => 'datetime', + ]; +} +``` + +Request: + +```http request +GET: /api/restify/posts?published_at=2020-12-01 +``` + +If the request contains two dates instead of one, it will perform a `whereBetween` query: + +```http request +GET: /api/restify/posts?published_at=2020-12-01,2021-01-01 +``` + +Eloquent will do: + +```php +$query->whereBetween('published_at', ['2020-12-01', '2021-01-01']); +``` + +### Match between + +The `between` match works similarly as the `whereBetween` Eloquent method: + +```php +class PostRepository extends Repository +{ + public static array $match = [ + 'id' => 'between', + 'published_at' => 'between', + ]; +} +``` + +Request: + +```http request +GET: /api/restify/posts?published_at=2021-09-16,2021-11-16 +``` + +So it will return all posts published between the first and the second dates. It works with `integer` as well: + +```http request +GET: /api/restify/posts?id=1,20 +``` + +Match all available `ids` between `1` and `20`. + +### Match array + +Match also accept a list of elements in the query param: + +```php +class PostRepository extends Repository +{ + public static $match = [ + 'id' => 'array' + ]; +} +``` + +Request: + +```http request +GET: /api/restify/posts?id=1,2,3 +``` + +This will be converted to: + +```php +->whereIn('id', [1, 2, 3]) +``` + +### Match null + +All match types accept `null` as a value, and check add `whereNull` to the query: + +```http request +GET: /api/restify/posts?published_at=null +``` + +### Match negation + +All match types accept a negation, so you can negate the column match by simply adding the `-` (minus) sign before the field: + +```http request +GET: /api/restify/posts?-id=1,2,3 +``` + +This will return all posts where doesn't have the `id` in the `[1,2,3]` list. + +You can apply `-` (negation) for every match: + +```http request +GET: /api/restify/posts?-title="Some title" +``` + +This will return all posts that doesn't contain `Some title` substring. + +### Custom match filter + +Sometimes you may have a large logic into a match. To allow this, `Restify` provides a declarative way to define `matchers`. For this purpose you should define a class, that extends the `Binaryk\LaravelRestify\Filters\MatchFilter`: + +```php +use Binaryk\LaravelRestify\Filters\MatchFilter; + +class ActivePostMatchFiler extends MatchFilter +{ + public function filter(RestifyRequest $request, Builder | Relation $query, $value) + { + // your logic here + } +} +``` + +The next step is to return this class instance from the `matchers` method: + +```php +// PostRepository.php +public static function matches(): array +{ + return [ + 'active' => ActivePostMatchFiler::make(), + ]; +} +``` + + + +As soon as you define the `matches` method into the repository, the `$match` array is not taken into consideration anymore. So make sure you return all available matches from this method. + + + +### Partial match + +The match filters 1:1 match, however, when you're looking for a substring into a text, you might need to partially match it. + +This could be done using the `Binaryk\LaravelRestify\Filters\MatchFilter` class: + +```php +public static function matches(): array +{ + return [ + 'title' => MatchFilter::make()->setType('text')->partial() + ]; +} +``` + +### Get available matches + +You can use the following request to get all repository matches: + +```http request +/api/restify/posts/filters?only=matches +``` diff --git a/docs-v3/content/search/sorting.md b/docs-v3/content/search/sorting.md new file mode 100644 index 000000000..78a3e1bf2 --- /dev/null +++ b/docs-v3/content/search/sorting.md @@ -0,0 +1,218 @@ +--- +title: Sort +menuTitle: Sort +description: Sorting +category: Search & Filters +position: 13 +--- + + ## Definition + +During index requests, usually we have to sort by specific attributes. This requires the `$sort` configuration: + +```php +class PostRepository extends Repository +{ + public static array $sort = ['id']; +``` + +Performing request requires the sort query param: + +## Descending sorting + +Sorting DESC requires a minus (`-`) sign before the attribute name: + + ```http_request +GET: /api/restify/posts?sort=-id +``` + +Sorting ASC: + + ```http_request +GET: /api/restify/posts?sort=id +``` + +or with plus sign before the field: + + ```http_request +GET: /api/restify/posts?sort=+id +``` + +## Sort using relation + +Sometimes you may need to sort by a `belongsTo` or `hasOne` relationship. + +This become a breeze with Restify. Firstly you have to instruct your sort to use a relationship: + +### HasOne sorting + +Using a `related` relationship, it becomes very easy to define a sortable by has one related. + +You simply add the `->sortable()` method to the relationship: + +```php +// UserRepository.php + +public function related(): array +{ + return [ + 'post' => HasOne::make('post', PostRepository::class)->sortable('title'), + ]; +} +``` + + + +The `sortable` method accepts the column (or fully qualified column name) of the related model. + + + + +The API request will always have to use the full path to the `attributes`: + +```bash +GET: /api/restify/posts?sort=post.attributes.title +``` + +The structure of the `sort` query param value consist always from 3 parts: + +- `post` - the name of the relation defined in the `related` method +- `attributes` - a generic json:api term +- `title` - the column name from the database of the related model + +### BelongsTo sorting + +The belongsTo sorting works in a similar way. + +You simply add the `->sortable()` method to the relationship: + +```php +// PostRepository.php + +public function related(): array +{ + return [ + 'user' => BelongsTo::make('user', UserRepository::class)->sortable('name'), + ]; +} +``` + +### Using custom sortable filter + +You can override the `sorts` method, and return an instance of `SortableFilter` that might be instructed to use a relationship: + +```php +// PostRepository +use Binaryk\LaravelRestify\Fields\BelongsTo; +use Binaryk\LaravelRestify\Filters\SortableFilter; + +public static function sorts(): array +{ + return [ + 'users.name' => SortableFilter::make() + ->setColumn('users.name') + ->usingRelation( + BelongsTo::make('user', 'user', UserRepository::class), + ) + ]; +} +``` + +Make sure that the column is fully qualified (include the table name). + +The request could look like: + +```http request +GET: /api/restify/posts?sort=-users.name +``` + +This will return all posts, sorted descending by users name. + + + +As you may notice we have typed twice the `users.name` (on the array key, and as argument in the `setColumn` method). As soon as you use the fully qualified key name, you can avoid the `setColumn` call, since the column will be injected automatically based on the `sorts` key. + + + +## Sort using closure + +If you have a quick sort method, you can use a closure to sort your data: + +```php +// PostRepository +use Binaryk\LaravelRestify\Http\Requests\RestifyRequest; + +public static function sorts(): array +{ + return [ + 'users.name' => function(RestifyRequest $request, $query, $direction) { + // custom sort + } + ]; +} +``` + +## Invokable Custom Sort Classes + +Alongside the already provided sorting mechanisms, you can also use an invokable class. This provides you with a flexible way to create your own custom sort logic using classes. + +### Basic Usage + +Such classes should implement the `__invoke` method, which will be called during sorting. Here's an example: + +```php +class NaturalSort { + public function __invoke(RestifyRequest $request, Builder $query, string $order, string $column): void + { + $query->orderBy($column, $order); + } +}; +``` + +You can then use it in your Repository's `sorts` method like this: + +```php +public static function sorts(): array +{ + return [ + 'name' => app(NaturalSort::class), + ]; +} +``` + +However, for even more convenience, you can also directly specify the invokable class name as a string: + +```php +PostRepository::$sort = [ + 'name' => NaturalSort::class, +]; +``` + +### Built-in Natural Sort Filter + +For those not looking to write their own sort filters, `binaryk/laravel-restify` already provides a built-in natural sort filter. This allows you to quickly sort fields in a natural order without additional implementations: + +```php +use Binaryk\LaravelRestify\Filters\Sorts\NaturalSortFilter; + +PostRepository::$sort = [ + 'name' => NaturalSortFilter::class, +]; +``` + +Using the `NaturalSortFilter` class, you can effortlessly apply natural sorting to your repository fields. + + +## Get available sorts + +You can use the following request to get sortable attributes for a repository: + +```http request +/api/restify/posts/filters?only=sortables +``` + + + +To get all filters, you can use `/api/restify/posts/filters?only=sortables,matches,searchables`. + + diff --git a/docs-v3/content/settings.json b/docs-v3/content/settings.json new file mode 100644 index 000000000..aa4d139e4 --- /dev/null +++ b/docs-v3/content/settings.json @@ -0,0 +1,11 @@ +{ + "title": "Laravel Restify", + "url": "https://restify.binarcode.com", + "logo": { + "light": "/icon.png", + "dark": "/icon.png" + }, + "github": "binarcode/laravel-restify", + "twitter": "LupacescuEuard", + "defaultBranch": "8.x" +} diff --git a/docs-v3/content/testing/testing.md b/docs-v3/content/testing/testing.md new file mode 100644 index 000000000..00161845e --- /dev/null +++ b/docs-v3/content/testing/testing.md @@ -0,0 +1,27 @@ +--- +title: Testing Repositories +menuTitle: Testing Repositories +description: Unlike traditional static method calls, repositories may be mocked. This provides a great advantage over traditional static methods and grants you the same testability you would have if you were using dependency injection. When testing, you may often want to mock a call to a Restify repository in one of your controllers. For example, consider the following controller action +category: Testing +position: 15 +--- + +```php +class ExampleTest extends TestCase +{ + public function testBasicTest() + { + UserRepository::partialMock() + ->shouldReceive('index') + ->andReturn(['data' => [],]); + + $this->withHeader('Accept', 'application/json') + ->get('/api/restify/users') + ->assertJsonStructure([ + 'response' => 'data', + ])->assertOk(); + } +} +``` + +So you can use the `partialMock` to get the partial mock instance of the repository, and then perform actions or expectations over it. diff --git a/docs-v3/layouts/default.vue b/docs-v3/layouts/default.vue new file mode 100644 index 000000000..2f99a7063 --- /dev/null +++ b/docs-v3/layouts/default.vue @@ -0,0 +1,41 @@ + + + \ No newline at end of file diff --git a/docs-v3/nuxt.config.ts b/docs-v3/nuxt.config.ts new file mode 100644 index 000000000..1f04ad241 --- /dev/null +++ b/docs-v3/nuxt.config.ts @@ -0,0 +1,77 @@ +export default defineNuxtConfig({ + devtools: { enabled: true }, + modules: [ + '@nuxt/content', + '@nuxtjs/tailwindcss', + '@nuxtjs/color-mode', + '@vueuse/nuxt' + ], + + // Content configuration + content: { + documentDriven: true, + navigation: { + fields: ['title', 'description', 'icon', 'category'] + }, + highlight: { + theme: { + default: 'github-light', + dark: 'github-dark' + }, + preload: ['php', 'bash', 'javascript', 'typescript', 'vue', 'json'] + }, + markdown: { + anchorLinks: false, + remarkPlugins: [], + rehypePlugins: [] + } + }, + + // CSS configuration + css: ['~/assets/css/main.css'], + + + // App configuration + app: { + head: { + title: 'Laravel Restify', + meta: [ + { charset: 'utf-8' }, + { name: 'viewport', content: 'width=device-width, initial-scale=1' }, + { hid: 'description', name: 'description', content: 'Laravel Restify Documentation - Build amazing REST APIs with Laravel' } + ], + link: [ + { rel: 'icon', type: 'image/png', href: '/icon.png' } + ], + script: [ + { + src: '//code.tidio.co/pgx3d8jlrufene0cnyv274lgege4u5c1.js', + async: true + } + ] + } + }, + + // Color mode configuration + colorMode: { + classSuffix: '' + }, + + // Tailwind configuration + tailwindcss: { + cssPath: '~/assets/css/main.css', + configPath: 'tailwind.config.js' + }, + + // TypeScript configuration + typescript: { + typeCheck: false + }, + + // Nitro configuration for static generation + nitro: { + prerender: { + routes: ['/sitemap.xml'] + } + } +}) \ No newline at end of file diff --git a/docs-v3/package-lock.json b/docs-v3/package-lock.json new file mode 100644 index 000000000..4f4b1c98e --- /dev/null +++ b/docs-v3/package-lock.json @@ -0,0 +1,14551 @@ +{ + "name": "laravel-restify-docs-v3", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "laravel-restify-docs-v3", + "version": "1.0.0", + "hasInstallScript": true, + "dependencies": { + "@nuxt/content": "^2.13.2", + "@nuxt/kit": "^3.13.2", + "@nuxtjs/color-mode": "^3.5.2", + "@nuxtjs/tailwindcss": "^6.12.1", + "@tailwindcss/typography": "^0.5.16", + "@vueuse/nuxt": "^11.1.0", + "nuxt": "^3.13.2", + "vue": "latest" + }, + "devDependencies": { + "@nuxt/devtools": "latest", + "@types/node": "^22.8.6", + "typescript": "^5.6.3", + "vue-tsc": "^2.2.12" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", + "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.3", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", + "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", + "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "dependencies": { + "@babel/types": "^7.28.2" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", + "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", + "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.2", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.0.tgz", + "integrity": "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==", + "dependencies": { + "mime": "^3.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@cloudflare/kv-asset-handler/node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@dependents/detective-less": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@dependents/detective-less/-/detective-less-5.0.1.tgz", + "integrity": "sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==", + "dependencies": { + "gonzales-pe": "^4.3.0", + "node-source-walk": "^7.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@emnapi/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", + "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", + "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@fastify/busboy": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.2.0.tgz", + "integrity": "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==" + }, + "node_modules/@ioredis/commands": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.3.1.tgz", + "integrity": "sha512-bYtU8avhGIcje3IhvF9aSjsa5URMZBHnwKtOvXsT4sfYy9gppW11gLPT/9oNqlJZD47yPKveQFTAFWpHjKvUoQ==" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@koa/router": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/@koa/router/-/router-12.0.2.tgz", + "integrity": "sha512-sYcHglGKTxGF+hQ6x67xDfkE9o+NhVlRHBqq6gLywaMc6CojK/5vFZByphdonKinYlMLkEkacm+HEse9HzwgTA==", + "dependencies": { + "debug": "^4.3.4", + "http-errors": "^2.0.0", + "koa-compose": "^4.1.0", + "methods": "^1.1.2", + "path-to-regexp": "^6.3.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.0.tgz", + "integrity": "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==", + "dependencies": { + "consola": "^3.2.3", + "detect-libc": "^2.0.0", + "https-proxy-agent": "^7.0.5", + "node-fetch": "^2.6.7", + "nopt": "^8.0.0", + "semver": "^7.5.3", + "tar": "^7.4.0" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@netlify/binary-info": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@netlify/binary-info/-/binary-info-1.0.0.tgz", + "integrity": "sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw==" + }, + "node_modules/@netlify/blobs": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@netlify/blobs/-/blobs-9.1.2.tgz", + "integrity": "sha512-7dMjExSH4zj4ShvLem49mE3mf0K171Tx2pV4WDWhJbRUWW3SJIR2qntz0LvUGS97N5HO1SmnzrgWUhEXCsApiw==", + "dependencies": { + "@netlify/dev-utils": "2.2.0", + "@netlify/runtime-utils": "1.3.1" + }, + "engines": { + "node": "^14.16.0 || >=16.0.0" + } + }, + "node_modules/@netlify/dev-utils": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@netlify/dev-utils/-/dev-utils-2.2.0.tgz", + "integrity": "sha512-5XUvZuffe3KetyhbWwd4n2ktd7wraocCYw10tlM+/u/95iAz29GjNiuNxbCD1T6Bn1MyGc4QLVNKOWhzJkVFAw==", + "dependencies": { + "@whatwg-node/server": "^0.9.60", + "chokidar": "^4.0.1", + "decache": "^4.6.2", + "dot-prop": "9.0.0", + "env-paths": "^3.0.0", + "find-up": "7.0.0", + "lodash.debounce": "^4.0.8", + "netlify": "^13.3.5", + "parse-gitignore": "^2.0.0", + "uuid": "^11.1.0", + "write-file-atomic": "^6.0.0" + }, + "engines": { + "node": "^14.16.0 || >=16.0.0" + } + }, + "node_modules/@netlify/functions": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@netlify/functions/-/functions-3.1.10.tgz", + "integrity": "sha512-sI93kcJ2cUoMgDRPnrEm0lZhuiDVDqM6ngS/UbHTApIH3+eg3yZM5p/0SDFQQq9Bad0/srFmgBmTdXushzY5kg==", + "dependencies": { + "@netlify/blobs": "9.1.2", + "@netlify/dev-utils": "2.2.0", + "@netlify/serverless-functions-api": "1.41.2", + "@netlify/zip-it-and-ship-it": "^12.1.0", + "cron-parser": "^4.9.0", + "decache": "^4.6.2", + "extract-zip": "^2.0.1", + "is-stream": "^4.0.1", + "jwt-decode": "^4.0.0", + "lambda-local": "^2.2.0", + "read-package-up": "^11.0.0", + "source-map-support": "^0.5.21" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@netlify/functions/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@netlify/open-api": { + "version": "2.37.0", + "resolved": "https://registry.npmjs.org/@netlify/open-api/-/open-api-2.37.0.tgz", + "integrity": "sha512-zXnRFkxgNsalSgU8/vwTWnav3R+8KG8SsqHxqaoJdjjJtnZR7wo3f+qqu4z+WtZ/4V7fly91HFUwZ6Uz2OdW7w==", + "engines": { + "node": ">=14.8.0" + } + }, + "node_modules/@netlify/runtime-utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@netlify/runtime-utils/-/runtime-utils-1.3.1.tgz", + "integrity": "sha512-7/vIJlMYrPJPlEW84V2yeRuG3QBu66dmlv9neTmZ5nXzwylhBEOhy11ai+34A8mHCSZI4mKns25w3HM9kaDdJg==", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@netlify/serverless-functions-api": { + "version": "1.41.2", + "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.41.2.tgz", + "integrity": "sha512-pfCkH50JV06SGMNsNPjn8t17hOcId4fA881HeYQgMBOrewjsw4csaYgHEnCxCEu24Y5x75E2ULbFpqm9CvRCqw==", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@netlify/zip-it-and-ship-it": { + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-12.2.1.tgz", + "integrity": "sha512-zAr+8Tg80y/sUbhdUkZsq4Uy1IMzkSB6H/sKRMrDQ2NJx4uPgf5X5jMdg9g2FljNcxzpfJwc1Gg4OXQrjD0Z4A==", + "dependencies": { + "@babel/parser": "^7.22.5", + "@babel/types": "7.28.0", + "@netlify/binary-info": "^1.0.0", + "@netlify/serverless-functions-api": "^2.1.3", + "@vercel/nft": "0.29.4", + "archiver": "^7.0.0", + "common-path-prefix": "^3.0.0", + "copy-file": "^11.0.0", + "es-module-lexer": "^1.0.0", + "esbuild": "0.25.5", + "execa": "^8.0.0", + "fast-glob": "^3.3.3", + "filter-obj": "^6.0.0", + "find-up": "^7.0.0", + "is-builtin-module": "^3.1.0", + "is-path-inside": "^4.0.0", + "junk": "^4.0.0", + "locate-path": "^7.0.0", + "merge-options": "^3.0.4", + "minimatch": "^9.0.0", + "normalize-path": "^3.0.0", + "p-map": "^7.0.0", + "path-exists": "^5.0.0", + "precinct": "^12.0.0", + "require-package-name": "^2.0.1", + "resolve": "^2.0.0-next.1", + "semver": "^7.3.8", + "tmp-promise": "^3.0.2", + "toml": "^3.0.0", + "unixify": "^1.0.0", + "urlpattern-polyfill": "8.0.2", + "yargs": "^17.0.0", + "zod": "^3.23.8" + }, + "bin": { + "zip-it-and-ship-it": "bin.js" + }, + "engines": { + "node": ">=18.14.0" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@babel/types": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.0.tgz", + "integrity": "sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/android-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/android-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/android-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/darwin-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/linux-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/linux-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/linux-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/linux-loong64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/linux-s390x": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/linux-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/sunos-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/win32-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/win32-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/win32-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/@netlify/serverless-functions-api": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-2.3.0.tgz", + "integrity": "sha512-eSC+glm4bX+9t+ajNzAs4Bca0Q/xGLgcYYh6M2Z9Dcya/MjVod1UrjPB88b0ANSBAy/aGFpDhVbwLwBokfnppQ==", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@netlify/zip-it-and-ship-it/node_modules/esbuild": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nuxt/cli": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/@nuxt/cli/-/cli-3.28.0.tgz", + "integrity": "sha512-WQ751WxWLBIeH3TDFt/LWQ2znyAKxpR5+gpv80oerwnVQs4GKajAfR6dIgExXZkjaPUHEFv2lVD9vM+frbprzw==", + "dependencies": { + "c12": "^3.2.0", + "citty": "^0.1.6", + "clipboardy": "^4.0.0", + "confbox": "^0.2.2", + "consola": "^3.4.2", + "defu": "^6.1.4", + "exsolve": "^1.0.7", + "fuse.js": "^7.1.0", + "get-port-please": "^3.2.0", + "giget": "^2.0.0", + "h3": "^1.15.4", + "httpxy": "^0.1.7", + "jiti": "^2.5.1", + "listhen": "^1.9.0", + "nypm": "^0.6.1", + "ofetch": "^1.4.1", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^1.0.0", + "pkg-types": "^2.2.0", + "scule": "^1.3.0", + "semver": "^7.7.2", + "std-env": "^3.9.0", + "tinyexec": "^1.0.1", + "ufo": "^1.6.1", + "youch": "^4.1.0-beta.11" + }, + "bin": { + "nuxi": "bin/nuxi.mjs", + "nuxi-ng": "bin/nuxi.mjs", + "nuxt": "bin/nuxi.mjs", + "nuxt-cli": "bin/nuxi.mjs" + }, + "engines": { + "node": "^16.10.0 || >=18.0.0" + } + }, + "node_modules/@nuxt/cli/node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==" + }, + "node_modules/@nuxt/cli/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/@nuxt/content": { + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/@nuxt/content/-/content-2.13.4.tgz", + "integrity": "sha512-NBaHL/SNYUK7+RLgOngSFmKqEPYc0dYdnwVFsxIdrOZUoUbD8ERJJDaoRwwtyYCMOgUeFA/zxAkuADytp+DKiQ==", + "dependencies": { + "@nuxt/kit": "^3.13.2", + "@nuxtjs/mdc": "^0.9.2", + "@vueuse/core": "^11.1.0", + "@vueuse/head": "^2.0.0", + "@vueuse/nuxt": "^11.1.0", + "consola": "^3.2.3", + "defu": "^6.1.4", + "destr": "^2.0.3", + "json5": "^2.2.3", + "knitwork": "^1.1.0", + "listhen": "^1.9.0", + "mdast-util-to-string": "^4.0.0", + "mdurl": "^2.0.0", + "micromark": "^4.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-types": "^2.0.0", + "minisearch": "^7.1.0", + "ohash": "^1.1.4", + "pathe": "^1.1.2", + "scule": "^1.3.0", + "shiki": "^1.22.0", + "slugify": "^1.6.6", + "socket.io-client": "^4.8.0", + "ufo": "^1.5.4", + "unist-util-stringify-position": "^4.0.0", + "unstorage": "^1.12.0", + "ws": "^8.18.0" + } + }, + "node_modules/@nuxt/devalue": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nuxt/devalue/-/devalue-2.0.2.tgz", + "integrity": "sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==" + }, + "node_modules/@nuxt/devtools": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@nuxt/devtools/-/devtools-2.6.3.tgz", + "integrity": "sha512-n+8we7pr0tNl6w+KfbFDXZsYpWIYL4vG/daIdRF66lQ6fLyQy/CcxDAx8+JNu3Ew96RjuBtWRSbCCv454L5p0Q==", + "dependencies": { + "@nuxt/devtools-kit": "2.6.3", + "@nuxt/devtools-wizard": "2.6.3", + "@nuxt/kit": "^3.18.1", + "@vue/devtools-core": "^7.7.7", + "@vue/devtools-kit": "^7.7.7", + "birpc": "^2.5.0", + "consola": "^3.4.2", + "destr": "^2.0.5", + "error-stack-parser-es": "^1.0.5", + "execa": "^8.0.1", + "fast-npm-meta": "^0.4.6", + "get-port-please": "^3.2.0", + "hookable": "^5.5.3", + "image-meta": "^0.2.1", + "is-installed-globally": "^1.0.0", + "launch-editor": "^2.11.1", + "local-pkg": "^1.1.2", + "magicast": "^0.3.5", + "nypm": "^0.6.1", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^1.0.0", + "pkg-types": "^2.3.0", + "semver": "^7.7.2", + "simple-git": "^3.28.0", + "sirv": "^3.0.1", + "structured-clone-es": "^1.0.0", + "tinyglobby": "^0.2.14", + "vite-plugin-inspect": "^11.3.2", + "vite-plugin-vue-tracer": "^1.0.0", + "which": "^5.0.0", + "ws": "^8.18.3" + }, + "bin": { + "devtools": "cli.mjs" + }, + "peerDependencies": { + "vite": ">=6.0" + } + }, + "node_modules/@nuxt/devtools-kit": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@nuxt/devtools-kit/-/devtools-kit-2.6.3.tgz", + "integrity": "sha512-cDmai3Ws6AbJlYy1p4CCwc718cfbqtAjXe6oEc6q03zoJnvX1PsvKUfmU+yuowfqTSR6DZRmH4SjCBWuMjgaKQ==", + "dependencies": { + "@nuxt/kit": "^3.18.1", + "execa": "^8.0.1" + }, + "peerDependencies": { + "vite": ">=6.0" + } + }, + "node_modules/@nuxt/devtools-wizard": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@nuxt/devtools-wizard/-/devtools-wizard-2.6.3.tgz", + "integrity": "sha512-FWXPkuJ1RUp+9nWP5Vvk29cJPNtm4OO38bgr9G8vGbqcRznzgaSODH/92c8sm2dKR7AF+9MAYLL+BexOWOkljQ==", + "dependencies": { + "consola": "^3.4.2", + "diff": "^8.0.2", + "execa": "^8.0.1", + "magicast": "^0.3.5", + "pathe": "^2.0.3", + "pkg-types": "^2.3.0", + "prompts": "^2.4.2", + "semver": "^7.7.2" + }, + "bin": { + "devtools-wizard": "cli.mjs" + } + }, + "node_modules/@nuxt/devtools-wizard/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/@nuxt/devtools/node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==" + }, + "node_modules/@nuxt/devtools/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/@nuxt/kit": { + "version": "3.18.1", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.18.1.tgz", + "integrity": "sha512-z6w1Fzv27CIKFlhct05rndkJSfoslplWH5fJ9dtusEvpYScLXp5cATWIbWkte9e9zFSmQTgDQJjNs3geQHE7og==", + "dependencies": { + "c12": "^3.2.0", + "consola": "^3.4.2", + "defu": "^6.1.4", + "destr": "^2.0.5", + "errx": "^0.1.0", + "exsolve": "^1.0.7", + "ignore": "^7.0.5", + "jiti": "^2.5.1", + "klona": "^2.0.6", + "knitwork": "^1.2.0", + "mlly": "^1.7.4", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "pkg-types": "^2.2.0", + "scule": "^1.3.0", + "semver": "^7.7.2", + "std-env": "^3.9.0", + "tinyglobby": "^0.2.14", + "ufo": "^1.6.1", + "unctx": "^2.4.1", + "unimport": "^5.2.0", + "untyped": "^2.0.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@nuxt/kit/node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==" + }, + "node_modules/@nuxt/kit/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/@nuxt/schema": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.17.5.tgz", + "integrity": "sha512-A1DSQk2uXqRHXlgLWDeFCyZk/yPo9oMBMb9OsbVko9NLv9du2DO2cs9RQ68Amvdk8O2nG7/FxAMNnkMdQ8OexA==", + "dependencies": { + "@vue/shared": "^3.5.16", + "consola": "^3.4.2", + "defu": "^6.1.4", + "pathe": "^2.0.3", + "std-env": "^3.9.0" + }, + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/@nuxt/schema/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/@nuxt/telemetry": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/@nuxt/telemetry/-/telemetry-2.6.6.tgz", + "integrity": "sha512-Zh4HJLjzvm3Cq9w6sfzIFyH9ozK5ePYVfCUzzUQNiZojFsI2k1QkSBrVI9BGc6ArKXj/O6rkI6w7qQ+ouL8Cag==", + "dependencies": { + "@nuxt/kit": "^3.15.4", + "citty": "^0.1.6", + "consola": "^3.4.2", + "destr": "^2.0.3", + "dotenv": "^16.4.7", + "git-url-parse": "^16.0.1", + "is-docker": "^3.0.0", + "ofetch": "^1.4.1", + "package-manager-detector": "^1.1.0", + "pathe": "^2.0.3", + "rc9": "^2.1.2", + "std-env": "^3.8.1" + }, + "bin": { + "nuxt-telemetry": "bin/nuxt-telemetry.mjs" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@nuxt/telemetry/node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/@nuxt/telemetry/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/@nuxt/vite-builder": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/@nuxt/vite-builder/-/vite-builder-3.17.5.tgz", + "integrity": "sha512-SKlm73FuuPj1ZdVJ1JQfUed/lO5l7iJMbM+9K+CMXnifu7vV2ITaSxu8uZ/ice1FeLYwOZKEsjnJXB0QpqDArQ==", + "dependencies": { + "@nuxt/kit": "3.17.5", + "@rollup/plugin-replace": "^6.0.2", + "@vitejs/plugin-vue": "^5.2.4", + "@vitejs/plugin-vue-jsx": "^4.2.0", + "autoprefixer": "^10.4.21", + "consola": "^3.4.2", + "cssnano": "^7.0.7", + "defu": "^6.1.4", + "esbuild": "^0.25.5", + "escape-string-regexp": "^5.0.0", + "exsolve": "^1.0.5", + "externality": "^1.0.2", + "get-port-please": "^3.1.2", + "h3": "^1.15.3", + "jiti": "^2.4.2", + "knitwork": "^1.2.0", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "mocked-exports": "^0.1.1", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^1.0.0", + "pkg-types": "^2.1.0", + "postcss": "^8.5.4", + "rollup-plugin-visualizer": "^6.0.1", + "std-env": "^3.9.0", + "ufo": "^1.6.1", + "unenv": "^2.0.0-rc.17", + "unplugin": "^2.3.5", + "vite": "^6.3.5", + "vite-node": "^3.2.0", + "vite-plugin-checker": "^0.9.3", + "vue-bundle-renderer": "^2.1.1" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0.0" + }, + "peerDependencies": { + "vue": "^3.3.4" + } + }, + "node_modules/@nuxt/vite-builder/node_modules/@nuxt/kit": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.17.5.tgz", + "integrity": "sha512-NdCepmA+S/SzgcaL3oYUeSlXGYO6BXGr9K/m1D0t0O9rApF8CSq/QQ+ja5KYaYMO1kZAEWH4s2XVcE3uPrrAVg==", + "dependencies": { + "c12": "^3.0.4", + "consola": "^3.4.2", + "defu": "^6.1.4", + "destr": "^2.0.5", + "errx": "^0.1.0", + "exsolve": "^1.0.5", + "ignore": "^7.0.5", + "jiti": "^2.4.2", + "klona": "^2.0.6", + "knitwork": "^1.2.0", + "mlly": "^1.7.4", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "pkg-types": "^2.1.0", + "scule": "^1.3.0", + "semver": "^7.7.2", + "std-env": "^3.9.0", + "tinyglobby": "^0.2.14", + "ufo": "^1.6.1", + "unctx": "^2.4.1", + "unimport": "^5.0.1", + "untyped": "^2.0.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@nuxt/vite-builder/node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==" + }, + "node_modules/@nuxt/vite-builder/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/@nuxtjs/color-mode": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@nuxtjs/color-mode/-/color-mode-3.5.2.tgz", + "integrity": "sha512-cC6RfgZh3guHBMLLjrBB2Uti5eUoGM9KyauOaYS9ETmxNWBMTvpgjvSiSJp1OFljIXPIqVTJ3xtJpSNZiO3ZaA==", + "dependencies": { + "@nuxt/kit": "^3.13.2", + "pathe": "^1.1.2", + "pkg-types": "^1.2.1", + "semver": "^7.6.3" + } + }, + "node_modules/@nuxtjs/color-mode/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==" + }, + "node_modules/@nuxtjs/color-mode/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/@nuxtjs/color-mode/node_modules/pkg-types/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/@nuxtjs/mdc": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@nuxtjs/mdc/-/mdc-0.9.5.tgz", + "integrity": "sha512-bTnlY+oiW8QsmrLoiYN+rkSYxl7asELlwYeU9QPSkun5BVx7Yd8RajH8I+0QJZiMZzIHaO3LEgf3lzp5Lg6E0A==", + "dependencies": { + "@nuxt/kit": "^3.14.1592", + "@shikijs/transformers": "^1.23.1", + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "@vue/compiler-core": "^3.5.13", + "consola": "^3.2.3", + "debug": "^4.3.7", + "defu": "^6.1.4", + "destr": "^2.0.3", + "detab": "^3.0.2", + "github-slugger": "^2.0.0", + "hast-util-to-string": "^3.0.1", + "mdast-util-to-hast": "^13.2.0", + "micromark-util-sanitize-uri": "^2.0.1", + "ohash": "^1.1.4", + "parse5": "^7.2.1", + "pathe": "^1.1.2", + "property-information": "^6.5.0", + "rehype-external-links": "^3.0.0", + "rehype-raw": "^7.0.0", + "rehype-slug": "^6.0.0", + "rehype-sort-attribute-values": "^5.0.1", + "rehype-sort-attributes": "^5.0.1", + "remark-emoji": "^5.0.1", + "remark-gfm": "^4.0.0", + "remark-mdc": "^3.4.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.1", + "scule": "^1.3.0", + "shiki": "^1.23.1", + "ufo": "^1.5.4", + "unified": "^11.0.5", + "unist-builder": "^4.0.0", + "unist-util-visit": "^5.0.0", + "unwasm": "^0.3.9", + "vfile": "^6.0.3" + } + }, + "node_modules/@nuxtjs/tailwindcss": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@nuxtjs/tailwindcss/-/tailwindcss-6.14.0.tgz", + "integrity": "sha512-30RyDK++LrUVRgc2A85MktGWIZoRQgeQKjE4CjjD64OXNozyl+4ScHnnYgqVToMM6Ch2ZG2W4wV2J0EN6F0zkQ==", + "dependencies": { + "@nuxt/kit": "^3.16.0", + "autoprefixer": "^10.4.20", + "c12": "^3.0.2", + "consola": "^3.4.0", + "defu": "^6.1.4", + "h3": "^1.15.1", + "klona": "^2.0.6", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "pkg-types": "^2.1.0", + "postcss": "^8.5.3", + "postcss-nesting": "^13.0.1", + "tailwind-config-viewer": "^2.0.4", + "tailwindcss": "~3.4.17", + "ufo": "^1.5.4", + "unctx": "^2.4.1" + } + }, + "node_modules/@nuxtjs/tailwindcss/node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==" + }, + "node_modules/@nuxtjs/tailwindcss/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/@oxc-parser/binding-darwin-arm64": { + "version": "0.72.3", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.72.3.tgz", + "integrity": "sha512-g6wgcfL7At4wHNHutl0NmPZTAju+cUSmSX5WGUMyTJmozRzhx8E9a2KL4rTqNJPwEpbCFrgC29qX9f4fpDnUpA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-parser/binding-darwin-x64": { + "version": "0.72.3", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.72.3.tgz", + "integrity": "sha512-pc+tplB2fd0AqdnXY90FguqSF2OwbxXwrMOLAMmsUiK4/ytr8Z/ftd49+d27GgvQJKeg2LfnIbskaQtY/j2tAA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-parser/binding-freebsd-x64": { + "version": "0.72.3", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.72.3.tgz", + "integrity": "sha512-igBR6rOvL8t5SBm1f1rjtWNsjB53HNrM3au582JpYzWxOqCjeA5Jlm9KZbjQJC+J8SPB9xyljM7G+6yGZ2UAkQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { + "version": "0.72.3", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.72.3.tgz", + "integrity": "sha512-/izdr3wg7bK+2RmNhZXC2fQwxbaTH3ELeqdR+Wg4FiEJ/C7ZBIjfB0E734bZGgbDu+rbEJTBlbG77XzY0wRX/Q==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm-musleabihf": { + "version": "0.72.3", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.72.3.tgz", + "integrity": "sha512-Vz7C+qJb22HIFl3zXMlwvlTOR+MaIp5ps78060zsdeZh2PUGlYuUYkYXtGEjJV3kc8aKFj79XKqAY1EPG2NWQA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm64-gnu": { + "version": "0.72.3", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.72.3.tgz", + "integrity": "sha512-nomoMe2VpVxW767jhF+G3mDGmE0U6nvvi5nw9Edqd/5DIylQfq/lEGUWL7qITk+E72YXBsnwHtpRRlIAJOMyZg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm64-musl": { + "version": "0.72.3", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.72.3.tgz", + "integrity": "sha512-4DswiIK5dI7hFqcMKWtZ7IZnWkRuskh6poI1ad4gkY2p678NOGtl6uOGCCRlDmLOOhp3R27u4VCTzQ6zra977w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-riscv64-gnu": { + "version": "0.72.3", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.72.3.tgz", + "integrity": "sha512-R9GEiA4WFPGU/3RxAhEd6SaMdpqongGTvGEyTvYCS/MAQyXKxX/LFvc2xwjdvESpjIemmc/12aTTq6if28vHkQ==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-s390x-gnu": { + "version": "0.72.3", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.72.3.tgz", + "integrity": "sha512-/sEYJQMVqikZO8gK9VDPT4zXo9du3gvvu8jp6erMmW5ev+14PErWRypJjktp0qoTj+uq4MzXro0tg7U+t5hP1w==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-x64-gnu": { + "version": "0.72.3", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.72.3.tgz", + "integrity": "sha512-hlyljEZ0sMPKJQCd5pxnRh2sAf/w+Ot2iJecgV9Hl3brrYrYCK2kofC0DFaJM3NRmG/8ZB3PlxnSRSKZTocwCw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-x64-musl": { + "version": "0.72.3", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.72.3.tgz", + "integrity": "sha512-T17S8ORqAIq+YDFMvLfbNdAiYHYDM1+sLMNhesR5eWBtyTHX510/NbgEvcNemO9N6BNR7m4A9o+q468UG+dmbg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-parser/binding-wasm32-wasi": { + "version": "0.72.3", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.72.3.tgz", + "integrity": "sha512-x0Ojn/jyRUk6MllvVB/puSvI2tczZBIYweKVYHNv1nBatjPRiqo+6/uXiKrZwSfGLkGARrKkTuHSa5RdZBMOdA==", + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.10" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-parser/binding-win32-arm64-msvc": { + "version": "0.72.3", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.72.3.tgz", + "integrity": "sha512-kRVAl87ugRjLZTm9vGUyiXU50mqxLPHY81rgnZUP1HtNcqcmTQtM/wUKQL2UdqvhA6xm6zciqzqCgJfU+RW8uA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-parser/binding-win32-x64-msvc": { + "version": "0.72.3", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.72.3.tgz", + "integrity": "sha512-vpVdoGAP5iGE5tIEPJgr7FkQJZA+sKjMkg5x1jarWJ1nnBamfGsfYiZum4QjCfW7jb+pl42rHVSS3lRmMPcyrQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.72.3", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.72.3.tgz", + "integrity": "sha512-CfAC4wrmMkUoISpQkFAIfMVvlPfQV3xg7ZlcqPXPOIMQhdKIId44G8W0mCPgtpWdFFAyJ+SFtiM+9vbyCkoVng==", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "hasInstallScript": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-wasm": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.5.1.tgz", + "integrity": "sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==", + "bundleDependencies": [ + "napi-wasm" + ], + "dependencies": { + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "napi-wasm": "^1.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-wasm/node_modules/napi-wasm": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==" + }, + "node_modules/@poppinss/colors": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.5.tgz", + "integrity": "sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==", + "dependencies": { + "kleur": "^4.1.5" + } + }, + "node_modules/@poppinss/colors/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@poppinss/dumper": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.4.tgz", + "integrity": "sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ==", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@sindresorhus/is": "^7.0.2", + "supports-color": "^10.0.0" + } + }, + "node_modules/@poppinss/dumper/node_modules/@sindresorhus/is": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.0.2.tgz", + "integrity": "sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@poppinss/dumper/node_modules/supports-color": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.0.tgz", + "integrity": "sha512-5eG9FQjEjDbAlI5+kdpdyPIBMRH4GfTVDGREVupaZHmVoppknhM29b/S9BkQz7cathp85BVgRi/As3Siln7e0Q==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@poppinss/exception": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.2.tgz", + "integrity": "sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==" + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.34.tgz", + "integrity": "sha512-LyAREkZHP5pMom7c24meKmJCdhf2hEyvam2q0unr3or9ydwDL+DJ8chTF6Av/RFPb3rH8UFBdMzO5MxTZW97oA==" + }, + "node_modules/@rollup/plugin-alias": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-5.1.1.tgz", + "integrity": "sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==", + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "28.0.6", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.6.tgz", + "integrity": "sha512-XSQB1K7FUU5QP+3lOQmVCE3I0FcbbNvmNT4VJSj93iUjayaARrTQeoRdiYQoftAJBLrR9t2agwAd3ekaTgHNlw==", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "fdir": "^6.2.0", + "is-reference": "1.2.1", + "magic-string": "^0.30.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=16.0.0 || 14 >= 14.17" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/plugin-inject": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", + "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", + "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.1.tgz", + "integrity": "sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve/node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.2.tgz", + "integrity": "sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.2.0.tgz", + "integrity": "sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.49.0.tgz", + "integrity": "sha512-rlKIeL854Ed0e09QGYFlmDNbka6I3EQFw7iZuugQjMb11KMpJCLPFL4ZPbMfaEhLADEL1yx0oujGkBQ7+qW3eA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.49.0.tgz", + "integrity": "sha512-cqPpZdKUSQYRtLLr6R4X3sD4jCBO1zUmeo3qrWBCqYIeH8Q3KRL4F3V7XJ2Rm8/RJOQBZuqzQGWPjjvFUcYa/w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.49.0.tgz", + "integrity": "sha512-99kMMSMQT7got6iYX3yyIiJfFndpojBmkHfTc1rIje8VbjhmqBXE+nb7ZZP3A5skLyujvT0eIUCUsxAe6NjWbw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.49.0.tgz", + "integrity": "sha512-y8cXoD3wdWUDpjOLMKLx6l+NFz3NlkWKcBCBfttUn+VGSfgsQ5o/yDUGtzE9HvsodkP0+16N0P4Ty1VuhtRUGg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.49.0.tgz", + "integrity": "sha512-3mY5Pr7qv4GS4ZvWoSP8zha8YoiqrU+e0ViPvB549jvliBbdNLrg2ywPGkgLC3cmvN8ya3za+Q2xVyT6z+vZqA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.49.0.tgz", + "integrity": "sha512-C9KzzOAQU5gU4kG8DTk+tjdKjpWhVWd5uVkinCwwFub2m7cDYLOdtXoMrExfeBmeRy9kBQMkiyJ+HULyF1yj9w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.49.0.tgz", + "integrity": "sha512-OVSQgEZDVLnTbMq5NBs6xkmz3AADByCWI4RdKSFNlDsYXdFtlxS59J+w+LippJe8KcmeSSM3ba+GlsM9+WwC1w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.49.0.tgz", + "integrity": "sha512-ZnfSFA7fDUHNa4P3VwAcfaBLakCbYaxCk0jUnS3dTou9P95kwoOLAMlT3WmEJDBCSrOEFFV0Y1HXiwfLYJuLlA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.49.0.tgz", + "integrity": "sha512-Z81u+gfrobVK2iV7GqZCBfEB1y6+I61AH466lNK+xy1jfqFLiQ9Qv716WUM5fxFrYxwC7ziVdZRU9qvGHkYIJg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.49.0.tgz", + "integrity": "sha512-zoAwS0KCXSnTp9NH/h9aamBAIve0DXeYpll85shf9NJ0URjSTzzS+Z9evmolN+ICfD3v8skKUPyk2PO0uGdFqg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.49.0.tgz", + "integrity": "sha512-2QyUyQQ1ZtwZGiq0nvODL+vLJBtciItC3/5cYN8ncDQcv5avrt2MbKt1XU/vFAJlLta5KujqyHdYtdag4YEjYQ==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.49.0.tgz", + "integrity": "sha512-k9aEmOWt+mrMuD3skjVJSSxHckJp+SiFzFG+v8JLXbc/xi9hv2icSkR3U7uQzqy+/QbbYY7iNB9eDTwrELo14g==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.49.0.tgz", + "integrity": "sha512-rDKRFFIWJ/zJn6uk2IdYLc09Z7zkE5IFIOWqpuU0o6ZpHcdniAyWkwSUWE/Z25N/wNDmFHHMzin84qW7Wzkjsw==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.49.0.tgz", + "integrity": "sha512-FkkhIY/hYFVnOzz1WeV3S9Bd1h0hda/gRqvZCMpHWDHdiIHn6pqsY3b5eSbvGccWHMQ1uUzgZTKS4oGpykf8Tw==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.49.0.tgz", + "integrity": "sha512-gRf5c+A7QiOG3UwLyOOtyJMD31JJhMjBvpfhAitPAoqZFcOeK3Kc1Veg1z/trmt+2P6F/biT02fU19GGTS529A==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.49.0.tgz", + "integrity": "sha512-BR7+blScdLW1h/2hB/2oXM+dhTmpW3rQt1DeSiCP9mc2NMMkqVgjIN3DDsNpKmezffGC9R8XKVOLmBkRUcK/sA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.49.0.tgz", + "integrity": "sha512-hDMOAe+6nX3V5ei1I7Au3wcr9h3ktKzDvF2ne5ovX8RZiAHEtX1A5SNNk4zt1Qt77CmnbqT+upb/umzoPMWiPg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.49.0.tgz", + "integrity": "sha512-wkNRzfiIGaElC9kXUT+HLx17z7D0jl+9tGYRKwd8r7cUqTL7GYAvgUY++U2hK6Ar7z5Z6IRRoWC8kQxpmM7TDA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.49.0.tgz", + "integrity": "sha512-gq5aW/SyNpjp71AAzroH37DtINDcX1Qw2iv9Chyz49ZgdOP3NV8QCyKZUrGsYX9Yyggj5soFiRCgsL3HwD8TdA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.49.0.tgz", + "integrity": "sha512-gEtqFbzmZLFk2xKh7g0Rlo8xzho8KrEFEkzvHbfUGkrgXOpZ4XagQ6n+wIZFNh1nTb8UD16J4nFSFKXYgnbdBg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.29.2.tgz", + "integrity": "sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==", + "dependencies": { + "@shikijs/engine-javascript": "1.29.2", + "@shikijs/engine-oniguruma": "1.29.2", + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.29.2.tgz", + "integrity": "sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==", + "dependencies": { + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "oniguruma-to-es": "^2.2.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz", + "integrity": "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==", + "dependencies": { + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1" + } + }, + "node_modules/@shikijs/langs": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-1.29.2.tgz", + "integrity": "sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==", + "dependencies": { + "@shikijs/types": "1.29.2" + } + }, + "node_modules/@shikijs/themes": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-1.29.2.tgz", + "integrity": "sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==", + "dependencies": { + "@shikijs/types": "1.29.2" + } + }, + "node_modules/@shikijs/transformers": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.29.2.tgz", + "integrity": "sha512-NHQuA+gM7zGuxGWP9/Ub4vpbwrYCrho9nQCLcCPfOe3Yc7LOYwmSuhElI688oiqIXk9dlZwDiyAG9vPBTuPJMA==", + "dependencies": { + "@shikijs/core": "1.29.2", + "@shikijs/types": "1.29.2" + } + }, + "node_modules/@shikijs/types": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz", + "integrity": "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" + }, + "node_modules/@speed-highlight/core": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.7.tgz", + "integrity": "sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==" + }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz", + "integrity": "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==", + "dependencies": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz", + "integrity": "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==" + }, + "node_modules/@types/node": { + "version": "22.18.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.0.tgz", + "integrity": "sha512-m5ObIqwsUp6BZzyiy4RdZpzWGub9bqLJMvZDD0QMXhxjqMHMENlj+SqF5QxoUwaQNFe+8kz8XM8ZQhqkQPTgMQ==", + "devOptional": true, + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" + }, + "node_modules/@types/parse-path": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@types/parse-path/-/parse-path-7.1.0.tgz", + "integrity": "sha512-EULJ8LApcVEPbrfND0cRQqutIOdiIgJ1Mgrhpy755r14xMohPTEpkV/k28SJvuOs9bHRFW8x+KeDAEPiGQPB9Q==", + "deprecated": "This is a stub types definition. parse-path provides its own type definitions, so you do not need this installed.", + "dependencies": { + "parse-path": "*" + } + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==" + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.41.0.tgz", + "integrity": "sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.41.0", + "@typescript-eslint/types": "^8.41.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.41.0.tgz", + "integrity": "sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.41.0.tgz", + "integrity": "sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.41.0.tgz", + "integrity": "sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==", + "dependencies": { + "@typescript-eslint/project-service": "8.41.0", + "@typescript-eslint/tsconfig-utils": "8.41.0", + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/visitor-keys": "8.41.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.41.0.tgz", + "integrity": "sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==", + "dependencies": { + "@typescript-eslint/types": "8.41.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==" + }, + "node_modules/@unhead/dom": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/@unhead/dom/-/dom-1.11.20.tgz", + "integrity": "sha512-jgfGYdOH+xHJF/j8gudjsYu3oIjFyXhCWcgKaw3vQnT616gSqyqnGQGOItL+BQtQZACKNISwIfx5PuOtztMKLA==", + "dependencies": { + "@unhead/schema": "1.11.20", + "@unhead/shared": "1.11.20" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/@unhead/schema": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/@unhead/schema/-/schema-1.11.20.tgz", + "integrity": "sha512-0zWykKAaJdm+/Y7yi/Yds20PrUK7XabLe9c3IRcjnwYmSWY6z0Cr19VIs3ozCj8P+GhR+/TI2mwtGlueCEYouA==", + "dependencies": { + "hookable": "^5.5.3", + "zhead": "^2.2.4" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/@unhead/shared": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/@unhead/shared/-/shared-1.11.20.tgz", + "integrity": "sha512-1MOrBkGgkUXS+sOKz/DBh4U20DNoITlJwpmvSInxEUNhghSNb56S0RnaHRq0iHkhrO/cDgz2zvfdlRpoPLGI3w==", + "dependencies": { + "@unhead/schema": "1.11.20", + "packrup": "^0.1.2" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/@unhead/ssr": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/@unhead/ssr/-/ssr-1.11.20.tgz", + "integrity": "sha512-j6ehzmdWGAvv0TEZyLE3WBnG1ULnsbKQcLqBDh3fvKS6b3xutcVZB7mjvrVE7ckSZt6WwOtG0ED3NJDS7IjzBA==", + "dependencies": { + "@unhead/schema": "1.11.20", + "@unhead/shared": "1.11.20" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/@unhead/vue": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-1.11.20.tgz", + "integrity": "sha512-sqQaLbwqY9TvLEGeq8Fd7+F2TIuV3nZ5ihVISHjWpAM3y7DwNWRU7NmT9+yYT+2/jw1Vjwdkv5/HvDnvCLrgmg==", + "dependencies": { + "@unhead/schema": "1.11.20", + "@unhead/shared": "1.11.20", + "hookable": "^5.5.3", + "unhead": "1.11.20" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + }, + "peerDependencies": { + "vue": ">=2.7 || >=3" + } + }, + "node_modules/@vercel/nft": { + "version": "0.29.4", + "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.29.4.tgz", + "integrity": "sha512-6lLqMNX3TuycBPABycx7A9F1bHQR7kiQln6abjFbPrf5C/05qHM9M5E4PeTE59c7z8g6vHnx1Ioihb2AQl7BTA==", + "dependencies": { + "@mapbox/node-pre-gyp": "^2.0.0", + "@rollup/pluginutils": "^5.1.3", + "acorn": "^8.6.0", + "acorn-import-attributes": "^1.9.5", + "async-sema": "^3.1.1", + "bindings": "^1.4.0", + "estree-walker": "2.0.2", + "glob": "^10.4.5", + "graceful-fs": "^4.2.9", + "node-gyp-build": "^4.2.2", + "picomatch": "^4.0.2", + "resolve-from": "^5.0.0" + }, + "bin": { + "nft": "out/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/nft/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-4.2.0.tgz", + "integrity": "sha512-DSTrmrdLp+0LDNF77fqrKfx7X0ErRbOcUAgJL/HbSesqQwoUvUQ4uYQqaex+rovqgGcoPqVk+AwUh3v9CuiYIw==", + "dependencies": { + "@babel/core": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1", + "@rolldown/pluginutils": "^1.0.0-beta.9", + "@vue/babel-plugin-jsx": "^1.4.0" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.15.tgz", + "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==", + "devOptional": true, + "dependencies": { + "@volar/source-map": "2.4.15" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.15.tgz", + "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==", + "devOptional": true + }, + "node_modules/@volar/typescript": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.15.tgz", + "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==", + "devOptional": true, + "dependencies": { + "@volar/language-core": "2.4.15", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue-macros/common": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-1.16.1.tgz", + "integrity": "sha512-Pn/AWMTjoMYuquepLZP813BIcq8DTZiNCoaceuNlvaYuOTd8DqBZWc5u0uOMQZMInwME1mdSmmBAcTluiV9Jtg==", + "dependencies": { + "@vue/compiler-sfc": "^3.5.13", + "ast-kit": "^1.4.0", + "local-pkg": "^1.0.0", + "magic-string-ast": "^0.7.0", + "pathe": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=16.14.0" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.2.25" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@vue-macros/common/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/@vue-macros/common/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz", + "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz", + "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.2", + "@vue/babel-helper-vue-transform-on": "1.5.0", + "@vue/babel-plugin-resolve-type": "1.5.0", + "@vue/shared": "^3.5.18" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz", + "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.0", + "@vue/compiler-sfc": "^3.5.18" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.20.tgz", + "integrity": "sha512-8TWXUyiqFd3GmP4JTX9hbiTFRwYHgVL/vr3cqhr4YQ258+9FADwvj7golk2sWNGHR67QgmCZ8gz80nQcMokhwg==", + "dependencies": { + "@babel/parser": "^7.28.3", + "@vue/shared": "3.5.20", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.20.tgz", + "integrity": "sha512-whB44M59XKjqUEYOMPYU0ijUV0G+4fdrHVKDe32abNdX/kJe1NUEMqsi4cwzXa9kyM9w5S8WqFsrfo1ogtBZGQ==", + "dependencies": { + "@vue/compiler-core": "3.5.20", + "@vue/shared": "3.5.20" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.20.tgz", + "integrity": "sha512-SFcxapQc0/feWiSBfkGsa1v4DOrnMAQSYuvDMpEaxbpH5dKbnEM5KobSNSgU+1MbHCl+9ftm7oQWxvwDB6iBfw==", + "dependencies": { + "@babel/parser": "^7.28.3", + "@vue/compiler-core": "3.5.20", + "@vue/compiler-dom": "3.5.20", + "@vue/compiler-ssr": "3.5.20", + "@vue/shared": "3.5.20", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.17", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.20.tgz", + "integrity": "sha512-RSl5XAMc5YFUXpDQi+UQDdVjH9FnEpLDHIALg5J0ITHxkEzJ8uQLlo7CIbjPYqmZtt6w0TsIPbo1izYXwDG7JA==", + "dependencies": { + "@vue/compiler-dom": "3.5.20", + "@vue/shared": "3.5.20" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "devOptional": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==" + }, + "node_modules/@vue/devtools-core": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.7.7.tgz", + "integrity": "sha512-9z9TLbfC+AjAi1PQyWX+OErjIaJmdFlbDHcD+cAMYKY6Bh5VlsAtCeGyRMrXwIlMEQPukvnWt3gZBLwTAIMKzQ==", + "dependencies": { + "@vue/devtools-kit": "^7.7.7", + "@vue/devtools-shared": "^7.7.7", + "mitt": "^3.0.1", + "nanoid": "^5.1.0", + "pathe": "^2.0.3", + "vite-hot-client": "^2.0.4" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vue/devtools-core/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz", + "integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==", + "dependencies": { + "@vue/devtools-shared": "^7.7.7", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz", + "integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/language-core": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.12.tgz", + "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==", + "devOptional": true, + "dependencies": { + "@volar/language-core": "2.4.15", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^1.0.3", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.20.tgz", + "integrity": "sha512-hS8l8x4cl1fmZpSQX/NXlqWKARqEsNmfkwOIYqtR2F616NGfsLUm0G6FQBK6uDKUCVyi1YOL8Xmt/RkZcd/jYQ==", + "dependencies": { + "@vue/shared": "3.5.20" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.20.tgz", + "integrity": "sha512-vyQRiH5uSZlOa+4I/t4Qw/SsD/gbth0SW2J7oMeVlMFMAmsG1rwDD6ok0VMmjXY3eI0iHNSSOBilEDW98PLRKw==", + "dependencies": { + "@vue/reactivity": "3.5.20", + "@vue/shared": "3.5.20" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.20.tgz", + "integrity": "sha512-KBHzPld/Djw3im0CQ7tGCpgRedryIn4CcAl047EhFTCCPT2xFf4e8j6WeKLgEEoqPSl9TYqShc3Q6tpWpz/Xgw==", + "dependencies": { + "@vue/reactivity": "3.5.20", + "@vue/runtime-core": "3.5.20", + "@vue/shared": "3.5.20", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.20.tgz", + "integrity": "sha512-HthAS0lZJDH21HFJBVNTtx+ULcIbJQRpjSVomVjfyPkFSpCwvsPTA+jIzOaUm3Hrqx36ozBHePztQFg6pj5aKg==", + "dependencies": { + "@vue/compiler-ssr": "3.5.20", + "@vue/shared": "3.5.20" + }, + "peerDependencies": { + "vue": "3.5.20" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.20.tgz", + "integrity": "sha512-SoRGP596KU/ig6TfgkCMbXkr4YJ91n/QSdMuqeP5r3hVIYA3CPHUBCc7Skak0EAKV+5lL4KyIh61VA/pK1CIAA==" + }, + "node_modules/@vueuse/core": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-11.3.0.tgz", + "integrity": "sha512-7OC4Rl1f9G8IT6rUfi9JrKiXy4bfmHhZ5x2Ceojy0jnd3mHNEvV4JaRygH362ror6/NZ+Nl+n13LPzGiPN8cKA==", + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "11.3.0", + "@vueuse/shared": "11.3.0", + "vue-demi": ">=0.14.10" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/head": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@vueuse/head/-/head-2.0.0.tgz", + "integrity": "sha512-ykdOxTGs95xjD4WXE4na/umxZea2Itl0GWBILas+O4oqS7eXIods38INvk3XkJKjqMdWPcpCyLX/DioLQxU1KA==", + "dependencies": { + "@unhead/dom": "^1.7.0", + "@unhead/schema": "^1.7.0", + "@unhead/ssr": "^1.7.0", + "@unhead/vue": "^1.7.0" + }, + "peerDependencies": { + "vue": ">=2.7 || >=3" + } + }, + "node_modules/@vueuse/metadata": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-11.3.0.tgz", + "integrity": "sha512-pwDnDspTqtTo2HwfLw4Rp6yywuuBdYnPYDq+mO38ZYKGebCUQC/nVj/PXSiK9HX5otxLz8Fn7ECPbjiRz2CC3g==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/nuxt": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/nuxt/-/nuxt-11.3.0.tgz", + "integrity": "sha512-FxtRTgFmsoASamR3lOftv/r11o1BojF9zir8obbTnKamVZdlQ5rgJ0hHgVbrgA6dlMuEx/PzwqAmiKNFdU4oCQ==", + "dependencies": { + "@nuxt/kit": "^3.14.1592", + "@vueuse/core": "11.3.0", + "@vueuse/metadata": "11.3.0", + "local-pkg": "^0.5.1", + "vue-demi": ">=0.14.10" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "nuxt": "^3.0.0" + } + }, + "node_modules/@vueuse/nuxt/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==" + }, + "node_modules/@vueuse/nuxt/node_modules/local-pkg": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", + "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", + "dependencies": { + "mlly": "^1.7.3", + "pkg-types": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/nuxt/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/@vueuse/nuxt/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/@vueuse/nuxt/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/shared": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-11.3.0.tgz", + "integrity": "sha512-P8gSSWQeucH5821ek2mn/ciCk+MS/zoRKqdQIM3bHq6p7GXDAJLmnRRKmF5F65sAVJIfzQlwR3aDzwCn10s8hA==", + "dependencies": { + "vue-demi": ">=0.14.10" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@whatwg-node/disposablestack": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@whatwg-node/disposablestack/-/disposablestack-0.0.6.tgz", + "integrity": "sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==", + "dependencies": { + "@whatwg-node/promise-helpers": "^1.0.0", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@whatwg-node/fetch": { + "version": "0.10.10", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.10.10.tgz", + "integrity": "sha512-watz4i/Vv4HpoJ+GranJ7HH75Pf+OkPQ63NoVmru6Srgc8VezTArB00i/oQlnn0KWh14gM42F22Qcc9SU9mo/w==", + "dependencies": { + "@whatwg-node/node-fetch": "^0.7.25", + "urlpattern-polyfill": "^10.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@whatwg-node/fetch/node_modules/urlpattern-polyfill": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", + "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==" + }, + "node_modules/@whatwg-node/node-fetch": { + "version": "0.7.25", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.7.25.tgz", + "integrity": "sha512-szCTESNJV+Xd56zU6ShOi/JWROxE9IwCic8o5D9z5QECZloas6Ez5tUuKqXTAdu6fHFx1t6C+5gwj8smzOLjtg==", + "dependencies": { + "@fastify/busboy": "^3.1.1", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/promise-helpers": "^1.3.2", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@whatwg-node/promise-helpers": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@whatwg-node/promise-helpers/-/promise-helpers-1.3.2.tgz", + "integrity": "sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==", + "dependencies": { + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@whatwg-node/server": { + "version": "0.9.71", + "resolved": "https://registry.npmjs.org/@whatwg-node/server/-/server-0.9.71.tgz", + "integrity": "sha512-ueFCcIPaMgtuYDS9u0qlUoEvj6GiSsKrwnOLPp9SshqjtcRaR1IEHRjoReq3sXNydsF5i0ZnmuYgXq9dV53t0g==", + "dependencies": { + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/fetch": "^0.10.5", + "@whatwg-node/promise-helpers": "^1.2.2", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/alien-signals": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", + "devOptional": true + }, + "node_modules/ansi-regex": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", + "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.1.0.tgz", + "integrity": "sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==", + "engines": { + "node": ">=14" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "dependencies": { + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "dependencies": { + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/ast-kit": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-1.4.3.tgz", + "integrity": "sha512-MdJqjpodkS5J149zN0Po+HPshkTdUyrvF7CKTafUgv69vBSPtncrj+3IiUgqdd7ElIEkbeXCsEouBUwLrw9Ilg==", + "dependencies": { + "@babel/parser": "^7.27.0", + "pathe": "^2.0.3" + }, + "engines": { + "node": ">=16.14.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/ast-kit/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/ast-module-types": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-6.0.1.tgz", + "integrity": "sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA==", + "engines": { + "node": ">=18" + } + }, + "node_modules/ast-walker-scope": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.6.2.tgz", + "integrity": "sha512-1UWOyC50xI3QZkRuDj6PqDtpm1oHWtYs+NQGwqL/2R11eN3Q81PHAHPM0SWW3BNQm53UDwS//Jv8L4CCVLM1bQ==", + "dependencies": { + "@babel/parser": "^7.25.3", + "ast-kit": "^1.0.1" + }, + "engines": { + "node": ">=16.14.0" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + }, + "node_modules/async-sema": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", + "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bare-events": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.6.1.tgz", + "integrity": "sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==", + "optional": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/birpc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.5.0.tgz", + "integrity": "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.25.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz", + "integrity": "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001737", + "electron-to-chromium": "^1.5.211", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/c12": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/c12/-/c12-3.2.0.tgz", + "integrity": "sha512-ixkEtbYafL56E6HiFuonMm1ZjoKtIo7TH68/uiEq4DAwv9NcUX2nJ95F8TrbMeNjqIkZpruo3ojXQJ+MGG5gcQ==", + "dependencies": { + "chokidar": "^4.0.3", + "confbox": "^0.2.2", + "defu": "^6.1.4", + "dotenv": "^17.2.1", + "exsolve": "^1.0.7", + "giget": "^2.0.0", + "jiti": "^2.5.1", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^1.0.0", + "pkg-types": "^2.2.0", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "^0.3.5" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/c12/node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==" + }, + "node_modules/c12/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "dependencies": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/cache-content-type/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cache-content-type/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", + "engines": { + "node": "*" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001737", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001737.tgz", + "integrity": "sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "engines": { + "node": ">=18" + } + }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/clipboardy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz", + "integrity": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==", + "dependencies": { + "execa": "^8.0.1", + "is-wsl": "^3.1.0", + "is64bit": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "node_modules/compatx": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/compatx/-/compatx-0.2.0.tgz", + "integrity": "sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==" + }, + "node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/compress-commons/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "engines": { + "node": ">=18" + } + }, + "node_modules/cookie-es": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==" + }, + "node_modules/cookies": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", + "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", + "dependencies": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-file": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/copy-file/-/copy-file-11.1.0.tgz", + "integrity": "sha512-X8XDzyvYaA6msMyAM575CUoygY5b44QzLcGRKsK3MFmXcOvQa518dNPLsKYwkYsn72g3EiW+LE0ytd/FlqWmyw==", + "dependencies": { + "graceful-fs": "^4.2.11", + "p-event": "^6.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/cron-parser": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", + "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", + "dependencies": { + "luxon": "^3.2.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/croner": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/croner/-/croner-9.1.0.tgz", + "integrity": "sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==", + "engines": { + "node": ">=18.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.1.1.tgz", + "integrity": "sha512-fm4D8ti0dQmFPeF8DXSAA//btEmqCOgAc/9Oa3C1LW94h5usNrJEfrON7b4FkPZgnDEn6OUs5NdxiJZmAtGOpQ==", + "dependencies": { + "cssnano-preset-default": "^7.0.9", + "lilconfig": "^3.1.3" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/cssnano-preset-default": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.9.tgz", + "integrity": "sha512-tCD6AAFgYBOVpMBX41KjbvRh9c2uUjLXRyV7KHSIrwHiq5Z9o0TFfUCoM3TwVrRsRteN3sVXGNvjVNxYzkpTsA==", + "dependencies": { + "browserslist": "^4.25.1", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^5.0.1", + "postcss-calc": "^10.1.1", + "postcss-colormin": "^7.0.4", + "postcss-convert-values": "^7.0.7", + "postcss-discard-comments": "^7.0.4", + "postcss-discard-duplicates": "^7.0.2", + "postcss-discard-empty": "^7.0.1", + "postcss-discard-overridden": "^7.0.1", + "postcss-merge-longhand": "^7.0.5", + "postcss-merge-rules": "^7.0.6", + "postcss-minify-font-values": "^7.0.1", + "postcss-minify-gradients": "^7.0.1", + "postcss-minify-params": "^7.0.4", + "postcss-minify-selectors": "^7.0.5", + "postcss-normalize-charset": "^7.0.1", + "postcss-normalize-display-values": "^7.0.1", + "postcss-normalize-positions": "^7.0.1", + "postcss-normalize-repeat-style": "^7.0.1", + "postcss-normalize-string": "^7.0.1", + "postcss-normalize-timing-functions": "^7.0.1", + "postcss-normalize-unicode": "^7.0.4", + "postcss-normalize-url": "^7.0.1", + "postcss-normalize-whitespace": "^7.0.1", + "postcss-ordered-values": "^7.0.2", + "postcss-reduce-initial": "^7.0.4", + "postcss-reduce-transforms": "^7.0.1", + "postcss-svgo": "^7.1.0", + "postcss-unique-selectors": "^7.0.4" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/cssnano-utils": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.1.tgz", + "integrity": "sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/db0": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/db0/-/db0-0.3.2.tgz", + "integrity": "sha512-xzWNQ6jk/+NtdfLyXEipbX55dmDSeteLFt/ayF+wZUU5bzKgmrDOxmInUTbyVRp46YwnJdkDA1KhB7WIXFofJw==", + "peerDependencies": { + "@electric-sql/pglite": "*", + "@libsql/client": "*", + "better-sqlite3": "*", + "drizzle-orm": "*", + "mysql2": "*", + "sqlite3": "*" + }, + "peerDependenciesMeta": { + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "drizzle-orm": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "sqlite3": { + "optional": true + } + } + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "devOptional": true + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decache": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/decache/-/decache-4.6.2.tgz", + "integrity": "sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==", + "dependencies": { + "callsite": "^1.0.0" + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==" + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==" + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detab": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/detab/-/detab-3.0.2.tgz", + "integrity": "sha512-7Bp16Bk8sk0Y6gdXiCtnpGbghn8atnTJdd/82aWvS5ESnlcNvgUc10U2NYS0PAiDSGjWiI8qs/Cv1b2uSGdQ8w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detective-amd": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-6.0.1.tgz", + "integrity": "sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g==", + "dependencies": { + "ast-module-types": "^6.0.1", + "escodegen": "^2.1.0", + "get-amd-module-type": "^6.0.1", + "node-source-walk": "^7.0.1" + }, + "bin": { + "detective-amd": "bin/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/detective-cjs": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/detective-cjs/-/detective-cjs-6.0.1.tgz", + "integrity": "sha512-tLTQsWvd2WMcmn/60T2inEJNhJoi7a//PQ7DwRKEj1yEeiQs4mrONgsUtEJKnZmrGWBBmE0kJ1vqOG/NAxwaJw==", + "dependencies": { + "ast-module-types": "^6.0.1", + "node-source-walk": "^7.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/detective-es6": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-5.0.1.tgz", + "integrity": "sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew==", + "dependencies": { + "node-source-walk": "^7.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/detective-postcss": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-7.0.1.tgz", + "integrity": "sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ==", + "dependencies": { + "is-url": "^1.2.4", + "postcss-values-parser": "^6.0.2" + }, + "engines": { + "node": "^14.0.0 || >=16.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.47" + } + }, + "node_modules/detective-sass": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/detective-sass/-/detective-sass-6.0.1.tgz", + "integrity": "sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw==", + "dependencies": { + "gonzales-pe": "^4.3.0", + "node-source-walk": "^7.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/detective-scss": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/detective-scss/-/detective-scss-5.0.1.tgz", + "integrity": "sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg==", + "dependencies": { + "gonzales-pe": "^4.3.0", + "node-source-walk": "^7.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/detective-stylus": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/detective-stylus/-/detective-stylus-5.0.1.tgz", + "integrity": "sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA==", + "engines": { + "node": ">=18" + } + }, + "node_modules/detective-typescript": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-14.0.0.tgz", + "integrity": "sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw==", + "dependencies": { + "@typescript-eslint/typescript-estree": "^8.23.0", + "ast-module-types": "^6.0.1", + "node-source-walk": "^7.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "typescript": "^5.4.4" + } + }, + "node_modules/detective-vue2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/detective-vue2/-/detective-vue2-2.2.0.tgz", + "integrity": "sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA==", + "dependencies": { + "@dependents/detective-less": "^5.0.1", + "@vue/compiler-sfc": "^3.5.13", + "detective-es6": "^5.0.1", + "detective-sass": "^6.0.1", + "detective-scss": "^5.0.1", + "detective-stylus": "^5.0.1", + "detective-typescript": "^14.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "typescript": "^5.4.4" + } + }, + "node_modules/devalue": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.3.2.tgz", + "integrity": "sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/diff": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", + "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-prop": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz", + "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==", + "dependencies": { + "type-fest": "^4.18.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dotenv": { + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.1.tgz", + "integrity": "sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.211", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.211.tgz", + "integrity": "sha512-IGBvimJkotaLzFnwIVgW9/UD/AOJ2tByUmeOrtqBfACSbAw5b1G0XpvdaieKyc7ULmbwXVx+4e4Be8pOPBrYkw==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==" + }, + "node_modules/emoticon": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/engine.io-client": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz", + "integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/errx": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/errx/-/errx-0.1.0.tgz", + "integrity": "sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q==" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exsolve": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", + "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/externality": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/externality/-/externality-1.0.2.tgz", + "integrity": "sha512-LyExtJWKxtgVzmgtEHyQtLFpw1KFhQphF9nTG8TpAIVkiI/xQ3FJh75tRFLYl4hkn7BNIIdLJInuDAavX35pMw==", + "dependencies": { + "enhanced-resolve": "^5.14.1", + "mlly": "^1.3.0", + "pathe": "^1.1.1", + "ufo": "^1.1.2" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-npm-meta": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/fast-npm-meta/-/fast-npm-meta-0.4.6.tgz", + "integrity": "sha512-zbBBOAOlzxfrU4WSnbCHk/nR6Vf32lSEPxDEvNOR08Z5DSZ/A6qJu0rqrHVcexBTd1hc2gim998xnqF/R1PuEw==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/filter-obj": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-6.1.0.tgz", + "integrity": "sha512-xdMtCAODmPloU9qtmPcdBV9Kd27NtMse+4ayThxqIHUES5Z2S6bGpap5PpdmNM56ub7y3i1eyr+vJJIIgWGKmA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", + "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", + "dependencies": { + "locate-path": "^7.2.0", + "path-exists": "^5.0.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-6.0.1.tgz", + "integrity": "sha512-/3FfIa8mbrg3xE7+wAhWeV+bd7L2Mof+xtZb5dRDKZ+wDvYJK4WDYeIOuOhre5Yv5aQObZrlbRmk3RTSiuQBtw==", + "bin": { + "flat": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuse.js": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.1.0.tgz", + "integrity": "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-amd-module-type": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-6.0.1.tgz", + "integrity": "sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ==", + "dependencies": { + "ast-module-types": "^6.0.1", + "node-source-walk": "^7.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port-please": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.2.0.tgz", + "integrity": "sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/giget": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", + "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.0", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.6", + "nypm": "^0.6.0", + "pathe": "^2.0.3" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/giget/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/git-up": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-8.1.1.tgz", + "integrity": "sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==", + "dependencies": { + "is-ssh": "^1.4.0", + "parse-url": "^9.2.0" + } + }, + "node_modules/git-url-parse": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-16.1.0.tgz", + "integrity": "sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==", + "dependencies": { + "git-up": "^8.1.0" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "dependencies": { + "ini": "4.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gonzales-pe": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", + "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "gonzales": "bin/gonzales.js" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/gzip-size": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-7.0.0.tgz", + "integrity": "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/h3": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.4.tgz", + "integrity": "sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==", + "dependencies": { + "cookie-es": "^1.2.2", + "crossws": "^0.3.5", + "defu": "^6.1.4", + "destr": "^2.0.5", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.2", + "radix3": "^1.1.2", + "ufo": "^1.6.1", + "uncrypto": "^0.1.3" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-heading-rank": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz", + "integrity": "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html/node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-string": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript/node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "devOptional": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==" + }, + "node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/http-assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", + "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", + "dependencies": { + "deep-equal": "~1.0.1", + "http-errors": "~1.8.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-assert/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-assert/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-assert/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-shutdown": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/http-shutdown/-/http-shutdown-1.2.2.tgz", + "integrity": "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/httpxy": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/httpxy/-/httpxy-0.1.7.tgz", + "integrity": "sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ==" + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-meta": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/image-meta/-/image-meta-0.2.1.tgz", + "integrity": "sha512-K6acvFaelNxx8wc2VjbIzXKDVB0Khs0QT35U6NkGfTdCmjLNcO2945m7RFNR9/RPVFm48hq7QPzK8uGH18HCGw==" + }, + "node_modules/impound": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/impound/-/impound-1.0.0.tgz", + "integrity": "sha512-8lAJ+1Arw2sMaZ9HE2ZmL5zOcMnt18s6+7Xqgq2aUVy4P1nlzAyPtzCDxsk51KVFwHEEdc6OWvUyqwHwhRYaug==", + "dependencies": { + "exsolve": "^1.0.5", + "mocked-exports": "^0.1.1", + "pathe": "^2.0.3", + "unplugin": "^2.3.2", + "unplugin-utils": "^0.2.4" + } + }, + "node_modules/impound/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/index-to-position": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.1.0.tgz", + "integrity": "sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ioredis": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.7.0.tgz", + "integrity": "sha512-NUcA93i1lukyXU+riqEyPtSEkyFq8tX90uL659J+qpCZ3rEdViB/APC58oAhIh3+bJln2hzdlZbBZsGNrlsR8g==", + "dependencies": { + "@ioredis/commands": "^1.3.0", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", + "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", + "dependencies": { + "global-directory": "^4.0.1", + "is-path-inside": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ssh": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", + "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", + "dependencies": { + "protocols": "^2.0.1" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "node_modules/is-url-superb": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-4.0.0.tgz", + "integrity": "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is64bit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is64bit/-/is64bit-2.0.0.tgz", + "integrity": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==", + "dependencies": { + "system-architecture": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz", + "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/junk": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/junk/-/junk-4.0.1.tgz", + "integrity": "sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jwt-decode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "engines": { + "node": ">=18" + } + }, + "node_modules/keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "dependencies": { + "tsscmp": "1.0.6" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/knitwork": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/knitwork/-/knitwork-1.2.0.tgz", + "integrity": "sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==" + }, + "node_modules/koa": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.16.2.tgz", + "integrity": "sha512-+CCssgnrWKx9aI3OeZwroa/ckG4JICxvIFnSiOUyl2Uv+UTI+xIw0FfFrWS7cQFpoePpr9o8csss7KzsTzNL8Q==", + "dependencies": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.9.0", + "debug": "^4.3.2", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^2.0.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "engines": { + "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" + } + }, + "node_modules/koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" + }, + "node_modules/koa-convert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", + "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", + "dependencies": { + "co": "^4.6.0", + "koa-compose": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/koa-send": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", + "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", + "dependencies": { + "debug": "^4.1.1", + "http-errors": "^1.7.3", + "resolve-path": "^1.4.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/koa-send/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa-send/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa-send/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa-static": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", + "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", + "dependencies": { + "debug": "^3.1.0", + "koa-send": "^5.0.0" + }, + "engines": { + "node": ">= 7.6.0" + } + }, + "node_modules/koa-static/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/koa/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/koa/node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, + "node_modules/lambda-local": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/lambda-local/-/lambda-local-2.2.0.tgz", + "integrity": "sha512-bPcgpIXbHnVGfI/omZIlgucDqlf4LrsunwoKue5JdZeGybt8L6KyJz2Zu19ffuZwIwLj2NAI2ZyaqNT6/cetcg==", + "dependencies": { + "commander": "^10.0.1", + "dotenv": "^16.3.1", + "winston": "^3.10.0" + }, + "bin": { + "lambda-local": "build/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lambda-local/node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/launch-editor": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", + "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/listhen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/listhen/-/listhen-1.9.0.tgz", + "integrity": "sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==", + "dependencies": { + "@parcel/watcher": "^2.4.1", + "@parcel/watcher-wasm": "^2.4.1", + "citty": "^0.1.6", + "clipboardy": "^4.0.0", + "consola": "^3.2.3", + "crossws": ">=0.2.0 <0.4.0", + "defu": "^6.1.4", + "get-port-please": "^3.1.2", + "h3": "^1.12.0", + "http-shutdown": "^1.2.2", + "jiti": "^2.1.2", + "mlly": "^1.7.1", + "node-forge": "^1.3.1", + "pathe": "^1.1.2", + "std-env": "^3.7.0", + "ufo": "^1.5.4", + "untun": "^0.1.3", + "uqr": "^0.1.2" + }, + "bin": { + "listen": "bin/listhen.mjs", + "listhen": "bin/listhen.mjs" + } + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/luxon": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.1.tgz", + "integrity": "sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/magic-string": { + "version": "0.30.18", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", + "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magic-string-ast": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-0.7.1.tgz", + "integrity": "sha512-ub9iytsEbT7Yw/Pd29mSo/cNQpaEu67zR1VVcXDiYjSFwzeBxNdTd0FMnSslLQXiRj8uGPzwsaoefrMD5XAmdw==", + "dependencies": { + "magic-string": "^0.30.17" + }, + "engines": { + "node": ">=16.14.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==" + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-options": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", + "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", + "dependencies": { + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micro-api-client": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/micro-api-client/-/micro-api-client-3.3.0.tgz", + "integrity": "sha512-y0y6CUB9RLVsy3kfgayU28746QrNMpSm9O/AYGNsBgOkJr/X/Jk0VLGoO8Ude7Bpa8adywzF+MzXNZRFRsNPhg==" + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.7.tgz", + "integrity": "sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ==", + "funding": [ + "https://github.com/sponsors/broofa" + ], + "bin": { + "mime": "bin/cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minisearch": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.1.2.tgz", + "integrity": "sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA==" + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==" + }, + "node_modules/mlly/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/mocked-exports": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/mocked-exports/-/mocked-exports-0.1.1.tgz", + "integrity": "sha512-aF7yRQr/Q0O2/4pIXm6PZ5G+jAd7QS4Yu8m+WEeEHGnbo+7mE36CbLSDQiXYV8bVL3NfmdeqPJct0tUlnjVSnA==" + }, + "node_modules/module-definition": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/module-definition/-/module-definition-6.0.1.tgz", + "integrity": "sha512-FeVc50FTfVVQnolk/WQT8MX+2WVcDnTGiq6Wo+/+lJ2ET1bRVi3HG3YlJUfqagNMc/kUlFSoR96AJkxGpKz13g==", + "dependencies": { + "ast-module-types": "^6.0.1", + "node-source-walk": "^7.0.1" + }, + "bin": { + "module-definition": "bin/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "devOptional": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", + "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/nanotar": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nanotar/-/nanotar-0.2.0.tgz", + "integrity": "sha512-9ca1h0Xjvo9bEkE4UOxgAzLV0jHKe6LMaxo37ND2DAhhAtd0j8pR1Wxz+/goMrZO8AEZTWCmyaOsFI/W5AdpCQ==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/netlify": { + "version": "13.3.5", + "resolved": "https://registry.npmjs.org/netlify/-/netlify-13.3.5.tgz", + "integrity": "sha512-Nc3loyVASW59W+8fLDZT1lncpG7llffyZ2o0UQLx/Fr20i7P8oP+lE7+TEcFvXj9IUWU6LjB9P3BH+iFGyp+mg==", + "dependencies": { + "@netlify/open-api": "^2.37.0", + "lodash-es": "^4.17.21", + "micro-api-client": "^3.3.0", + "node-fetch": "^3.0.0", + "p-wait-for": "^5.0.0", + "qs": "^6.9.6" + }, + "engines": { + "node": "^14.16.0 || >=16.0.0" + } + }, + "node_modules/netlify/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/nitropack": { + "version": "2.12.4", + "resolved": "https://registry.npmjs.org/nitropack/-/nitropack-2.12.4.tgz", + "integrity": "sha512-MPmPRJWTeH03f/NmpN4q3iI3Woik4uaaWIoX34W3gMJiW06Vm1te/lPzuu5EXpXOK7Q2m3FymGMPXcExqih96Q==", + "dependencies": { + "@cloudflare/kv-asset-handler": "^0.4.0", + "@netlify/functions": "^3.1.10", + "@rollup/plugin-alias": "^5.1.1", + "@rollup/plugin-commonjs": "^28.0.6", + "@rollup/plugin-inject": "^5.0.5", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^16.0.1", + "@rollup/plugin-replace": "^6.0.2", + "@rollup/plugin-terser": "^0.4.4", + "@vercel/nft": "^0.29.4", + "archiver": "^7.0.1", + "c12": "^3.1.0", + "chokidar": "^4.0.3", + "citty": "^0.1.6", + "compatx": "^0.2.0", + "confbox": "^0.2.2", + "consola": "^3.4.2", + "cookie-es": "^2.0.0", + "croner": "^9.1.0", + "crossws": "^0.3.5", + "db0": "^0.3.2", + "defu": "^6.1.4", + "destr": "^2.0.5", + "dot-prop": "^9.0.0", + "esbuild": "^0.25.6", + "escape-string-regexp": "^5.0.0", + "etag": "^1.8.1", + "exsolve": "^1.0.7", + "globby": "^14.1.0", + "gzip-size": "^7.0.0", + "h3": "^1.15.3", + "hookable": "^5.5.3", + "httpxy": "^0.1.7", + "ioredis": "^5.6.1", + "jiti": "^2.4.2", + "klona": "^2.0.6", + "knitwork": "^1.2.0", + "listhen": "^1.9.0", + "magic-string": "^0.30.17", + "magicast": "^0.3.5", + "mime": "^4.0.7", + "mlly": "^1.7.4", + "node-fetch-native": "^1.6.6", + "node-mock-http": "^1.0.1", + "ofetch": "^1.4.1", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^1.0.0", + "pkg-types": "^2.2.0", + "pretty-bytes": "^6.1.1", + "radix3": "^1.1.2", + "rollup": "^4.45.0", + "rollup-plugin-visualizer": "^6.0.3", + "scule": "^1.3.0", + "semver": "^7.7.2", + "serve-placeholder": "^2.0.2", + "serve-static": "^2.2.0", + "source-map": "^0.7.4", + "std-env": "^3.9.0", + "ufo": "^1.6.1", + "ultrahtml": "^1.6.0", + "uncrypto": "^0.1.3", + "unctx": "^2.4.1", + "unenv": "^2.0.0-rc.18", + "unimport": "^5.1.0", + "unplugin-utils": "^0.2.4", + "unstorage": "^1.16.1", + "untyped": "^2.0.0", + "unwasm": "^0.3.9", + "youch": "4.1.0-beta.8", + "youch-core": "^0.3.3" + }, + "bin": { + "nitro": "dist/cli/index.mjs", + "nitropack": "dist/cli/index.mjs" + }, + "engines": { + "node": "^16.11.0 || >=17.0.0" + }, + "peerDependencies": { + "xml2js": "^0.6.2" + }, + "peerDependenciesMeta": { + "xml2js": { + "optional": true + } + } + }, + "node_modules/nitropack/node_modules/cookie-es": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-2.0.0.tgz", + "integrity": "sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==" + }, + "node_modules/nitropack/node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==" + }, + "node_modules/nitropack/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/nitropack/node_modules/youch": { + "version": "4.1.0-beta.8", + "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.8.tgz", + "integrity": "sha512-rY2A2lSF7zC+l7HH9Mq+83D1dLlsPnEvy8jTouzaptDZM6geqZ3aJe/b7ULCwRURPtWV3vbDjA2DDMdoBol0HQ==", + "dependencies": { + "@poppinss/colors": "^4.1.4", + "@poppinss/dumper": "^0.6.3", + "@speed-highlight/core": "^1.2.7", + "cookie": "^1.0.2", + "youch-core": "^0.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==" + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==" + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-mock-http": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.2.tgz", + "integrity": "sha512-zWaamgDUdo9SSLw47we78+zYw/bDr5gH8pH7oRRs8V3KmBtu8GLgGIbV2p/gRPd3LWpEOpjQj7X1FOU3VFMJ8g==" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" + }, + "node_modules/node-source-walk": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-7.0.1.tgz", + "integrity": "sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg==", + "dependencies": { + "@babel/parser": "^7.26.7" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "dependencies": { + "abbrev": "^3.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nuxt": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-3.17.5.tgz", + "integrity": "sha512-HWTWpM1/RDcCt9DlnzrPcNvUmGqc62IhlZJvr7COSfnJq2lKYiBKIIesEaOF+57Qjw7TfLPc1DQVBNtxfKBxEw==", + "dependencies": { + "@nuxt/cli": "^3.25.1", + "@nuxt/devalue": "^2.0.2", + "@nuxt/devtools": "^2.4.1", + "@nuxt/kit": "3.17.5", + "@nuxt/schema": "3.17.5", + "@nuxt/telemetry": "^2.6.6", + "@nuxt/vite-builder": "3.17.5", + "@unhead/vue": "^2.0.10", + "@vue/shared": "^3.5.16", + "c12": "^3.0.4", + "chokidar": "^4.0.3", + "compatx": "^0.2.0", + "consola": "^3.4.2", + "cookie-es": "^2.0.0", + "defu": "^6.1.4", + "destr": "^2.0.5", + "devalue": "^5.1.1", + "errx": "^0.1.0", + "esbuild": "^0.25.5", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "exsolve": "^1.0.5", + "h3": "^1.15.3", + "hookable": "^5.5.3", + "ignore": "^7.0.5", + "impound": "^1.0.0", + "jiti": "^2.4.2", + "klona": "^2.0.6", + "knitwork": "^1.2.0", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "mocked-exports": "^0.1.1", + "nanotar": "^0.2.0", + "nitropack": "^2.11.12", + "nypm": "^0.6.0", + "ofetch": "^1.4.1", + "ohash": "^2.0.11", + "on-change": "^5.0.1", + "oxc-parser": "^0.72.2", + "pathe": "^2.0.3", + "perfect-debounce": "^1.0.0", + "pkg-types": "^2.1.0", + "radix3": "^1.1.2", + "scule": "^1.3.0", + "semver": "^7.7.2", + "std-env": "^3.9.0", + "strip-literal": "^3.0.0", + "tinyglobby": "0.2.14", + "ufo": "^1.6.1", + "ultrahtml": "^1.6.0", + "uncrypto": "^0.1.3", + "unctx": "^2.4.1", + "unimport": "^5.0.1", + "unplugin": "^2.3.5", + "unplugin-vue-router": "^0.12.0", + "unstorage": "^1.16.0", + "untyped": "^2.0.0", + "vue": "^3.5.16", + "vue-bundle-renderer": "^2.1.1", + "vue-devtools-stub": "^0.1.0", + "vue-router": "^4.5.1" + }, + "bin": { + "nuxi": "bin/nuxt.mjs", + "nuxt": "bin/nuxt.mjs" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0.0" + }, + "peerDependencies": { + "@parcel/watcher": "^2.1.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "peerDependenciesMeta": { + "@parcel/watcher": { + "optional": true + }, + "@types/node": { + "optional": true + } + } + }, + "node_modules/nuxt/node_modules/@nuxt/kit": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.17.5.tgz", + "integrity": "sha512-NdCepmA+S/SzgcaL3oYUeSlXGYO6BXGr9K/m1D0t0O9rApF8CSq/QQ+ja5KYaYMO1kZAEWH4s2XVcE3uPrrAVg==", + "dependencies": { + "c12": "^3.0.4", + "consola": "^3.4.2", + "defu": "^6.1.4", + "destr": "^2.0.5", + "errx": "^0.1.0", + "exsolve": "^1.0.5", + "ignore": "^7.0.5", + "jiti": "^2.4.2", + "klona": "^2.0.6", + "knitwork": "^1.2.0", + "mlly": "^1.7.4", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "pkg-types": "^2.1.0", + "scule": "^1.3.0", + "semver": "^7.7.2", + "std-env": "^3.9.0", + "tinyglobby": "^0.2.14", + "ufo": "^1.6.1", + "unctx": "^2.4.1", + "unimport": "^5.0.1", + "untyped": "^2.0.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/nuxt/node_modules/@unhead/vue": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-2.0.14.tgz", + "integrity": "sha512-Ym9f+Kd2Afqek2FtUHvYvK+j2uZ2vbZ6Rr9NCnNGGBMdmafAuiZpT117YGyh0ARcueL6Znia0U8ySqPsnHOZIg==", + "dependencies": { + "hookable": "^5.5.3", + "unhead": "2.0.14" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + }, + "peerDependencies": { + "vue": ">=3.5.18" + } + }, + "node_modules/nuxt/node_modules/cookie-es": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-2.0.0.tgz", + "integrity": "sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==" + }, + "node_modules/nuxt/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/nuxt/node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==" + }, + "node_modules/nuxt/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/nuxt/node_modules/unhead": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/unhead/-/unhead-2.0.14.tgz", + "integrity": "sha512-dRP6OCqtShhMVZQe1F4wdt/WsYl2MskxKK+cvfSo0lQnrPJ4oAUQEkxRg7pPP+vJENabhlir31HwAyHUv7wfMg==", + "dependencies": { + "hookable": "^5.5.3" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/nypm": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.1.tgz", + "integrity": "sha512-hlacBiRiv1k9hZFiphPUkfSQ/ZfQzZDzC+8z0wL3lvDAOUu/2NnChkKuMoMjNur/9OpKuz2QsIeiPVN0xM5Q0w==", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.2", + "pathe": "^2.0.3", + "pkg-types": "^2.2.0", + "tinyexec": "^1.0.1" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": "^14.16.0 || >=16.10.0" + } + }, + "node_modules/nypm/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ofetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.1.tgz", + "integrity": "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==", + "dependencies": { + "destr": "^2.0.3", + "node-fetch-native": "^1.6.4", + "ufo": "^1.5.4" + } + }, + "node_modules/ohash": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.6.tgz", + "integrity": "sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg==" + }, + "node_modules/on-change": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/on-change/-/on-change-5.0.1.tgz", + "integrity": "sha512-n7THCP7RkyReRSLkJb8kUWoNsxUIBxTkIp3JKno+sEz6o/9AJ3w3P9fzQkITEkMwyTKJjZciF3v/pVoouxZZMg==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/on-change?sponsor=1" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oniguruma-to-es": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-2.3.0.tgz", + "integrity": "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^5.1.1", + "regex-recursion": "^5.1.1" + } + }, + "node_modules/only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==" + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/oxc-parser": { + "version": "0.72.3", + "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.72.3.tgz", + "integrity": "sha512-JYQeJKDcUTTZ/uTdJ+fZBGFjAjkLD1h0p3Tf44ZYXRcoMk+57d81paNPFAAwzrzzqhZmkGvKKXDxwyhJXYZlpg==", + "dependencies": { + "@oxc-project/types": "^0.72.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-parser/binding-darwin-arm64": "0.72.3", + "@oxc-parser/binding-darwin-x64": "0.72.3", + "@oxc-parser/binding-freebsd-x64": "0.72.3", + "@oxc-parser/binding-linux-arm-gnueabihf": "0.72.3", + "@oxc-parser/binding-linux-arm-musleabihf": "0.72.3", + "@oxc-parser/binding-linux-arm64-gnu": "0.72.3", + "@oxc-parser/binding-linux-arm64-musl": "0.72.3", + "@oxc-parser/binding-linux-riscv64-gnu": "0.72.3", + "@oxc-parser/binding-linux-s390x-gnu": "0.72.3", + "@oxc-parser/binding-linux-x64-gnu": "0.72.3", + "@oxc-parser/binding-linux-x64-musl": "0.72.3", + "@oxc-parser/binding-wasm32-wasi": "0.72.3", + "@oxc-parser/binding-win32-arm64-msvc": "0.72.3", + "@oxc-parser/binding-win32-x64-msvc": "0.72.3" + } + }, + "node_modules/p-event": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-6.0.1.tgz", + "integrity": "sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==", + "dependencies": { + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-wait-for": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-5.0.2.tgz", + "integrity": "sha512-lwx6u1CotQYPVju77R+D0vFomni/AqRfqLmqQ8hekklqZ6gAY9rONh7lBQ0uxWMkC2AuX9b2DVAl8To0NyP1JA==", + "dependencies": { + "p-timeout": "^6.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, + "node_modules/package-manager-detector": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.3.0.tgz", + "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==" + }, + "node_modules/packrup": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/packrup/-/packrup-0.1.2.tgz", + "integrity": "sha512-ZcKU7zrr5GlonoS9cxxrb5HVswGnyj6jQvwFBa6p5VFw7G71VAHcUKL5wyZSU/ECtPM/9gacWxy2KFQKt1gMNA==", + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" + }, + "node_modules/parse-gitignore": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-gitignore/-/parse-gitignore-2.0.0.tgz", + "integrity": "sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==", + "engines": { + "node": ">=14" + } + }, + "node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-path": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz", + "integrity": "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==", + "dependencies": { + "protocols": "^2.0.0" + } + }, + "node_modules/parse-url": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-9.2.0.tgz", + "integrity": "sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==", + "dependencies": { + "@types/parse-path": "^7.0.0", + "parse-path": "^7.0.0" + }, + "engines": { + "node": ">=14.13.0" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "devOptional": true + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==" + }, + "node_modules/path-type": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/pkg-types/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/portfinder": { + "version": "1.0.37", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.37.tgz", + "integrity": "sha512-yuGIEjDAYnnOex9ddMnKZEMFE0CcGo6zbfzDklkmT1m5z734ss6JMzN9rNB3+RR7iS+F10D4/BVIaXOyh8PQKw==", + "dependencies": { + "async": "^3.2.6", + "debug": "^4.3.6" + }, + "engines": { + "node": ">= 10.12" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz", + "integrity": "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==", + "dependencies": { + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12 || ^20.9 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.38" + } + }, + "node_modules/postcss-calc/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-colormin": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.4.tgz", + "integrity": "sha512-ziQuVzQZBROpKpfeDwmrG+Vvlr0YWmY/ZAk99XD+mGEBuEojoFekL41NCsdhyNUtZI7DPOoIWIR7vQQK9xwluw==", + "dependencies": { + "browserslist": "^4.25.1", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-convert-values": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.7.tgz", + "integrity": "sha512-HR9DZLN04Xbe6xugRH6lS4ZQH2zm/bFh/ZyRkpedZozhvh+awAfbA0P36InO4fZfDhvYfNJeNvlTf1sjwGbw/A==", + "dependencies": { + "browserslist": "^4.25.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-discard-comments": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.4.tgz", + "integrity": "sha512-6tCUoql/ipWwKtVP/xYiFf1U9QgJ0PUvxN7pTcsQ8Ns3Fnwq1pU5D5s1MhT/XySeLq6GXNvn37U46Ded0TckWg==", + "dependencies": { + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-discard-comments/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.2.tgz", + "integrity": "sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-discard-empty": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.1.tgz", + "integrity": "sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.1.tgz", + "integrity": "sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-import/node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-merge-longhand": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.5.tgz", + "integrity": "sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^7.0.5" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-merge-rules": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.6.tgz", + "integrity": "sha512-2jIPT4Tzs8K87tvgCpSukRQ2jjd+hH6Bb8rEEOUDmmhOeTcqDg5fEFK8uKIu+Pvc3//sm3Uu6FRqfyv7YF7+BQ==", + "dependencies": { + "browserslist": "^4.25.1", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^5.0.1", + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.1.tgz", + "integrity": "sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.1.tgz", + "integrity": "sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==", + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^5.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-minify-params": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.4.tgz", + "integrity": "sha512-3OqqUddfH8c2e7M35W6zIwv7jssM/3miF9cbCSb1iJiWvtguQjlxZGIHK9JRmc8XAKmE2PFGtHSM7g/VcW97sw==", + "dependencies": { + "browserslist": "^4.25.1", + "cssnano-utils": "^5.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.5.tgz", + "integrity": "sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug==", + "dependencies": { + "cssesc": "^3.0.0", + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nested/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-nesting": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", + "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/selector-resolve-nested": "^3.1.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", + "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.1.tgz", + "integrity": "sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.1.tgz", + "integrity": "sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.1.tgz", + "integrity": "sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.1.tgz", + "integrity": "sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-string": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.1.tgz", + "integrity": "sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.1.tgz", + "integrity": "sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.4.tgz", + "integrity": "sha512-LvIURTi1sQoZqj8mEIE8R15yvM+OhbR1avynMtI9bUzj5gGKR/gfZFd8O7VMj0QgJaIFzxDwxGl/ASMYAkqO8g==", + "dependencies": { + "browserslist": "^4.25.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-url": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.1.tgz", + "integrity": "sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.1.tgz", + "integrity": "sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-ordered-values": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.2.tgz", + "integrity": "sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==", + "dependencies": { + "cssnano-utils": "^5.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.4.tgz", + "integrity": "sha512-rdIC9IlMBn7zJo6puim58Xd++0HdbvHeHaPgXsimMfG1ijC5A9ULvNLSE0rUKVJOvNMcwewW4Ga21ngyJjY/+Q==", + "dependencies": { + "browserslist": "^4.25.1", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.1.tgz", + "integrity": "sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.1.0.tgz", + "integrity": "sha512-KnAlfmhtoLz6IuU3Sij2ycusNs4jPW+QoFE5kuuUOK8awR6tMxZQrs5Ey3BUz7nFCzT3eqyFgqkyrHiaU2xx3w==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^4.0.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.4.tgz", + "integrity": "sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ==", + "dependencies": { + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-unique-selectors/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/postcss-values-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.2.tgz", + "integrity": "sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==", + "dependencies": { + "color-name": "^1.1.4", + "is-url-superb": "^4.0.0", + "quote-unquote": "^1.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "postcss": "^8.2.9" + } + }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/precinct": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/precinct/-/precinct-12.2.0.tgz", + "integrity": "sha512-NFBMuwIfaJ4SocE9YXPU/n4AcNSoFMVFjP72nvl3cx69j/ke61/hPOWFREVxLkFhhEGnA8ZuVfTqJBa+PK3b5w==", + "dependencies": { + "@dependents/detective-less": "^5.0.1", + "commander": "^12.1.0", + "detective-amd": "^6.0.1", + "detective-cjs": "^6.0.1", + "detective-es6": "^5.0.1", + "detective-postcss": "^7.0.1", + "detective-sass": "^6.0.1", + "detective-scss": "^5.0.1", + "detective-stylus": "^5.0.1", + "detective-typescript": "^14.0.0", + "detective-vue2": "^2.2.0", + "module-definition": "^6.0.1", + "node-source-walk": "^7.0.1", + "postcss": "^8.5.1", + "typescript": "^5.7.3" + }, + "bin": { + "precinct": "bin/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/precinct/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "engines": { + "node": ">=18" + } + }, + "node_modules/pretty-bytes": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/protocols": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", + "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ] + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quote-unquote": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/quote-unquote/-/quote-unquote-1.0.0.tgz", + "integrity": "sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==" + }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-package-up": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", + "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", + "dependencies": { + "find-up-simple": "^1.0.0", + "read-pkg": "^9.0.0", + "type-fest": "^4.6.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "dependencies": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regex": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-5.1.1.tgz", + "integrity": "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-5.1.1.tgz", + "integrity": "sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==", + "dependencies": { + "regex": "^5.1.1", + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==" + }, + "node_modules/rehype-external-links": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz", + "integrity": "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==", + "dependencies": { + "@types/hast": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-is-element": "^3.0.0", + "is-absolute-url": "^4.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-slug": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-6.0.0.tgz", + "integrity": "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==", + "dependencies": { + "@types/hast": "^3.0.0", + "github-slugger": "^2.0.0", + "hast-util-heading-rank": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-sort-attribute-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rehype-sort-attribute-values/-/rehype-sort-attribute-values-5.0.1.tgz", + "integrity": "sha512-lU3ABJO5frbUgV132YS6SL7EISf//irIm9KFMaeu5ixHfgWf6jhe+09Uf/Ef8pOYUJWKOaQJDRJGCXs6cNsdsQ==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-sort-attributes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rehype-sort-attributes/-/rehype-sort-attributes-5.0.1.tgz", + "integrity": "sha512-Bxo+AKUIELcnnAZwJDt5zUDDRpt4uzhfz9d0PVGhcxYWsbFj5Cv35xuWxu5r1LeYNFNhgGqsr9Q2QiIOM/Qctg==", + "dependencies": { + "@types/hast": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-5.0.1.tgz", + "integrity": "sha512-QCqTSvcZ65Ym+P+VyBKd4JfJfh7icMl7cIOGVmPMzWkDtdD8pQ0nQG7yxGolVIiMzSx90EZ7SwNiVpYpfTxn7w==", + "dependencies": { + "@types/mdast": "^4.0.4", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.3", + "unified": "^11.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdc": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/remark-mdc/-/remark-mdc-3.6.0.tgz", + "integrity": "sha512-f+zgMYMBChoZJnpWM2AkfMwIC2sS5+vFQQdOVho58tUOh5lDP9SnZj2my8PeXBgt8MFQ+jc97vFFzWH21JXICQ==", + "dependencies": { + "@types/mdast": "^4.0.4", + "@types/unist": "^3.0.3", + "flat": "^6.0.1", + "mdast-util-from-markdown": "^2.0.2", + "mdast-util-to-markdown": "^2.1.2", + "micromark": "^4.0.2", + "micromark-core-commonmark": "^2.0.3", + "micromark-factory-space": "^2.0.1", + "micromark-factory-whitespace": "^2.0.1", + "micromark-util-character": "^2.1.1", + "micromark-util-types": "^2.0.2", + "parse-entities": "^4.0.2", + "scule": "^1.3.0", + "stringify-entities": "^4.0.4", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1", + "yaml": "^2.7.1" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + }, + "node_modules/replace-in-file": { + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-6.3.5.tgz", + "integrity": "sha512-arB9d3ENdKva2fxRnSjwBEXfK1npgyci7ZZuwysgAp7ORjHSyxz6oqIjTEv8R0Ydl4Ll7uOAZXL4vbkhGIizCg==", + "dependencies": { + "chalk": "^4.1.2", + "glob": "^7.2.0", + "yargs": "^17.2.1" + }, + "bin": { + "replace-in-file": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/replace-in-file/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/replace-in-file/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/replace-in-file/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-package-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/require-package-name/-/require-package-name-2.0.1.tgz", + "integrity": "sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==" + }, + "node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-path": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", + "integrity": "sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==", + "dependencies": { + "http-errors": "~1.6.2", + "path-is-absolute": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/resolve-path/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/resolve-path/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/resolve-path/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/resolve-path/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/resolve-path/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" + }, + "node_modules/rollup": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.49.0.tgz", + "integrity": "sha512-3IVq0cGJ6H7fKXXEdVt+RcYvRCt8beYY9K1760wGQwSAHZcS9eot1zDG5axUbcp/kWRi5zKIIDX8MoKv/TzvZA==", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.49.0", + "@rollup/rollup-android-arm64": "4.49.0", + "@rollup/rollup-darwin-arm64": "4.49.0", + "@rollup/rollup-darwin-x64": "4.49.0", + "@rollup/rollup-freebsd-arm64": "4.49.0", + "@rollup/rollup-freebsd-x64": "4.49.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.49.0", + "@rollup/rollup-linux-arm-musleabihf": "4.49.0", + "@rollup/rollup-linux-arm64-gnu": "4.49.0", + "@rollup/rollup-linux-arm64-musl": "4.49.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.49.0", + "@rollup/rollup-linux-ppc64-gnu": "4.49.0", + "@rollup/rollup-linux-riscv64-gnu": "4.49.0", + "@rollup/rollup-linux-riscv64-musl": "4.49.0", + "@rollup/rollup-linux-s390x-gnu": "4.49.0", + "@rollup/rollup-linux-x64-gnu": "4.49.0", + "@rollup/rollup-linux-x64-musl": "4.49.0", + "@rollup/rollup-win32-arm64-msvc": "4.49.0", + "@rollup/rollup-win32-ia32-msvc": "4.49.0", + "@rollup/rollup-win32-x64-msvc": "4.49.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-visualizer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-6.0.3.tgz", + "integrity": "sha512-ZU41GwrkDcCpVoffviuM9Clwjy5fcUxlz0oMoTXTYsK+tcIFzbdacnrr2n8TXcHxbGKKXtOdjxM2HUS4HjkwIw==", + "dependencies": { + "open": "^8.0.0", + "picomatch": "^4.0.2", + "source-map": "^0.7.4", + "yargs": "^17.5.1" + }, + "bin": { + "rollup-plugin-visualizer": "dist/bin/cli.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "rolldown": "1.x || ^1.0.0-beta", + "rollup": "2.x || 3.x || 4.x" + }, + "peerDependenciesMeta": { + "rolldown": { + "optional": true + }, + "rollup": { + "optional": true + } + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==" + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-placeholder": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/serve-placeholder/-/serve-placeholder-2.0.2.tgz", + "integrity": "sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==", + "dependencies": { + "defu": "^6.1.4" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shiki": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.29.2.tgz", + "integrity": "sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==", + "dependencies": { + "@shikijs/core": "1.29.2", + "@shikijs/engine-javascript": "1.29.2", + "@shikijs/engine-oniguruma": "1.29.2", + "@shikijs/langs": "1.29.2", + "@shikijs/themes": "1.29.2", + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-git": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.28.0.tgz", + "integrity": "sha512-Rs/vQRwsn1ILH1oBUy8NucJlXmnnLeLCfcvbSehkPzbv3wwoFWIdtfd6Ndo6ZPhlPsCZ60CPI4rxurnwAa+a2w==", + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/sirv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", + "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/smob": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==" + }, + "node_modules/socket.io-client": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", + "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-client/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==" + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "engines": { + "node": "*" + } + }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==" + }, + "node_modules/streamx": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", + "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", + "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==" + }, + "node_modules/structured-clone-es": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/structured-clone-es/-/structured-clone-es-1.0.0.tgz", + "integrity": "sha512-FL8EeKFFyNQv5cMnXI31CIMCsFarSVI2bF0U0ImeNE3g/F1IvJQyqzOXxPBRXiwQfyBTlbNe88jh1jFW0O/jiQ==" + }, + "node_modules/stylehacks": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.6.tgz", + "integrity": "sha512-iitguKivmsueOmTO0wmxURXBP8uqOO+zikLGZ7Mm9e/94R4w5T999Js2taS/KBOnQ/wdC3jN3vNSrkGDrlnqQg==", + "dependencies": { + "browserslist": "^4.25.1", + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/stylehacks/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svgo": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.0.tgz", + "integrity": "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==", + "dependencies": { + "commander": "^11.1.0", + "css-select": "^5.1.0", + "css-tree": "^3.0.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "^1.4.1" + }, + "bin": { + "svgo": "bin/svgo.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/system-architecture": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz", + "integrity": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tailwind-config-viewer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/tailwind-config-viewer/-/tailwind-config-viewer-2.0.4.tgz", + "integrity": "sha512-icvcmdMmt9dphvas8wL40qttrHwAnW3QEN4ExJ2zICjwRsPj7gowd1cOceaWG3IfTuM/cTNGQcx+bsjMtmV+cw==", + "dependencies": { + "@koa/router": "^12.0.1", + "commander": "^6.0.0", + "fs-extra": "^9.0.1", + "koa": "^2.14.2", + "koa-static": "^5.0.0", + "open": "^7.0.4", + "portfinder": "^1.0.26", + "replace-in-file": "^6.1.0" + }, + "bin": { + "tailwind-config-viewer": "cli/index.js", + "tailwindcss-config-viewer": "cli/index.js" + }, + "engines": { + "node": ">=13" + }, + "peerDependencies": { + "tailwindcss": "1 || 2 || 2.0.1-compat || 3" + } + }, + "node_modules/tailwind-config-viewer/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/tailwind-config-viewer/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tailwind-config-viewer/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwind-config-viewer/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/tailwindcss/node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tailwindcss/node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/tailwindcss/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tailwindcss/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/tailwindcss/node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", + "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "engines": { + "node": ">=18" + } + }, + "node_modules/terser": { + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.14.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" + }, + "node_modules/tinyexec": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==" + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "engines": { + "node": ">=0.6.x" + } + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==" + }, + "node_modules/ultrahtml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.6.0.tgz", + "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==" + }, + "node_modules/unctx": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.4.1.tgz", + "integrity": "sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==", + "dependencies": { + "acorn": "^8.14.0", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17", + "unplugin": "^2.1.0" + } + }, + "node_modules/unctx/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "devOptional": true + }, + "node_modules/unenv": { + "version": "2.0.0-rc.19", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.19.tgz", + "integrity": "sha512-t/OMHBNAkknVCI7bVB9OWjUUAwhVv9vsPIAGnNUxnu3FxPQN11rjh0sksLMzc3g7IlTgvHmOTl4JM7JHpcv5wA==", + "dependencies": { + "defu": "^6.1.4", + "exsolve": "^1.0.7", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "ufo": "^1.6.1" + } + }, + "node_modules/unenv/node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==" + }, + "node_modules/unenv/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/unhead": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/unhead/-/unhead-1.11.20.tgz", + "integrity": "sha512-3AsNQC0pjwlLqEYHLjtichGWankK8yqmocReITecmpB1H0aOabeESueyy+8X1gyJx4ftZVwo9hqQ4O3fPWffCA==", + "dependencies": { + "@unhead/dom": "1.11.20", + "@unhead/schema": "1.11.20", + "@unhead/shared": "1.11.20", + "hookable": "^5.5.3" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unimport": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-5.2.0.tgz", + "integrity": "sha512-bTuAMMOOqIAyjV4i4UH7P07pO+EsVxmhOzQ2YJ290J6mkLUdozNhb5I/YoOEheeNADC03ent3Qj07X0fWfUpmw==", + "dependencies": { + "acorn": "^8.15.0", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "local-pkg": "^1.1.1", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "pkg-types": "^2.2.0", + "scule": "^1.3.0", + "strip-literal": "^3.0.0", + "tinyglobby": "^0.2.14", + "unplugin": "^2.3.5", + "unplugin-utils": "^0.2.4" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unimport/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/unimport/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/unimport/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unist-builder": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-4.0.0.tgz", + "integrity": "sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unixify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", + "integrity": "sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==", + "dependencies": { + "normalize-path": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unixify/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unplugin": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.9.tgz", + "integrity": "sha512-2dcbZq6aprwXTkzptq3k5qm5B8cvpjG9ynPd5fyM2wDJuuF7PeUK64Sxf0d+X1ZyDOeGydbNzMqBSIVlH8GIfA==", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unplugin-utils": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.2.5.tgz", + "integrity": "sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/unplugin-utils/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/unplugin-utils/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unplugin-vue-router": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/unplugin-vue-router/-/unplugin-vue-router-0.12.0.tgz", + "integrity": "sha512-xjgheKU0MegvXQcy62GVea0LjyOdMxN0/QH+ijN29W62ZlMhG7o7K+0AYqfpprvPwpWtuRjiyC5jnV2SxWye2w==", + "dependencies": { + "@babel/types": "^7.26.8", + "@vue-macros/common": "^1.16.1", + "ast-walker-scope": "^0.6.2", + "chokidar": "^4.0.3", + "fast-glob": "^3.3.3", + "json5": "^2.2.3", + "local-pkg": "^1.0.0", + "magic-string": "^0.30.17", + "micromatch": "^4.0.8", + "mlly": "^1.7.4", + "pathe": "^2.0.2", + "scule": "^1.3.0", + "unplugin": "^2.2.0", + "unplugin-utils": "^0.2.3", + "yaml": "^2.7.0" + }, + "peerDependencies": { + "vue-router": "^4.4.0" + }, + "peerDependenciesMeta": { + "vue-router": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-router/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/unplugin/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unstorage": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.0.tgz", + "integrity": "sha512-l9Z7lBiwtNp8ZmcoZ/dmPkFXFdtEdZtTZafCSnEIj3YvtkXeGAtL2rN8MQFy/0cs4eOLpuRJMp9ivdug7TCvww==", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^4.0.3", + "destr": "^2.0.5", + "h3": "^1.15.4", + "lru-cache": "^10.4.3", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.4.1", + "ufo": "^1.6.1" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6.0.3 || ^7.0.0", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12", + "@vercel/kv": "^1.0.1", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/unstorage/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/untun": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/untun/-/untun-0.1.3.tgz", + "integrity": "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==", + "dependencies": { + "citty": "^0.1.5", + "consola": "^3.2.3", + "pathe": "^1.1.1" + }, + "bin": { + "untun": "bin/untun.mjs" + } + }, + "node_modules/untyped": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/untyped/-/untyped-2.0.0.tgz", + "integrity": "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==", + "dependencies": { + "citty": "^0.1.6", + "defu": "^6.1.4", + "jiti": "^2.4.2", + "knitwork": "^1.2.0", + "scule": "^1.3.0" + }, + "bin": { + "untyped": "dist/cli.mjs" + } + }, + "node_modules/unwasm": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/unwasm/-/unwasm-0.3.11.tgz", + "integrity": "sha512-Vhp5gb1tusSQw5of/g3Q697srYgMXvwMgXMjcG4ZNga02fDX9coxJ9fAb0Ci38hM2Hv/U1FXRPGgjP2BYqhNoQ==", + "dependencies": { + "knitwork": "^1.2.0", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "pathe": "^2.0.3", + "pkg-types": "^2.2.0", + "unplugin": "^2.3.6" + } + }, + "node_modules/unwasm/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uqr": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz", + "integrity": "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==" + }, + "node_modules/urlpattern-polyfill": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz", + "integrity": "sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-dev-rpc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vite-dev-rpc/-/vite-dev-rpc-1.1.0.tgz", + "integrity": "sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==", + "dependencies": { + "birpc": "^2.4.0", + "vite-hot-client": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0" + } + }, + "node_modules/vite-hot-client": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-2.1.0.tgz", + "integrity": "sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0" + } + }, + "node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-node/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/vite-plugin-checker": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.9.3.tgz", + "integrity": "sha512-Tf7QBjeBtG7q11zG0lvoF38/2AVUzzhMNu+Wk+mcsJ00Rk/FpJ4rmUviVJpzWkagbU13cGXvKpt7CMiqtxVTbQ==", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "chokidar": "^4.0.3", + "npm-run-path": "^6.0.0", + "picocolors": "^1.1.1", + "picomatch": "^4.0.2", + "strip-ansi": "^7.1.0", + "tiny-invariant": "^1.3.3", + "tinyglobby": "^0.2.13", + "vscode-uri": "^3.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "peerDependencies": { + "@biomejs/biome": ">=1.7", + "eslint": ">=7", + "meow": "^13.2.0", + "optionator": "^0.9.4", + "stylelint": ">=16", + "typescript": "*", + "vite": ">=2.0.0", + "vls": "*", + "vti": "*", + "vue-tsc": "~2.2.10" + }, + "peerDependenciesMeta": { + "@biomejs/biome": { + "optional": true + }, + "eslint": { + "optional": true + }, + "meow": { + "optional": true + }, + "optionator": { + "optional": true + }, + "stylelint": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vls": { + "optional": true + }, + "vti": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/vite-plugin-checker/node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vite-plugin-checker/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vite-plugin-checker/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vite-plugin-checker/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vite-plugin-inspect": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-11.3.3.tgz", + "integrity": "sha512-u2eV5La99oHoYPHE6UvbwgEqKKOQGz86wMg40CCosP6q8BkB6e5xPneZfYagK4ojPJSj5anHCrnvC20DpwVdRA==", + "dependencies": { + "ansis": "^4.1.0", + "debug": "^4.4.1", + "error-stack-parser-es": "^1.0.5", + "ohash": "^2.0.11", + "open": "^10.2.0", + "perfect-debounce": "^2.0.0", + "sirv": "^3.0.1", + "unplugin-utils": "^0.3.0", + "vite-dev-rpc": "^1.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/vite-plugin-inspect/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vite-plugin-inspect/node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==" + }, + "node_modules/vite-plugin-inspect/node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vite-plugin-inspect/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/vite-plugin-inspect/node_modules/perfect-debounce": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.0.0.tgz", + "integrity": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==" + }, + "node_modules/vite-plugin-inspect/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vite-plugin-inspect/node_modules/unplugin-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.0.tgz", + "integrity": "sha512-JLoggz+PvLVMJo+jZt97hdIIIZ2yTzGgft9e9q8iMrC4ewufl62ekeW7mixBghonn2gVb/ICjyvlmOCUBnJLQg==", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/vite-plugin-vue-tracer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-tracer/-/vite-plugin-vue-tracer-1.0.0.tgz", + "integrity": "sha512-a+UB9IwGx5uwS4uG/a9kM6fCMnxONDkOTbgCUbhFpiGhqfxrrC1+9BibV7sWwUnwj1Dg6MnRxG0trLgUZslDXA==", + "dependencies": { + "estree-walker": "^3.0.3", + "exsolve": "^1.0.7", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "source-map-js": "^1.2.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0", + "vue": "^3.5.0" + } + }, + "node_modules/vite-plugin-vue-tracer/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/vite-plugin-vue-tracer/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==" + }, + "node_modules/vue": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.20.tgz", + "integrity": "sha512-2sBz0x/wis5TkF1XZ2vH25zWq3G1bFEPOfkBcx2ikowmphoQsPH6X0V3mmPCXA2K1N/XGTnifVyDQP4GfDDeQw==", + "dependencies": { + "@vue/compiler-dom": "3.5.20", + "@vue/compiler-sfc": "3.5.20", + "@vue/runtime-dom": "3.5.20", + "@vue/server-renderer": "3.5.20", + "@vue/shared": "3.5.20" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-bundle-renderer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/vue-bundle-renderer/-/vue-bundle-renderer-2.1.2.tgz", + "integrity": "sha512-M4WRBO/O/7G9phGaGH9AOwOnYtY9ZpPoDVpBpRzR2jO5rFL9mgIlQIgums2ljCTC2HL1jDXFQc//CzWcAQHgAw==", + "dependencies": { + "ufo": "^1.6.1" + } + }, + "node_modules/vue-devtools-stub": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/vue-devtools-stub/-/vue-devtools-stub-0.1.0.tgz", + "integrity": "sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==" + }, + "node_modules/vue-router": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.1.tgz", + "integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.12.tgz", + "integrity": "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==", + "devOptional": true, + "dependencies": { + "@volar/typescript": "2.4.15", + "@vue/language-core": "2.2.12" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/winston": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", + "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/winston/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/winston/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-6.0.0.tgz", + "integrity": "sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yauzl/node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/ylru": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", + "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/youch": { + "version": "4.1.0-beta.11", + "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.11.tgz", + "integrity": "sha512-sQi6PERyO/mT8w564ojOVeAlYTtVQmC2GaktQAf+IdI75/GKIggosBuvyVXvEV+FATAT6RbLdIjFoiIId4ozoQ==", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@poppinss/dumper": "^0.6.4", + "@speed-highlight/core": "^1.2.7", + "cookie": "^1.0.2", + "youch-core": "^0.3.3" + } + }, + "node_modules/youch-core": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz", + "integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==", + "dependencies": { + "@poppinss/exception": "^1.2.2", + "error-stack-parser-es": "^1.0.5" + } + }, + "node_modules/zhead": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/zhead/-/zhead-2.2.4.tgz", + "integrity": "sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==", + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/zip-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", + "dependencies": { + "archiver-utils": "^5.0.0", + "compress-commons": "^6.0.2", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/docs-v3/package.json b/docs-v3/package.json new file mode 100644 index 000000000..5cf6dd019 --- /dev/null +++ b/docs-v3/package.json @@ -0,0 +1,31 @@ +{ + "name": "laravel-restify-docs-v3", + "version": "1.0.0", + "description": "Modern documentation for Laravel Restify with Tailwind CSS", + "author": "binarcode", + "private": true, + "type": "module", + "scripts": { + "build": "nuxt build", + "dev": "nuxt dev", + "generate": "nuxt generate", + "preview": "nuxt preview", + "postinstall": "nuxt prepare" + }, + "dependencies": { + "@nuxt/content": "^2.13.2", + "@nuxt/kit": "^3.13.2", + "@nuxtjs/color-mode": "^3.5.2", + "@nuxtjs/tailwindcss": "^6.12.1", + "@tailwindcss/typography": "^0.5.16", + "@vueuse/nuxt": "^11.1.0", + "nuxt": "^3.13.2", + "vue": "latest" + }, + "devDependencies": { + "@nuxt/devtools": "latest", + "@types/node": "^22.8.6", + "typescript": "^5.6.3", + "vue-tsc": "^2.2.12" + } +} diff --git a/docs-v3/pages/[...slug].vue b/docs-v3/pages/[...slug].vue new file mode 100644 index 000000000..356a7c03d --- /dev/null +++ b/docs-v3/pages/[...slug].vue @@ -0,0 +1,113 @@ + + + \ No newline at end of file diff --git a/docs-v3/pages/index.vue b/docs-v3/pages/index.vue new file mode 100644 index 000000000..eb7e028f8 --- /dev/null +++ b/docs-v3/pages/index.vue @@ -0,0 +1,82 @@ + + + \ No newline at end of file diff --git a/docs-v3/public/icon.png b/docs-v3/public/icon.png new file mode 100644 index 000000000..edaca7fa2 Binary files /dev/null and b/docs-v3/public/icon.png differ diff --git a/docs-v3/public/logo.png b/docs-v3/public/logo.png new file mode 100644 index 000000000..aa17157ad Binary files /dev/null and b/docs-v3/public/logo.png differ diff --git a/docs-v3/public/starter-kit.png b/docs-v3/public/starter-kit.png new file mode 100644 index 000000000..0cee2d5c9 Binary files /dev/null and b/docs-v3/public/starter-kit.png differ diff --git a/docs-v3/public/sw.js b/docs-v3/public/sw.js new file mode 100644 index 000000000..2d4d4602a --- /dev/null +++ b/docs-v3/public/sw.js @@ -0,0 +1,17 @@ +// THIS FILE SHOULD NOT BE VERSION CONTROLLED + +// https://github.com/NekR/self-destroying-sw + +self.addEventListener('install', function (e) { + self.skipWaiting() +}) + +self.addEventListener('activate', function (e) { + self.registration.unregister() + .then(function () { + return self.clients.matchAll() + }) + .then(function (clients) { + clients.forEach(client => client.navigate(client.url)) + }) +}) diff --git a/docs-v3/public/tile.png b/docs-v3/public/tile.png new file mode 100644 index 000000000..a712e7ab2 Binary files /dev/null and b/docs-v3/public/tile.png differ diff --git a/docs-v3/tailwind.config.js b/docs-v3/tailwind.config.js new file mode 100644 index 000000000..0bef4924d --- /dev/null +++ b/docs-v3/tailwind.config.js @@ -0,0 +1,128 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: 'class', + content: [ + './components/**/*.{js,vue,ts}', + './layouts/**/*.vue', + './pages/**/*.vue', + './plugins/**/*.{js,ts}', + './nuxt.config.{js,ts}', + './app.vue', + './content/**/*.md' + ], + theme: { + extend: { + colors: { + primary: { + 50: '#f0f0ff', + 100: '#e5e5ff', + 200: '#cfcfff', + 300: '#a8a8ff', + 400: '#787af6', + 500: '#5b5ce0', + 600: '#4c4db8', + 700: '#3d3e95', + 800: '#323379', + 900: '#2c2d64', + 950: '#1a1a3a' + }, + gray: { + 50: '#f9fafb', + 100: '#f3f4f6', + 200: '#e5e7eb', + 300: '#d1d5db', + 400: '#9ca3af', + 500: '#6b7280', + 600: '#4b5563', + 700: '#374151', + 800: '#1f2937', + 900: '#111827', + 950: '#0f0f23' + } + }, + fontFamily: { + sans: ['Inter', 'system-ui', 'sans-serif'], + mono: ['JetBrains Mono', 'Monaco', 'Consolas', 'monospace'] + }, + typography: (theme) => ({ + DEFAULT: { + css: { + maxWidth: 'none', + color: theme('colors.gray.700'), + a: { + color: theme('colors.primary.500'), + textDecoration: 'none', + fontWeight: '500', + '&:hover': { + color: theme('colors.primary.600'), + textDecoration: 'underline' + } + }, + 'h1, h2, h3, h4': { + color: theme('colors.gray.900'), + fontWeight: '600' + }, + code: { + color: theme('colors.gray.800'), + backgroundColor: theme('colors.gray.100'), + padding: '0.25rem 0.375rem', + borderRadius: '0.25rem', + fontSize: '0.875em', + fontWeight: '500' + }, + 'code::before': { + content: '""' + }, + 'code::after': { + content: '""' + }, + pre: { + backgroundColor: theme('colors.gray.900'), + color: theme('colors.gray.100') + }, + 'pre code': { + backgroundColor: 'transparent', + color: 'inherit', + padding: '0', + borderRadius: '0' + } + } + }, + dark: { + css: { + color: theme('colors.gray.300'), + a: { + color: theme('colors.primary.400'), + '&:hover': { + color: theme('colors.primary.300') + } + }, + 'h1, h2, h3, h4': { + color: theme('colors.gray.100') + }, + code: { + color: theme('colors.gray.200'), + backgroundColor: theme('colors.gray.800') + }, + pre: { + backgroundColor: theme('colors.gray.800') + }, + blockquote: { + borderLeftColor: theme('colors.gray.600'), + color: theme('colors.gray.300') + }, + hr: { + borderColor: theme('colors.gray.700') + }, + strong: { + color: theme('colors.gray.200') + } + } + } + }) + } + }, + plugins: [ + require('@tailwindcss/typography') + ] +} \ No newline at end of file diff --git a/docs-v3/tsconfig.json b/docs-v3/tsconfig.json new file mode 100644 index 000000000..56fdfcde0 --- /dev/null +++ b/docs-v3/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "./.nuxt/tsconfig.json", + "compilerOptions": { + "strict": true, + "types": ["@nuxt/types", "@types/node"] + } +} \ No newline at end of file diff --git a/src/Fields/Field.php b/src/Fields/Field.php index 3b0fad2bc..ce9523076 100644 --- a/src/Fields/Field.php +++ b/src/Fields/Field.php @@ -842,10 +842,6 @@ protected function guessTypeFromValidationRules(): ?string return 'boolean'; } - if ($this->hasAnyRule($ruleStrings, ['integer', 'int', 'numeric', 'min:', 'max:', 'between:'])) { - return 'number'; - } - if ($this->hasAnyRule($ruleStrings, ['email', 'url', 'ip', 'uuid', 'string', 'regex', 'in', 'array'])) { return 'string'; } @@ -858,6 +854,10 @@ protected function guessTypeFromValidationRules(): ?string return 'string'; // Files are typically handled as strings (paths/URLs) } + if ($this->hasAnyRule($ruleStrings, ['integer', 'int', 'numeric', 'between:'])) { + return 'number'; + } + return null; }