[{"data":1,"prerenderedAt":5801},["ShallowReactive",2],{"navigation_docs":3,"-engineering-platform-use-api":369,"-engineering-platform-use-api-surround":5796},[4,8,72,102,220,266,280,301,365],{"title":5,"path":6,"stem":7},"Introduction","\u002Fintroduction","0.introduction",{"title":9,"icon":10,"path":11,"stem":12,"children":13,"page":67},"Company","i-lucide-building-2","\u002Fcompany","1.company",[14,18,22,26,30,34,38,42,46,50,54,68],{"title":15,"path":16,"stem":17},"About","\u002Fcompany\u002Fabout","1.company\u002F0.about",{"title":19,"path":20,"stem":21},"Values","\u002Fcompany\u002Fvalues","1.company\u002F1.values",{"title":23,"path":24,"stem":25},"Communication","\u002Fcompany\u002Fcommunication","1.company\u002Fcommunication",{"title":27,"path":28,"stem":29},"Competition","\u002Fcompany\u002Fcompetition","1.company\u002Fcompetition",{"title":31,"path":32,"stem":33},"Hybrid Working","\u002Fcompany\u002Fhybrid-working","1.company\u002Fhybrid-working",{"title":35,"path":36,"stem":37},"Manchester Office","\u002Fcompany\u002Foffice","1.company\u002Foffice",{"title":39,"path":40,"stem":41},"Operations","\u002Fcompany\u002Foperations","1.company\u002Foperations",{"title":43,"path":44,"stem":45},"Policies","\u002Fcompany\u002Fpolicies","1.company\u002Fpolicies",{"title":47,"path":48,"stem":49},"Problem Statement","\u002Fcompany\u002Fproblem-statement","1.company\u002Fproblem-statement",{"title":51,"path":52,"stem":53},"Product Strategy","\u002Fcompany\u002Fproduct-strategy","1.company\u002Fproduct-strategy",{"title":55,"path":56,"stem":57,"children":58,"page":67},"Products","\u002Fcompany\u002Fproducts","1.company\u002Fproducts",[59,63],{"title":60,"path":61,"stem":62},"Capability Exchange","\u002Fcompany\u002Fproducts\u002Fcapability-exchange","1.company\u002Fproducts\u002Fcapability-exchange",{"title":64,"path":65,"stem":66},"ESProfiler Platform","\u002Fcompany\u002Fproducts\u002Fesprofiler","1.company\u002Fproducts\u002Fesprofiler",false,{"title":69,"path":70,"stem":71},"Security","\u002Fcompany\u002Fsecurity","1.company\u002Fsecurity",{"title":73,"icon":74,"path":75,"stem":76,"children":77,"page":67},"People Ops","i-lucide-users","\u002Fpeople-ops","2.people-ops",[78,82,86,90,94,98],{"title":79,"path":80,"stem":81},"Compensation","\u002Fpeople-ops\u002Fcompensation","2.people-ops\u002Fcompensation",{"title":83,"path":84,"stem":85},"Education","\u002Fpeople-ops\u002Feducation","2.people-ops\u002Feducation",{"title":87,"path":88,"stem":89},"Expenses","\u002Fpeople-ops\u002Fexpenses","2.people-ops\u002Fexpenses",{"title":91,"path":92,"stem":93},"Holiday & Leave","\u002Fpeople-ops\u002Fleave","2.people-ops\u002Fleave",{"title":95,"path":96,"stem":97},"Onboarding","\u002Fpeople-ops\u002Fonboarding","2.people-ops\u002Fonboarding",{"title":99,"path":100,"stem":101},"Recruitment","\u002Fpeople-ops\u002Frecruitment","2.people-ops\u002Frecruitment",{"title":103,"icon":104,"path":105,"stem":106,"children":107,"page":67},"Engineering","i-lucide-rocket","\u002Fengineering","3.engineering",[108,151,155,175,196,200,208,212,216],{"title":109,"path":110,"stem":111,"children":112,"page":67},"Contributing","\u002Fengineering\u002Fcontributing","3.engineering\u002Fcontributing",[113,117,121,125,129,142],{"title":114,"path":115,"stem":116},"Development Setup","\u002Fengineering\u002Fcontributing\u002Fdevelopment-setup","3.engineering\u002Fcontributing\u002F1.development-setup",{"title":118,"path":119,"stem":120},"Engineering Operations","\u002Fengineering\u002Fcontributing\u002Fengineering-operations","3.engineering\u002Fcontributing\u002F2.engineering-operations",{"title":122,"path":123,"stem":124},"Documentation","\u002Fengineering\u002Fcontributing\u002Fdocumentation","3.engineering\u002Fcontributing\u002F3.documentation",{"title":126,"path":127,"stem":128},"Agentic Coding","\u002Fengineering\u002Fcontributing\u002Fagentic-coding","3.engineering\u002Fcontributing\u002Fagentic-coding",{"title":130,"path":131,"stem":132,"children":133,"page":67},"Back End","\u002Fengineering\u002Fcontributing\u002Fback-end","3.engineering\u002Fcontributing\u002Fback-end",[134,138],{"title":135,"path":136,"stem":137},"API Guidelines","\u002Fengineering\u002Fcontributing\u002Fback-end\u002Fapi-guidelines","3.engineering\u002Fcontributing\u002Fback-end\u002Fapi-guidelines",{"title":139,"path":140,"stem":141},"LLM Prompts & Langfuse Integration","\u002Fengineering\u002Fcontributing\u002Fback-end\u002Fllm-prompts","3.engineering\u002Fcontributing\u002Fback-end\u002Fllm-prompts",{"title":143,"path":144,"stem":145,"children":146,"page":67},"Front End","\u002Fengineering\u002Fcontributing\u002Ffront-end","3.engineering\u002Fcontributing\u002Ffront-end",[147],{"title":148,"path":149,"stem":150},"Testing","\u002Fengineering\u002Fcontributing\u002Ffront-end\u002Ftesting","3.engineering\u002Fcontributing\u002Ffront-end\u002Ftesting",{"title":152,"path":153,"stem":154},"Production Database","\u002Fengineering\u002Fdatabase-connection","3.engineering\u002Fdatabase-connection",{"title":156,"path":157,"stem":158,"children":159},"Deployment","\u002Fengineering\u002Fdeployment","3.engineering\u002Fdeployment",[160,163,167,171],{"title":60,"path":161,"stem":162},"\u002Fengineering\u002Fdeployment\u002Fcapability-exchange","3.engineering\u002Fdeployment\u002Fcapability-exchange",{"title":164,"path":165,"stem":166},"Langfuse Deployment","\u002Fengineering\u002Fdeployment\u002Fecs-langfuse-deployment","3.engineering\u002Fdeployment\u002Fecs-langfuse-deployment",{"title":168,"path":169,"stem":170},"ESP Platform Configuration","\u002Fengineering\u002Fdeployment\u002Fesp-platform-configuration","3.engineering\u002Fdeployment\u002Fesp-platform-configuration",{"title":172,"path":173,"stem":174},"Platform","\u002Fengineering\u002Fdeployment\u002Fplatform","3.engineering\u002Fdeployment\u002Fplatform",{"title":176,"path":177,"stem":178,"children":179,"page":67},"Github","\u002Fengineering\u002Fgithub","3.engineering\u002Fgithub",[180,184,188,192],{"title":181,"path":182,"stem":183},"Packages","\u002Fengineering\u002Fgithub\u002Fpackages","3.engineering\u002Fgithub\u002Fpackages",{"title":185,"path":186,"stem":187},"Personal Access Token","\u002Fengineering\u002Fgithub\u002Fpersonal-access-token","3.engineering\u002Fgithub\u002Fpersonal-access-token",{"title":189,"path":190,"stem":191},"Troubleshooting","\u002Fengineering\u002Fgithub\u002Ftroubleshooting","3.engineering\u002Fgithub\u002Ftroubleshooting",{"title":193,"path":194,"stem":195},"Workflows","\u002Fengineering\u002Fgithub\u002Fworkflows","3.engineering\u002Fgithub\u002Fworkflows",{"title":197,"path":198,"stem":199},"Platform Ops","\u002Fengineering\u002Fplatform-ops","3.engineering\u002Fplatform-ops",{"title":172,"path":201,"stem":202,"children":203,"page":67},"\u002Fengineering\u002Fplatform","3.engineering\u002Fplatform",[204],{"title":205,"path":206,"stem":207},"useAPI","\u002Fengineering\u002Fplatform\u002Fuse-api","3.engineering\u002Fplatform\u002Fuse-api",{"title":209,"path":210,"stem":211},"Project Management","\u002Fengineering\u002Fproject-management","3.engineering\u002Fproject-management",{"title":213,"path":214,"stem":215},"Releases","\u002Fengineering\u002Frelease","3.engineering\u002Frelease",{"title":217,"path":218,"stem":219},"Tools","\u002Fengineering\u002Ftools","3.engineering\u002Ftools",{"title":221,"icon":222,"path":223,"stem":224,"children":225,"page":67},"Design","i-lucide-palette","\u002Fdesign","4.design",[226,247,251,255,259,262],{"title":227,"path":228,"stem":229,"children":230,"page":67},"Personas","\u002Fdesign\u002Fpersonas","4.design\u002F0.personas",[231,235,239,243],{"title":232,"path":233,"stem":234},"CISO - Simon","\u002Fdesign\u002Fpersonas\u002F01-ciso-simon","4.design\u002F0.personas\u002F01-ciso-simon",{"title":236,"path":237,"stem":238},"Head of Cyber - Harry","\u002Fdesign\u002Fpersonas\u002F02-head-of-cyber-harry","4.design\u002F0.personas\u002F02-head-of-cyber-harry",{"title":240,"path":241,"stem":242},"Security Architect - Sasha","\u002Fdesign\u002Fpersonas\u002F03-security-architect-sasha","4.design\u002F0.personas\u002F03-security-architect-sasha",{"title":244,"path":245,"stem":246},"Procurement Officer - Paige","\u002Fdesign\u002Fpersonas\u002F04-procurement-officer-paige","4.design\u002F0.personas\u002F04-procurement-officer-paige",{"title":248,"path":249,"stem":250},"Design Thinking","\u002Fdesign\u002Fdesign-thinking","4.design\u002F1.design-thinking",{"title":252,"path":253,"stem":254},"Design & Development","\u002Fdesign\u002Fdesign-and-development","4.design\u002F3.design-and-development",{"title":256,"path":257,"stem":258},"Branding","\u002Fdesign\u002Fbranding","4.design\u002F4.branding",{"title":217,"path":260,"stem":261},"\u002Fdesign\u002Ftools","4.design\u002F5.tools",{"title":263,"path":264,"stem":265},"Customer Success","\u002Fdesign\u002Fworking-with-customers","4.design\u002F6.working-with-customers",{"title":267,"icon":268,"path":269,"stem":270,"children":271,"page":67},"Sales","i-lucide-dollar-sign","\u002Fsales","4.sales",[272,276],{"title":273,"path":274,"stem":275},"Customer Onboarding","\u002Fsales\u002Fonboarding","4.sales\u002Fonboarding",{"title":277,"path":278,"stem":279},"Sales Tools","\u002Fsales\u002Ftools","4.sales\u002Ftools",{"title":281,"icon":282,"path":283,"stem":284,"children":285,"page":67},"Marketing","i-lucide-book-image","\u002Fmarketing","5.marketing",[286,290,294,297],{"title":287,"path":288,"stem":289},"Content","\u002Fmarketing\u002Fcontent","5.marketing\u002Fcontent",{"title":291,"path":292,"stem":293},"Messaging","\u002Fmarketing\u002Fmessaging","5.marketing\u002Fmessaging",{"title":217,"path":295,"stem":296},"\u002Fmarketing\u002Ftools","5.marketing\u002Ftools",{"title":298,"path":299,"stem":300},"Website","\u002Fmarketing\u002Fwebsite","5.marketing\u002Fwebsite",{"title":302,"icon":303,"path":304,"stem":305,"children":306,"page":67},"AI & Data Ops","i-lucide-database","\u002Fdata-ops","6.data-ops",[307,315,319,344,361],{"title":60,"path":308,"stem":309,"children":310,"page":67},"\u002Fdata-ops\u002Fcapability-exchange","6.data-ops\u002FCapability Exchange",[311],{"title":312,"path":313,"stem":314},"Leaderboard Calculation","\u002Fdata-ops\u002Fcapability-exchange\u002Fleaderboard-calculation","6.data-ops\u002FCapability Exchange\u002Fleaderboard-calculation",{"title":316,"path":317,"stem":318},"Account Portal (CAS)","\u002Fdata-ops\u002Faccount-portal","6.data-ops\u002Faccount-portal",{"title":320,"path":321,"stem":322,"children":323,"page":67},"Data Management","\u002Fdata-ops\u002Fdata-management","6.data-ops\u002Fdata-management",[324,328,332,336,340],{"title":325,"path":326,"stem":327},"Adding Products","\u002Fdata-ops\u002Fdata-management\u002Fadding-products","6.data-ops\u002Fdata-management\u002Fadding-products",{"title":329,"path":330,"stem":331},"Adding Vendors","\u002Fdata-ops\u002Fdata-management\u002Fadding-vendors","6.data-ops\u002Fdata-management\u002Fadding-vendors",{"title":333,"path":334,"stem":335},"Framework Mapping","\u002Fdata-ops\u002Fdata-management\u002Fframework-mapping","6.data-ops\u002Fdata-management\u002Fframework-mapping",{"title":337,"path":338,"stem":339},"Refreshing Vendors","\u002Fdata-ops\u002Fdata-management\u002Frefreshing-vendors","6.data-ops\u002Fdata-management\u002Frefreshing-vendors",{"title":341,"path":342,"stem":343},"Reviewing Draft Vendors","\u002Fdata-ops\u002Fdata-management\u002Freviewing-draft-vendors","6.data-ops\u002Fdata-management\u002Freviewing-draft-vendors",{"title":345,"path":346,"stem":347,"children":348,"page":67},"LLM Ops","\u002Fdata-ops\u002Fllm-ops","6.data-ops\u002Fllm-ops",[349,353,357],{"title":350,"path":351,"stem":352},"Agents","\u002Fdata-ops\u002Fllm-ops\u002Fagents","6.data-ops\u002Fllm-ops\u002F1.agents",{"title":354,"path":355,"stem":356},"ESPi Architecture & Query Flow","\u002Fdata-ops\u002Fllm-ops\u002Fespi-architecture","6.data-ops\u002Fllm-ops\u002F2.espi-architecture",{"title":358,"path":359,"stem":360},"Evaluating Agents","\u002Fdata-ops\u002Fllm-ops\u002Fevaluations","6.data-ops\u002Fllm-ops\u002F3.evaluations",{"title":362,"path":363,"stem":364},"Message Queues","\u002Fdata-ops\u002Fmessage-queues","6.data-ops\u002Fmessage-queues",{"title":366,"path":367,"stem":368},"Glossary","\u002Fglossary","glossary",{"id":370,"title":205,"body":371,"description":5790,"extension":5791,"links":5792,"meta":5793,"navigation":732,"path":206,"seo":5794,"stem":207,"__hash__":5795},"docs\u002F3.engineering\u002Fplatform\u002Fuse-api.md",{"type":372,"value":373,"toc":5737},"minimark",[374,379,391,398,422,427,500,503,511,521,532,536,543,657,661,972,976,1154,1167,1178,1183,1210,1214,1274,1278,1307,1311,1865,1867,1874,1881,1904,1939,1941,1950,1956,1962,1967,2099,2106,2115,2128,2254,2280,2284,2289,2342,2346,2485,2609,2615,2626,2718,2725,2799,2801,2810,2813,2818,2824,2938,2942,2949,2987,2991,2998,3090,3094,3161,3167,3172,3275,3282,3346,3348,3355,3359,3362,3610,3614,3617,3879,3886,3898,3979,3982,3989,3995,4194,4200,4209,4423,4431,4440,4492,4496,4599,4609,4611,4615,4626,4812,4814,4818,4822,4831,4834,4852,4956,4959,4968,4977,4989,5041,5045,5060,5064,5113,5115,5119,5123,5631,5635,5733],[375,376,378],"h2",{"id":377},"overview","Overview",[380,381,382,383,386,387,390],"p",{},"The ",[384,385,205],"code",{}," composable is the primary mechanism for executing HTTP requests and managing API state in the ES-Profiler platform frontend (",[384,388,389],{},"platform-frontend",").",[380,392,393,394,397],{},"It replaces the legacy ",[384,395,396],{},"BaseApi"," utility class with a fully reactive, TypeScript-safe Vue composable.",[399,400,401,403,404,407,408,411,412,407,415,407,418,421],"note",{},[384,402,205],{}," integrates directly with Vue 3 reactivity (",[384,405,406],{},"shallowRef",", ",[384,409,410],{},"reactive","), Axios, reactive Data and Query models (",[384,413,414],{},"BaseDataModel",[384,416,417],{},"BaseListModel",[384,419,420],{},"BaseQuery","), and authentication handlers.",[423,424,426],"h3",{"id":425},"key-features","Key Features",[428,429,430,438,464,478,488,494],"ul",{},[431,432,433,437],"li",{},[434,435,436],"strong",{},"Automatic Type Safety",": TypeScript autocomplete and type checking for registered endpoints via Vite type generation.",[431,439,440,443,444,407,447,407,450,407,453,407,456,459,460,463],{},[434,441,442],{},"Reactive State",": Exposes ",[384,445,446],{},"data",[384,448,449],{},"query",[384,451,452],{},"loading",[384,454,455],{},"loaded",[384,457,458],{},"success",", and ",[384,461,462],{},"error"," state.",[431,465,466,469,470,473,474,477],{},[434,467,468],{},"Dynamic Path Interpolation",": Automatically substitutes URL path parameters like ",[384,471,472],{},":productId"," or ",[384,475,476],{},":findingId",".",[431,479,480,483,484,487],{},[434,481,482],{},"Request Deduplication",": Prevents duplicate ",[384,485,486],{},"GET"," requests with identical destination parameters.",[431,489,490,493],{},[434,491,492],{},"Auto Abort",": Automatically cancels in-flight HTTP requests when re-executed on the same composable instance.",[431,495,496,499],{},[434,497,498],{},"Built-in Authorization & Error Handling",": Manages silent token authentication, automatic 401 signouts, and interactive 403 Permission Denied modal dialogs.",[501,502],"hr",{},[375,504,506,507,510],{"id":505},"defining-api-endpoints-defineapi","Defining API Endpoints (",[384,508,509],{},"defineAPI",")",[380,512,513,514,517,518,520],{},"API endpoint definitions are structured modularly in ",[384,515,516],{},"src\u002Fapi\u002F**\u002F*.ts"," within the ",[384,519,389],{}," repository.",[380,522,523,524,527,528,531],{},"Each module exports a default ",[384,525,526],{},"APIConfig"," object defining the ",[384,529,530],{},"baseURL"," and endpoint registry entries.",[423,533,535],{"id":534},"namespace-naming-convention","Namespace Naming Convention",[380,537,538,539,542],{},"Endpoint namespaces are automatically derived from the file path relative to ",[384,540,541],{},"src\u002Fapi\u002F",":",[544,545,546,565],"table",{},[547,548,549],"thead",{},[550,551,552,556,559,562],"tr",{},[553,554,555],"th",{},"File Path",[553,557,558],{},"Generated Namespace",[553,560,561],{},"Endpoint Key",[553,563,564],{},"Full Endpoint String",[566,567,568,591,613,635],"tbody",{},[550,569,570,576,581,586],{},[571,572,573],"td",{},[384,574,575],{},"src\u002Fapi\u002Ffeature.ts",[571,577,578],{},[384,579,580],{},"feature",[571,582,583],{},[384,584,585],{},"internal.create",[571,587,588],{},[384,589,590],{},"'feature.internal.create'",[550,592,593,598,603,608],{},[571,594,595],{},[384,596,597],{},"src\u002Fapi\u002Fmeta.ts",[571,599,600],{},[384,601,602],{},"meta",[571,604,605],{},[384,606,607],{},"tags",[571,609,610],{},[384,611,612],{},"'meta.tags'",[550,614,615,620,625,630],{},[571,616,617],{},[384,618,619],{},"src\u002Fapi\u002Finsights\u002Ffindings.ts",[571,621,622],{},[384,623,624],{},"insights.findings",[571,626,627],{},[384,628,629],{},"delete",[571,631,632],{},[384,633,634],{},"'insights.findings.delete'",[550,636,637,642,647,652],{},[571,638,639],{},[384,640,641],{},"src\u002Fapi\u002Fhub\u002Finterviews.ts",[571,643,644],{},[384,645,646],{},"hub.interviews",[571,648,649],{},[384,650,651],{},"list",[571,653,654],{},[384,655,656],{},"'hub.interviews.list'",[423,658,660],{"id":659},"example-api-module","Example API Module",[662,663,668],"pre",{"className":664,"code":665,"filename":575,"language":666,"meta":667,"style":667},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { useConfig } from '@\u002Fcomposables\u002FuseConfig.ts'\nimport type { APIConfig } from '@\u002Ftypes\u002Fapi'\n\nconst config: APIConfig = {\n  baseURL: useConfig('api.esp'),\n  endpoints: {\n    'internal.create': {\n      path: '\u002Fv1\u002Finventory\u002Finternal\u002Fproducts\u002F:productId\u002Ffeatures',\n      method: 'post'\n    },\n    'internal.update': {\n      path: '\u002Fv1\u002Finventory\u002Finternal\u002Fproducts\u002F:productId\u002Ffeatures\u002F:featureId',\n      method: 'patch'\n    },\n    'internal.delete': {\n      path: '\u002Fv1\u002Finventory\u002Finternal\u002Fproducts\u002Ffeatures\u002F:featureId',\n      method: 'delete'\n    }\n  }\n}\n\nexport default config\n","typescript","",[384,669,670,703,727,734,755,783,793,807,824,839,845,859,875,889,894,908,924,937,943,949,955,960],{"__ignoreMap":667},[671,672,675,679,683,687,690,693,696,700],"span",{"class":673,"line":674},"line",1,[671,676,678],{"class":677},"s7zQu","import",[671,680,682],{"class":681},"sMK4o"," {",[671,684,686],{"class":685},"sTEyZ"," useConfig",[671,688,689],{"class":681}," }",[671,691,692],{"class":677}," from",[671,694,695],{"class":681}," '",[671,697,699],{"class":698},"sfazB","@\u002Fcomposables\u002FuseConfig.ts",[671,701,702],{"class":681},"'\n",[671,704,706,708,711,713,716,718,720,722,725],{"class":673,"line":705},2,[671,707,678],{"class":677},[671,709,710],{"class":677}," type",[671,712,682],{"class":681},[671,714,715],{"class":685}," APIConfig",[671,717,689],{"class":681},[671,719,692],{"class":677},[671,721,695],{"class":681},[671,723,724],{"class":698},"@\u002Ftypes\u002Fapi",[671,726,702],{"class":681},[671,728,730],{"class":673,"line":729},3,[671,731,733],{"emptyLinePlaceholder":732},true,"\n",[671,735,737,741,744,746,749,752],{"class":673,"line":736},4,[671,738,740],{"class":739},"spNyl","const",[671,742,743],{"class":685}," config",[671,745,542],{"class":681},[671,747,715],{"class":748},"sBMFI",[671,750,751],{"class":681}," =",[671,753,754],{"class":681}," {\n",[671,756,758,762,764,767,770,773,776,778,780],{"class":673,"line":757},5,[671,759,761],{"class":760},"swJcz","  baseURL",[671,763,542],{"class":681},[671,765,686],{"class":766},"s2Zo4",[671,768,769],{"class":685},"(",[671,771,772],{"class":681},"'",[671,774,775],{"class":698},"api.esp",[671,777,772],{"class":681},[671,779,510],{"class":685},[671,781,782],{"class":681},",\n",[671,784,786,789,791],{"class":673,"line":785},6,[671,787,788],{"class":760},"  endpoints",[671,790,542],{"class":681},[671,792,754],{"class":681},[671,794,796,799,801,803,805],{"class":673,"line":795},7,[671,797,798],{"class":681},"    '",[671,800,585],{"class":760},[671,802,772],{"class":681},[671,804,542],{"class":681},[671,806,754],{"class":681},[671,808,810,813,815,817,820,822],{"class":673,"line":809},8,[671,811,812],{"class":760},"      path",[671,814,542],{"class":681},[671,816,695],{"class":681},[671,818,819],{"class":698},"\u002Fv1\u002Finventory\u002Finternal\u002Fproducts\u002F:productId\u002Ffeatures",[671,821,772],{"class":681},[671,823,782],{"class":681},[671,825,827,830,832,834,837],{"class":673,"line":826},9,[671,828,829],{"class":760},"      method",[671,831,542],{"class":681},[671,833,695],{"class":681},[671,835,836],{"class":698},"post",[671,838,702],{"class":681},[671,840,842],{"class":673,"line":841},10,[671,843,844],{"class":681},"    },\n",[671,846,848,850,853,855,857],{"class":673,"line":847},11,[671,849,798],{"class":681},[671,851,852],{"class":760},"internal.update",[671,854,772],{"class":681},[671,856,542],{"class":681},[671,858,754],{"class":681},[671,860,862,864,866,868,871,873],{"class":673,"line":861},12,[671,863,812],{"class":760},[671,865,542],{"class":681},[671,867,695],{"class":681},[671,869,870],{"class":698},"\u002Fv1\u002Finventory\u002Finternal\u002Fproducts\u002F:productId\u002Ffeatures\u002F:featureId",[671,872,772],{"class":681},[671,874,782],{"class":681},[671,876,878,880,882,884,887],{"class":673,"line":877},13,[671,879,829],{"class":760},[671,881,542],{"class":681},[671,883,695],{"class":681},[671,885,886],{"class":698},"patch",[671,888,702],{"class":681},[671,890,892],{"class":673,"line":891},14,[671,893,844],{"class":681},[671,895,897,899,902,904,906],{"class":673,"line":896},15,[671,898,798],{"class":681},[671,900,901],{"class":760},"internal.delete",[671,903,772],{"class":681},[671,905,542],{"class":681},[671,907,754],{"class":681},[671,909,911,913,915,917,920,922],{"class":673,"line":910},16,[671,912,812],{"class":760},[671,914,542],{"class":681},[671,916,695],{"class":681},[671,918,919],{"class":698},"\u002Fv1\u002Finventory\u002Finternal\u002Fproducts\u002Ffeatures\u002F:featureId",[671,921,772],{"class":681},[671,923,782],{"class":681},[671,925,927,929,931,933,935],{"class":673,"line":926},17,[671,928,829],{"class":760},[671,930,542],{"class":681},[671,932,695],{"class":681},[671,934,629],{"class":698},[671,936,702],{"class":681},[671,938,940],{"class":673,"line":939},18,[671,941,942],{"class":681},"    }\n",[671,944,946],{"class":673,"line":945},19,[671,947,948],{"class":681},"  }\n",[671,950,952],{"class":673,"line":951},20,[671,953,954],{"class":681},"}\n",[671,956,958],{"class":673,"line":957},21,[671,959,733],{"emptyLinePlaceholder":732},[671,961,963,966,969],{"class":673,"line":962},22,[671,964,965],{"class":677},"export",[671,967,968],{"class":677}," default",[671,970,971],{"class":685}," config\n",[423,973,975],{"id":974},"configuration-options","Configuration Options",[544,977,978,994],{},[547,979,980],{},[550,981,982,985,988,991],{},[553,983,984],{},"Option",[553,986,987],{},"Type",[553,989,990],{},"Default",[553,992,993],{},"Description",[566,995,996,1019,1052,1081,1102,1129],{},[550,997,998,1003,1008,1013],{},[571,999,1000],{},[384,1001,1002],{},"path",[571,1004,1005],{},[384,1006,1007],{},"string",[571,1009,1010],{},[434,1011,1012],{},"(Required)",[571,1014,1015,1016,390],{},"The endpoint URL template. Can include path parameters prefixed with a colon (e.g. ",[384,1017,1018],{},":id",[550,1020,1021,1026,1030,1035],{},[571,1022,1023],{},[384,1024,1025],{},"method",[571,1027,1028],{},[384,1029,1007],{},[571,1031,1032],{},[384,1033,1034],{},"'get'",[571,1036,1037,1038,407,1040,407,1043,407,1046,407,1049,390],{},"HTTP method (",[384,1039,1034],{},[384,1041,1042],{},"'post'",[384,1044,1045],{},"'put'",[384,1047,1048],{},"'patch'",[384,1050,1051],{},"'delete'",[550,1053,1054,1059,1064,1069],{},[571,1055,1056],{},[384,1057,1058],{},"model",[571,1060,1061],{},[384,1062,1063],{},"Class | Object | null",[571,1065,1066],{},[384,1067,1068],{},"undefined",[571,1070,1071,1072,1074,1075,1077,1078,390],{},"Data model class (",[384,1073,414],{}," subclass, ",[384,1076,417],{},", array, plain object, or ",[384,1079,1080],{},"null",[550,1082,1083,1087,1092,1096],{},[571,1084,1085],{},[384,1086,449],{},[571,1088,1089],{},[384,1090,1091],{},"Class | Object",[571,1093,1094],{},[384,1095,1068],{},[571,1097,1098,1099,1101],{},"Query model class (",[384,1100,420],{}," subclass or plain object) for managing search and filter parameters.",[550,1103,1104,1109,1114,1117],{},[571,1105,1106],{},[384,1107,1108],{},"multiple",[571,1110,1111],{},[384,1112,1113],{},"boolean",[571,1115,1116],{},"Auto-detected",[571,1118,1119,1120,1123,1124,1126,1127,477],{},"Set to ",[384,1121,1122],{},"true"," if response represents an array or collection. Automatically inferred if ",[384,1125,1058],{}," is an Array or ",[384,1128,417],{},[550,1130,1131,1136,1140,1144],{},[571,1132,1133],{},[384,1134,1135],{},"authentication",[571,1137,1138],{},[384,1139,1113],{},[571,1141,1142],{},[384,1143,1122],{},[571,1145,1146,1147,1149,1150,1153],{},"When ",[384,1148,1122],{},", automatically waits for user authentication and injects the ",[384,1151,1152],{},"Authorization"," Bearer token header.",[423,1155,1157,1158,1160,1161,1163,1164,1166],{"id":1156},"advanced-apiconfig-model-and-query-patterns","Advanced ",[384,1159,526],{},": ",[384,1162,1058],{}," and ",[384,1165,449],{}," Patterns",[380,1168,1169,1170,1163,1172,1174,1175,1177],{},"When defining an API module, ",[384,1171,1058],{},[384,1173,449],{}," options can be declared at the module root (",[384,1176,526],{}," level) or overridden per endpoint.",[1179,1180,1182],"h4",{"id":1181},"_1-module-level-defaults-vs-endpoint-overrides","1. Module-Level Defaults vs. Endpoint Overrides",[428,1184,1185,1199],{},[431,1186,1187,1190,1191,473,1193,1195,1196,1198],{},[434,1188,1189],{},"Module-Level Default",": Declaring ",[384,1192,1058],{},[384,1194,449],{}," at the root of ",[384,1197,526],{}," applies that configuration as a fallback for all endpoints in the module.",[431,1200,1201,1204,1205,473,1207,1209],{},[434,1202,1203],{},"Endpoint-Level Override",": An endpoint can specify its own ",[384,1206,1058],{},[384,1208,449],{}," to override the module-wide default.",[1179,1211,1213],{"id":1212},"_2-model-configuration-options","2. Model Configuration Options",[428,1215,1216,1235,1255,1264],{},[431,1217,1218,1223,1224,1227,1228,1230,1231,1234],{},[434,1219,1220,1222],{},[384,1221,414],{}," Subclass"," (",[384,1225,1226],{},"model: TaskHubInterviewModel","): ",[384,1229,205],{}," instantiates and calls ",[384,1232,1233],{},"setup()"," on the class.",[431,1236,1237,1223,1242,473,1245,1248,1249,1252,1253,477],{},[434,1238,1239,1240],{},"Array \u002F ",[384,1241,417],{},[384,1243,1244],{},"model: [TaskHubInterviewModel]",[384,1246,1247],{},"ProductListModel","): Automatically flags ",[384,1250,1251],{},"multiple = true"," and wraps items in a ",[384,1254,417],{},[431,1256,1257,1223,1260,1263],{},[434,1258,1259],{},"Plain Object Literal",[384,1261,1262],{},"model: { url: '' }","): For lightweight key-value payloads that do not require full model features.",[431,1265,1266,1223,1270,1273],{},[434,1267,1268],{},[384,1269,1080],{},[384,1271,1272],{},"model: null","): Explicitly specifies that an endpoint (e.g. DELETE or bodyless PATCH) does not send or expect a model body.",[1179,1275,1277],{"id":1276},"_3-query-configuration-options","3. Query Configuration Options",[428,1279,1280,1292],{},[431,1281,1282,1223,1286,1289,1290,477],{},[434,1283,1284,1222],{},[384,1285,420],{},[384,1287,1288],{},"query: TaskHubInterviewQuery","): Automatically instantiated and initialized by ",[384,1291,205],{},[431,1293,1294,1223,1296,1299,1300,1302,1303,1306],{},[434,1295,1259],{},[384,1297,1298],{},"query: { term: '', filter: 'active' }","): Automatically wrapped by ",[384,1301,205],{}," into a ",[384,1304,1305],{},"WrappedQuery"," instance.",[1179,1308,1310],{"id":1309},"real-world-api-module-example","Real-World API Module Example",[662,1312,1314],{"className":664,"code":1313,"filename":641,"language":666,"meta":667,"style":667},"import { useConfig } from '@\u002Fcomposables\u002FuseConfig.ts'\nimport TaskHubInterviewQuery from '@\u002Fmodels\u002FApi\u002FQuery\u002FTaskHubInterviewQuery.ts'\nimport { TaskHubInterviewModel } from '@\u002Fmodels\u002FData\u002FTaskHub\u002FTaskHubInterviewModel.ts'\nimport { TaskHubInterviewStatsModel } from '@\u002Fmodels\u002FData\u002FTaskHub\u002FTaskHubInterviewStatsModel.ts'\nimport type { APIConfig } from '@\u002Ftypes\u002Fapi'\n\nconst config: APIConfig = {\n  baseURL: useConfig('api.esp'),\n\n  \u002F\u002F Module-wide default model: inherited by 'list' and 'show' below\n  model: TaskHubInterviewModel,\n\n  endpoints: {\n    \u002F\u002F 1. Uses module-level TaskHubInterviewModel + query class + multiple collection flag\n    list: {\n      path: '\u002Fv1\u002Fuser-tasks',\n      multiple: true,\n      query: TaskHubInterviewQuery\n    },\n\n    \u002F\u002F 2. Automatically inherits module-level TaskHubInterviewModel\n    show: {\n      path: '\u002Fv1\u002Fuser-tasks\u002F:interviewId'\n    },\n\n    \u002F\u002F 3. Overrides model with a lightweight plain object literal\n    link: {\n      path: '\u002Fv1\u002Fuser-tasks\u002F:interviewId\u002Furl',\n      model: { url: '' }\n    },\n\n    \u002F\u002F 4. Overrides model with a specific BaseDataModel class + custom query model\n    stats: {\n      path: '\u002Fv1\u002Fuser-tasks\u002Fstats',\n      model: TaskHubInterviewStatsModel,\n      query: TaskHubInterviewQuery\n    },\n\n    \u002F\u002F 5. Overrides model with null for actions without a body payload\n    'group.delete': {\n      path: '\u002Fv1\u002Fuser-tasks\u002Fgroups\u002F:groupId',\n      method: 'delete',\n      model: null\n    },\n\n    \u002F\u002F 6. Overrides model with null for action patch\n    'group.reminder': {\n      path: '\u002Fv1\u002Fuser-tasks\u002Fgroups\u002F:groupId\u002Femails',\n      method: 'patch',\n      model: null\n    }\n  }\n}\n\nexport default config\n",[384,1315,1316,1334,1351,1371,1391,1411,1415,1429,1449,1453,1459,1470,1474,1482,1487,1496,1511,1524,1534,1538,1542,1547,1556,1570,1575,1580,1586,1596,1612,1633,1638,1643,1649,1659,1675,1686,1695,1700,1705,1711,1725,1741,1756,1766,1771,1776,1782,1796,1812,1827,1836,1841,1846,1851,1856],{"__ignoreMap":667},[671,1317,1318,1320,1322,1324,1326,1328,1330,1332],{"class":673,"line":674},[671,1319,678],{"class":677},[671,1321,682],{"class":681},[671,1323,686],{"class":685},[671,1325,689],{"class":681},[671,1327,692],{"class":677},[671,1329,695],{"class":681},[671,1331,699],{"class":698},[671,1333,702],{"class":681},[671,1335,1336,1338,1341,1344,1346,1349],{"class":673,"line":705},[671,1337,678],{"class":677},[671,1339,1340],{"class":685}," TaskHubInterviewQuery ",[671,1342,1343],{"class":677},"from",[671,1345,695],{"class":681},[671,1347,1348],{"class":698},"@\u002Fmodels\u002FApi\u002FQuery\u002FTaskHubInterviewQuery.ts",[671,1350,702],{"class":681},[671,1352,1353,1355,1357,1360,1362,1364,1366,1369],{"class":673,"line":729},[671,1354,678],{"class":677},[671,1356,682],{"class":681},[671,1358,1359],{"class":685}," TaskHubInterviewModel",[671,1361,689],{"class":681},[671,1363,692],{"class":677},[671,1365,695],{"class":681},[671,1367,1368],{"class":698},"@\u002Fmodels\u002FData\u002FTaskHub\u002FTaskHubInterviewModel.ts",[671,1370,702],{"class":681},[671,1372,1373,1375,1377,1380,1382,1384,1386,1389],{"class":673,"line":736},[671,1374,678],{"class":677},[671,1376,682],{"class":681},[671,1378,1379],{"class":685}," TaskHubInterviewStatsModel",[671,1381,689],{"class":681},[671,1383,692],{"class":677},[671,1385,695],{"class":681},[671,1387,1388],{"class":698},"@\u002Fmodels\u002FData\u002FTaskHub\u002FTaskHubInterviewStatsModel.ts",[671,1390,702],{"class":681},[671,1392,1393,1395,1397,1399,1401,1403,1405,1407,1409],{"class":673,"line":757},[671,1394,678],{"class":677},[671,1396,710],{"class":677},[671,1398,682],{"class":681},[671,1400,715],{"class":685},[671,1402,689],{"class":681},[671,1404,692],{"class":677},[671,1406,695],{"class":681},[671,1408,724],{"class":698},[671,1410,702],{"class":681},[671,1412,1413],{"class":673,"line":785},[671,1414,733],{"emptyLinePlaceholder":732},[671,1416,1417,1419,1421,1423,1425,1427],{"class":673,"line":795},[671,1418,740],{"class":739},[671,1420,743],{"class":685},[671,1422,542],{"class":681},[671,1424,715],{"class":748},[671,1426,751],{"class":681},[671,1428,754],{"class":681},[671,1430,1431,1433,1435,1437,1439,1441,1443,1445,1447],{"class":673,"line":809},[671,1432,761],{"class":760},[671,1434,542],{"class":681},[671,1436,686],{"class":766},[671,1438,769],{"class":685},[671,1440,772],{"class":681},[671,1442,775],{"class":698},[671,1444,772],{"class":681},[671,1446,510],{"class":685},[671,1448,782],{"class":681},[671,1450,1451],{"class":673,"line":826},[671,1452,733],{"emptyLinePlaceholder":732},[671,1454,1455],{"class":673,"line":841},[671,1456,1458],{"class":1457},"sHwdD","  \u002F\u002F Module-wide default model: inherited by 'list' and 'show' below\n",[671,1460,1461,1464,1466,1468],{"class":673,"line":847},[671,1462,1463],{"class":760},"  model",[671,1465,542],{"class":681},[671,1467,1359],{"class":685},[671,1469,782],{"class":681},[671,1471,1472],{"class":673,"line":861},[671,1473,733],{"emptyLinePlaceholder":732},[671,1475,1476,1478,1480],{"class":673,"line":877},[671,1477,788],{"class":760},[671,1479,542],{"class":681},[671,1481,754],{"class":681},[671,1483,1484],{"class":673,"line":891},[671,1485,1486],{"class":1457},"    \u002F\u002F 1. Uses module-level TaskHubInterviewModel + query class + multiple collection flag\n",[671,1488,1489,1492,1494],{"class":673,"line":896},[671,1490,1491],{"class":760},"    list",[671,1493,542],{"class":681},[671,1495,754],{"class":681},[671,1497,1498,1500,1502,1504,1507,1509],{"class":673,"line":910},[671,1499,812],{"class":760},[671,1501,542],{"class":681},[671,1503,695],{"class":681},[671,1505,1506],{"class":698},"\u002Fv1\u002Fuser-tasks",[671,1508,772],{"class":681},[671,1510,782],{"class":681},[671,1512,1513,1516,1518,1522],{"class":673,"line":926},[671,1514,1515],{"class":760},"      multiple",[671,1517,542],{"class":681},[671,1519,1521],{"class":1520},"sfNiH"," true",[671,1523,782],{"class":681},[671,1525,1526,1529,1531],{"class":673,"line":939},[671,1527,1528],{"class":760},"      query",[671,1530,542],{"class":681},[671,1532,1533],{"class":685}," TaskHubInterviewQuery\n",[671,1535,1536],{"class":673,"line":945},[671,1537,844],{"class":681},[671,1539,1540],{"class":673,"line":951},[671,1541,733],{"emptyLinePlaceholder":732},[671,1543,1544],{"class":673,"line":957},[671,1545,1546],{"class":1457},"    \u002F\u002F 2. Automatically inherits module-level TaskHubInterviewModel\n",[671,1548,1549,1552,1554],{"class":673,"line":962},[671,1550,1551],{"class":760},"    show",[671,1553,542],{"class":681},[671,1555,754],{"class":681},[671,1557,1559,1561,1563,1565,1568],{"class":673,"line":1558},23,[671,1560,812],{"class":760},[671,1562,542],{"class":681},[671,1564,695],{"class":681},[671,1566,1567],{"class":698},"\u002Fv1\u002Fuser-tasks\u002F:interviewId",[671,1569,702],{"class":681},[671,1571,1573],{"class":673,"line":1572},24,[671,1574,844],{"class":681},[671,1576,1578],{"class":673,"line":1577},25,[671,1579,733],{"emptyLinePlaceholder":732},[671,1581,1583],{"class":673,"line":1582},26,[671,1584,1585],{"class":1457},"    \u002F\u002F 3. Overrides model with a lightweight plain object literal\n",[671,1587,1589,1592,1594],{"class":673,"line":1588},27,[671,1590,1591],{"class":760},"    link",[671,1593,542],{"class":681},[671,1595,754],{"class":681},[671,1597,1599,1601,1603,1605,1608,1610],{"class":673,"line":1598},28,[671,1600,812],{"class":760},[671,1602,542],{"class":681},[671,1604,695],{"class":681},[671,1606,1607],{"class":698},"\u002Fv1\u002Fuser-tasks\u002F:interviewId\u002Furl",[671,1609,772],{"class":681},[671,1611,782],{"class":681},[671,1613,1615,1618,1620,1622,1625,1627,1630],{"class":673,"line":1614},29,[671,1616,1617],{"class":760},"      model",[671,1619,542],{"class":681},[671,1621,682],{"class":681},[671,1623,1624],{"class":760}," url",[671,1626,542],{"class":681},[671,1628,1629],{"class":681}," ''",[671,1631,1632],{"class":681}," }\n",[671,1634,1636],{"class":673,"line":1635},30,[671,1637,844],{"class":681},[671,1639,1641],{"class":673,"line":1640},31,[671,1642,733],{"emptyLinePlaceholder":732},[671,1644,1646],{"class":673,"line":1645},32,[671,1647,1648],{"class":1457},"    \u002F\u002F 4. Overrides model with a specific BaseDataModel class + custom query model\n",[671,1650,1652,1655,1657],{"class":673,"line":1651},33,[671,1653,1654],{"class":760},"    stats",[671,1656,542],{"class":681},[671,1658,754],{"class":681},[671,1660,1662,1664,1666,1668,1671,1673],{"class":673,"line":1661},34,[671,1663,812],{"class":760},[671,1665,542],{"class":681},[671,1667,695],{"class":681},[671,1669,1670],{"class":698},"\u002Fv1\u002Fuser-tasks\u002Fstats",[671,1672,772],{"class":681},[671,1674,782],{"class":681},[671,1676,1678,1680,1682,1684],{"class":673,"line":1677},35,[671,1679,1617],{"class":760},[671,1681,542],{"class":681},[671,1683,1379],{"class":685},[671,1685,782],{"class":681},[671,1687,1689,1691,1693],{"class":673,"line":1688},36,[671,1690,1528],{"class":760},[671,1692,542],{"class":681},[671,1694,1533],{"class":685},[671,1696,1698],{"class":673,"line":1697},37,[671,1699,844],{"class":681},[671,1701,1703],{"class":673,"line":1702},38,[671,1704,733],{"emptyLinePlaceholder":732},[671,1706,1708],{"class":673,"line":1707},39,[671,1709,1710],{"class":1457},"    \u002F\u002F 5. Overrides model with null for actions without a body payload\n",[671,1712,1714,1716,1719,1721,1723],{"class":673,"line":1713},40,[671,1715,798],{"class":681},[671,1717,1718],{"class":760},"group.delete",[671,1720,772],{"class":681},[671,1722,542],{"class":681},[671,1724,754],{"class":681},[671,1726,1728,1730,1732,1734,1737,1739],{"class":673,"line":1727},41,[671,1729,812],{"class":760},[671,1731,542],{"class":681},[671,1733,695],{"class":681},[671,1735,1736],{"class":698},"\u002Fv1\u002Fuser-tasks\u002Fgroups\u002F:groupId",[671,1738,772],{"class":681},[671,1740,782],{"class":681},[671,1742,1744,1746,1748,1750,1752,1754],{"class":673,"line":1743},42,[671,1745,829],{"class":760},[671,1747,542],{"class":681},[671,1749,695],{"class":681},[671,1751,629],{"class":698},[671,1753,772],{"class":681},[671,1755,782],{"class":681},[671,1757,1759,1761,1763],{"class":673,"line":1758},43,[671,1760,1617],{"class":760},[671,1762,542],{"class":681},[671,1764,1765],{"class":681}," null\n",[671,1767,1769],{"class":673,"line":1768},44,[671,1770,844],{"class":681},[671,1772,1774],{"class":673,"line":1773},45,[671,1775,733],{"emptyLinePlaceholder":732},[671,1777,1779],{"class":673,"line":1778},46,[671,1780,1781],{"class":1457},"    \u002F\u002F 6. Overrides model with null for action patch\n",[671,1783,1785,1787,1790,1792,1794],{"class":673,"line":1784},47,[671,1786,798],{"class":681},[671,1788,1789],{"class":760},"group.reminder",[671,1791,772],{"class":681},[671,1793,542],{"class":681},[671,1795,754],{"class":681},[671,1797,1799,1801,1803,1805,1808,1810],{"class":673,"line":1798},48,[671,1800,812],{"class":760},[671,1802,542],{"class":681},[671,1804,695],{"class":681},[671,1806,1807],{"class":698},"\u002Fv1\u002Fuser-tasks\u002Fgroups\u002F:groupId\u002Femails",[671,1809,772],{"class":681},[671,1811,782],{"class":681},[671,1813,1815,1817,1819,1821,1823,1825],{"class":673,"line":1814},49,[671,1816,829],{"class":760},[671,1818,542],{"class":681},[671,1820,695],{"class":681},[671,1822,886],{"class":698},[671,1824,772],{"class":681},[671,1826,782],{"class":681},[671,1828,1830,1832,1834],{"class":673,"line":1829},50,[671,1831,1617],{"class":760},[671,1833,542],{"class":681},[671,1835,1765],{"class":681},[671,1837,1839],{"class":673,"line":1838},51,[671,1840,942],{"class":681},[671,1842,1844],{"class":673,"line":1843},52,[671,1845,948],{"class":681},[671,1847,1849],{"class":673,"line":1848},53,[671,1850,954],{"class":681},[671,1852,1854],{"class":673,"line":1853},54,[671,1855,733],{"emptyLinePlaceholder":732},[671,1857,1859,1861,1863],{"class":673,"line":1858},55,[671,1860,965],{"class":677},[671,1862,968],{"class":677},[671,1864,971],{"class":685},[501,1866],{},[375,1868,1870,1871,510],{"id":1869},"automatic-type-safety-vite-plugin-api-types","Automatic Type Safety (",[384,1872,1873],{},"vite-plugin-api-types",[380,1875,1876,1877,1880],{},"The platform uses a custom Vite plugin (",[384,1878,1879],{},"src\u002Fplugins\u002Fapi\u002Fvite.mts",") to auto-generate TypeScript definitions for registered endpoints.",[1882,1883,1884,1885,1888,1889,1892,1893,1895,1896,1899,1900,1903],"tip",{},"During development (",[384,1886,1887],{},"vite dev",") and build (",[384,1890,1891],{},"vite build","), the plugin watches ",[384,1894,516],{}," and updates ",[384,1897,1898],{},"api-registry.d.ts"," in the project root. This populates the global ",[384,1901,1902],{},"APIRegistry"," interface, giving IDE autocomplete and type errors for invalid API keys.",[662,1905,1907],{"className":664,"code":1906,"language":666,"meta":667,"style":667},"\u002F\u002F Autocomplete suggests valid endpoints such as 'meta.tags', 'feature.internal.create', etc.\nconst tags = useAPI('meta.tags')\n",[384,1908,1909,1914],{"__ignoreMap":667},[671,1910,1911],{"class":673,"line":674},[671,1912,1913],{"class":1457},"\u002F\u002F Autocomplete suggests valid endpoints such as 'meta.tags', 'feature.internal.create', etc.\n",[671,1915,1916,1918,1921,1924,1927,1929,1931,1934,1936],{"class":673,"line":705},[671,1917,740],{"class":739},[671,1919,1920],{"class":685}," tags ",[671,1922,1923],{"class":681},"=",[671,1925,1926],{"class":766}," useAPI",[671,1928,769],{"class":685},[671,1930,772],{"class":681},[671,1932,1933],{"class":698},"meta.tags",[671,1935,772],{"class":681},[671,1937,1938],{"class":685},")\n",[501,1940],{},[375,1942,1944,1945,1947,1948,510],{"id":1943},"data-models-basedatamodel-baselistmodel","Data Models (",[384,1946,414],{}," & ",[384,1949,417],{},[380,1951,1952,1953,1955],{},"Data Models define the structure, default values, and mutation behaviors of entities returned by or sent to backend APIs. ",[384,1954,205],{}," automatically instantiates and binds response resource objects to these data models.",[423,1957,1959,1960],{"id":1958},"subclassing-basedatamodel","Subclassing ",[384,1961,414],{},[380,1963,1964,1965,542],{},"To create a single-entity data model, extend ",[384,1966,414],{},[662,1968,1971],{"className":664,"code":1969,"filename":1970,"language":666,"meta":667,"style":667},"import BaseDataModel from '@\u002Fmodels\u002FData\u002FUtility\u002FBaseDataModel'\n\nexport default class ProductModel extends BaseDataModel {\n  id: string = ''\n  name: string = ''\n  description: string = ''\n  active: boolean = true\n\n  constructor() {\n    super()\n  }\n}\n","src\u002Fmodels\u002FData\u002FInventory\u002FProductModel.ts",[384,1972,1973,1989,1993,2013,2028,2041,2054,2069,2073,2083,2091,2095],{"__ignoreMap":667},[671,1974,1975,1977,1980,1982,1984,1987],{"class":673,"line":674},[671,1976,678],{"class":677},[671,1978,1979],{"class":685}," BaseDataModel ",[671,1981,1343],{"class":677},[671,1983,695],{"class":681},[671,1985,1986],{"class":698},"@\u002Fmodels\u002FData\u002FUtility\u002FBaseDataModel",[671,1988,702],{"class":681},[671,1990,1991],{"class":673,"line":705},[671,1992,733],{"emptyLinePlaceholder":732},[671,1994,1995,1997,1999,2002,2005,2008,2011],{"class":673,"line":729},[671,1996,965],{"class":677},[671,1998,968],{"class":677},[671,2000,2001],{"class":739}," class",[671,2003,2004],{"class":748}," ProductModel",[671,2006,2007],{"class":739}," extends",[671,2009,2010],{"class":748}," BaseDataModel",[671,2012,754],{"class":681},[671,2014,2015,2018,2020,2023,2025],{"class":673,"line":736},[671,2016,2017],{"class":760},"  id",[671,2019,542],{"class":681},[671,2021,2022],{"class":748}," string",[671,2024,751],{"class":681},[671,2026,2027],{"class":681}," ''\n",[671,2029,2030,2033,2035,2037,2039],{"class":673,"line":757},[671,2031,2032],{"class":760},"  name",[671,2034,542],{"class":681},[671,2036,2022],{"class":748},[671,2038,751],{"class":681},[671,2040,2027],{"class":681},[671,2042,2043,2046,2048,2050,2052],{"class":673,"line":785},[671,2044,2045],{"class":760},"  description",[671,2047,542],{"class":681},[671,2049,2022],{"class":748},[671,2051,751],{"class":681},[671,2053,2027],{"class":681},[671,2055,2056,2059,2061,2064,2066],{"class":673,"line":795},[671,2057,2058],{"class":760},"  active",[671,2060,542],{"class":681},[671,2062,2063],{"class":748}," boolean",[671,2065,751],{"class":681},[671,2067,2068],{"class":1520}," true\n",[671,2070,2071],{"class":673,"line":809},[671,2072,733],{"emptyLinePlaceholder":732},[671,2074,2075,2078,2081],{"class":673,"line":826},[671,2076,2077],{"class":739},"  constructor",[671,2079,2080],{"class":681},"()",[671,2082,754],{"class":681},[671,2084,2085,2088],{"class":673,"line":841},[671,2086,2087],{"class":685},"    super",[671,2089,2090],{"class":760},"()\n",[671,2092,2093],{"class":673,"line":847},[671,2094,948],{"class":681},[671,2096,2097],{"class":673,"line":861},[671,2098,954],{"class":681},[423,2100,2102,2103,2105],{"id":2101},"automatic-nested-baselistmodel-instantiation","Automatic Nested ",[384,2104,417],{}," Instantiation",[380,2107,2108,2109,2111,2112,390],{},"When defining nested model relationships in a ",[384,2110,414],{},", you can declare an array attribute initialized with the target model class or instance (e.g. ",[384,2113,2114],{},"products = [ProductModel]",[380,2116,2117,2118,407,2120,2122,2123,2125,2126,542],{},"During ",[384,2119,1233],{},[384,2121,414],{}," automatically converts array properties containing a ",[384,2124,414],{}," class constructor or instance into an auto-instantiated ",[384,2127,417],{},[662,2129,2132],{"className":664,"code":2130,"filename":2131,"language":666,"meta":667,"style":667},"import BaseDataModel from '@\u002Fmodels\u002FData\u002FUtility\u002FBaseDataModel'\nimport ProductModel from '@\u002Fmodels\u002FData\u002FInventory\u002FProductModel'\n\nexport default class VendorModel extends BaseDataModel {\n  id: string = ''\n  name: string = ''\n\n  \u002F\u002F Declaring [ProductModel] automatically converts 'products' into a BaseListModel\u003CProductModel>\n  products = [ProductModel]\n\n  constructor() {\n    super()\n  }\n}\n","src\u002Fmodels\u002FData\u002FInventory\u002FVendorModel.ts",[384,2133,2134,2148,2164,2168,2185,2197,2209,2213,2218,2228,2232,2240,2246,2250],{"__ignoreMap":667},[671,2135,2136,2138,2140,2142,2144,2146],{"class":673,"line":674},[671,2137,678],{"class":677},[671,2139,1979],{"class":685},[671,2141,1343],{"class":677},[671,2143,695],{"class":681},[671,2145,1986],{"class":698},[671,2147,702],{"class":681},[671,2149,2150,2152,2155,2157,2159,2162],{"class":673,"line":705},[671,2151,678],{"class":677},[671,2153,2154],{"class":685}," ProductModel ",[671,2156,1343],{"class":677},[671,2158,695],{"class":681},[671,2160,2161],{"class":698},"@\u002Fmodels\u002FData\u002FInventory\u002FProductModel",[671,2163,702],{"class":681},[671,2165,2166],{"class":673,"line":729},[671,2167,733],{"emptyLinePlaceholder":732},[671,2169,2170,2172,2174,2176,2179,2181,2183],{"class":673,"line":736},[671,2171,965],{"class":677},[671,2173,968],{"class":677},[671,2175,2001],{"class":739},[671,2177,2178],{"class":748}," VendorModel",[671,2180,2007],{"class":739},[671,2182,2010],{"class":748},[671,2184,754],{"class":681},[671,2186,2187,2189,2191,2193,2195],{"class":673,"line":757},[671,2188,2017],{"class":760},[671,2190,542],{"class":681},[671,2192,2022],{"class":748},[671,2194,751],{"class":681},[671,2196,2027],{"class":681},[671,2198,2199,2201,2203,2205,2207],{"class":673,"line":785},[671,2200,2032],{"class":760},[671,2202,542],{"class":681},[671,2204,2022],{"class":748},[671,2206,751],{"class":681},[671,2208,2027],{"class":681},[671,2210,2211],{"class":673,"line":795},[671,2212,733],{"emptyLinePlaceholder":732},[671,2214,2215],{"class":673,"line":809},[671,2216,2217],{"class":1457},"  \u002F\u002F Declaring [ProductModel] automatically converts 'products' into a BaseListModel\u003CProductModel>\n",[671,2219,2220,2223,2225],{"class":673,"line":826},[671,2221,2222],{"class":760},"  products",[671,2224,751],{"class":681},[671,2226,2227],{"class":685}," [ProductModel]\n",[671,2229,2230],{"class":673,"line":841},[671,2231,733],{"emptyLinePlaceholder":732},[671,2233,2234,2236,2238],{"class":673,"line":847},[671,2235,2077],{"class":739},[671,2237,2080],{"class":681},[671,2239,754],{"class":681},[671,2241,2242,2244],{"class":673,"line":861},[671,2243,2087],{"class":685},[671,2245,2090],{"class":760},[671,2247,2248],{"class":673,"line":877},[671,2249,948],{"class":681},[671,2251,2252],{"class":673,"line":891},[671,2253,954],{"class":681},[1882,2255,1146,2256,473,2258,2261,2262,2265,2266,2269,2270,2273,2274,2277,2278,477],{},[384,2257,1233],{},[384,2259,2260],{},"assign()"," runs, ",[384,2263,2264],{},"VendorModel.products"," is automatically transformed into ",[384,2267,2268],{},"new BaseListModel(ProductModel)",". Any incoming JSON data for ",[384,2271,2272],{},"products"," will then be instantiated and cast as ",[384,2275,2276],{},"ProductModel"," items within the ",[384,2279,417],{},[423,2281,2283],{"id":2282},"model-lifecycle-state-tracking","Model Lifecycle & State Tracking",[380,2285,2286,2288],{},[384,2287,414],{}," tracks internal snapshots of model state to support dirty-checking, rollback, and selective property serialization:",[428,2290,2291,2302,2310,2323],{},[431,2292,2293,2298,2299,2301],{},[434,2294,2295],{},[384,2296,2297],{},"__original",": Snapshot of the object state after ",[384,2300,1233],{}," is first called.",[431,2303,2304,2309],{},[434,2305,2306],{},[384,2307,2308],{},"__previous",": Snapshot of the last committed or assigned state.",[431,2311,2312,2317,2318,2320,2321,477],{},[434,2313,2314],{},[384,2315,2316],{},"isDirty",": Getter returning ",[384,2319,1122],{}," if current field values differ from ",[384,2322,2308],{},[431,2324,2325,2330,2331,2334,2335,2334,2338,2341],{},[434,2326,2327],{},[384,2328,2329],{},"postable",": Getter returning only enumerable properties suitable for sending in ",[384,2332,2333],{},"POST","\u002F",[384,2336,2337],{},"PUT",[384,2339,2340],{},"PATCH"," request bodies.",[423,2343,2345],{"id":2344},"data-model-methods","Data Model Methods",[544,2347,2348,2360],{},[547,2349,2350],{},[550,2351,2352,2355,2358],{},[553,2353,2354],{},"Method",[553,2356,2357],{},"Signature",[553,2359,993],{},[566,2361,2362,2383,2400,2423,2444,2461],{},[550,2363,2364,2369,2374],{},[571,2365,2366],{},[384,2367,2368],{},"setup(custom?, warn?)",[571,2370,2371],{},[384,2372,2373],{},"(custom?: Partial\u003Cthis>, warn?: boolean) => this",[571,2375,2376,2377,2379,2380,2382],{},"Initializes nested list models, applies custom overrides, and records initial ",[384,2378,2297],{}," \u002F ",[384,2381,2308],{}," snapshots.",[550,2384,2385,2390,2395],{},[571,2386,2387],{},[384,2388,2389],{},"assign(data, cast?, update?)",[571,2391,2392],{},[384,2393,2394],{},"(data?: Partial\u003Cthis>, cast?: boolean, update?: boolean) => this",[571,2396,2397,2398,477],{},"Merges new property values into the model instance, optionally casting types and recording ",[384,2399,2308],{},[550,2401,2402,2407,2412],{},[571,2403,2404],{},[384,2405,2406],{},"update(data, cast?)",[571,2408,2409],{},[384,2410,2411],{},"(data?: Partial\u003Cthis>, cast?: boolean) => this",[571,2413,2414,2415,2418,2419,2422],{},"Alias for ",[384,2416,2417],{},"assign"," with ",[384,2420,2421],{},"update = true"," enabled.",[550,2424,2425,2430,2435],{},[571,2426,2427],{},[384,2428,2429],{},"commited()",[571,2431,2432],{},[384,2433,2434],{},"() => this",[571,2436,2437,2438,2440,2441,2443],{},"Commits the current property state as the new ",[384,2439,2308],{}," reference, clearing the ",[384,2442,2316],{}," flag after a successful save.",[550,2445,2446,2451,2455],{},[571,2447,2448],{},[384,2449,2450],{},"undo()",[571,2452,2453],{},[384,2454,2434],{},[571,2456,2457,2458,2460],{},"Reverts modified property values back to the ",[384,2459,2308],{}," snapshot.",[550,2462,2463,2468,2473],{},[571,2464,2465],{},[384,2466,2467],{},"reset(data?, hard?)",[571,2469,2470],{},[384,2471,2472],{},"(data?: Partial\u003Cthis>, hard?: boolean) => this",[571,2474,2475,2476,2478,2479,2481,2482,477],{},"Reverts the model to ",[384,2477,2297],{}," snapshot values, optionally overriding fields. Performs a ",[384,2480,2429],{}," if ",[384,2483,2484],{},"hard = true",[662,2486,2488],{"className":664,"code":2487,"language":666,"meta":667,"style":667},"const product = new ProductModel().setup({ name: 'Draft Product' })\n\nproduct.name = 'New Name'\nconsole.log(product.isDirty) \u002F\u002F true\n\nproduct.undo()\nconsole.log(product.name) \u002F\u002F 'Draft Product'\n",[384,2489,2490,2532,2536,2555,2576,2580,2591],{"__ignoreMap":667},[671,2491,2492,2494,2497,2499,2502,2504,2506,2508,2511,2513,2516,2519,2521,2523,2526,2528,2530],{"class":673,"line":674},[671,2493,740],{"class":739},[671,2495,2496],{"class":685}," product ",[671,2498,1923],{"class":681},[671,2500,2501],{"class":681}," new",[671,2503,2004],{"class":766},[671,2505,2080],{"class":685},[671,2507,477],{"class":681},[671,2509,2510],{"class":766},"setup",[671,2512,769],{"class":685},[671,2514,2515],{"class":681},"{",[671,2517,2518],{"class":760}," name",[671,2520,542],{"class":681},[671,2522,695],{"class":681},[671,2524,2525],{"class":698},"Draft Product",[671,2527,772],{"class":681},[671,2529,689],{"class":681},[671,2531,1938],{"class":685},[671,2533,2534],{"class":673,"line":705},[671,2535,733],{"emptyLinePlaceholder":732},[671,2537,2538,2541,2543,2546,2548,2550,2553],{"class":673,"line":729},[671,2539,2540],{"class":685},"product",[671,2542,477],{"class":681},[671,2544,2545],{"class":685},"name ",[671,2547,1923],{"class":681},[671,2549,695],{"class":681},[671,2551,2552],{"class":698},"New Name",[671,2554,702],{"class":681},[671,2556,2557,2560,2562,2565,2568,2570,2573],{"class":673,"line":736},[671,2558,2559],{"class":685},"console",[671,2561,477],{"class":681},[671,2563,2564],{"class":766},"log",[671,2566,2567],{"class":685},"(product",[671,2569,477],{"class":681},[671,2571,2572],{"class":685},"isDirty) ",[671,2574,2575],{"class":1457},"\u002F\u002F true\n",[671,2577,2578],{"class":673,"line":757},[671,2579,733],{"emptyLinePlaceholder":732},[671,2581,2582,2584,2586,2589],{"class":673,"line":785},[671,2583,2540],{"class":685},[671,2585,477],{"class":681},[671,2587,2588],{"class":766},"undo",[671,2590,2090],{"class":685},[671,2592,2593,2595,2597,2599,2601,2603,2606],{"class":673,"line":795},[671,2594,2559],{"class":685},[671,2596,477],{"class":681},[671,2598,2564],{"class":766},[671,2600,2567],{"class":685},[671,2602,477],{"class":681},[671,2604,2605],{"class":685},"name) ",[671,2607,2608],{"class":1457},"\u002F\u002F 'Draft Product'\n",[423,2610,2612,2613,510],{"id":2611},"handling-collections-baselistmodel","Handling Collections (",[384,2614,417],{},[380,2616,2617,2618,407,2621,2623,2624,477],{},"When an endpoint returns a list of items or has ",[384,2619,2620],{},"multiple: true",[384,2622,205],{}," wraps the model in a ",[384,2625,417],{},[662,2627,2630],{"className":664,"code":2628,"filename":2629,"language":666,"meta":667,"style":667},"import BaseListModel from '@\u002Fmodels\u002FData\u002FUtility\u002FBaseListModel'\nimport ProductModel from '@\u002Fmodels\u002FData\u002FInventory\u002FProductModel'\n\nexport default class ProductListModel extends BaseListModel\u003Ctypeof ProductModel> {\n  constructor() {\n    super(ProductModel)\n  }\n}\n","src\u002Fmodels\u002FData\u002FInventory\u002FProductListModel.ts",[384,2631,2632,2648,2662,2666,2692,2700,2710,2714],{"__ignoreMap":667},[671,2633,2634,2636,2639,2641,2643,2646],{"class":673,"line":674},[671,2635,678],{"class":677},[671,2637,2638],{"class":685}," BaseListModel ",[671,2640,1343],{"class":677},[671,2642,695],{"class":681},[671,2644,2645],{"class":698},"@\u002Fmodels\u002FData\u002FUtility\u002FBaseListModel",[671,2647,702],{"class":681},[671,2649,2650,2652,2654,2656,2658,2660],{"class":673,"line":705},[671,2651,678],{"class":677},[671,2653,2154],{"class":685},[671,2655,1343],{"class":677},[671,2657,695],{"class":681},[671,2659,2161],{"class":698},[671,2661,702],{"class":681},[671,2663,2664],{"class":673,"line":729},[671,2665,733],{"emptyLinePlaceholder":732},[671,2667,2668,2670,2672,2674,2677,2679,2682,2685,2687,2690],{"class":673,"line":736},[671,2669,965],{"class":677},[671,2671,968],{"class":677},[671,2673,2001],{"class":739},[671,2675,2676],{"class":748}," ProductListModel",[671,2678,2007],{"class":739},[671,2680,2681],{"class":748}," BaseListModel",[671,2683,2684],{"class":681},"\u003Ctypeof",[671,2686,2004],{"class":685},[671,2688,2689],{"class":681},">",[671,2691,754],{"class":681},[671,2693,2694,2696,2698],{"class":673,"line":757},[671,2695,2077],{"class":739},[671,2697,2080],{"class":681},[671,2699,754],{"class":681},[671,2701,2702,2704,2706,2708],{"class":673,"line":785},[671,2703,2087],{"class":685},[671,2705,769],{"class":760},[671,2707,2276],{"class":685},[671,2709,1938],{"class":760},[671,2711,2712],{"class":673,"line":795},[671,2713,948],{"class":681},[671,2715,2716],{"class":673,"line":809},[671,2717,954],{"class":681},[1179,2719,2721,2722,2724],{"id":2720},"key-baselistmodel-properties-methods","Key ",[384,2723,417],{}," Properties & Methods",[428,2726,2727,2737,2745,2753,2763,2774,2791],{},[431,2728,2729,2733,2734,2736],{},[434,2730,2731],{},[384,2732,651],{},": Array of strongly typed ",[384,2735,414],{}," instances.",[431,2738,2739,2744],{},[434,2740,2741],{},[384,2742,2743],{},"total",": Number of total items available on the backend (populated from paginated API responses).",[431,2746,2747,2752],{},[434,2748,2749],{},[384,2750,2751],{},"pages",": Total page count returned by paginated API responses.",[431,2754,2755,2760,2761,477],{},[434,2756,2757],{},[384,2758,2759],{},"assign(items)",": Instantiates and appends or replaces items in ",[384,2762,651],{},[431,2764,2765,2770,2771,390],{},[434,2766,2767],{},[384,2768,2769],{},"withCache(identifier)",": Enables result caching using a specific key (e.g. ",[384,2772,2773],{},"'id'",[431,2775,2776,2781,2782,2784,2785,2787,2788,477],{},[434,2777,2778],{},[384,2779,2780],{},"clear()",": Empties the ",[384,2783,651],{}," array and resets ",[384,2786,2743],{}," to ",[384,2789,2790],{},"0",[431,2792,2793,2798],{},[434,2794,2795],{},[384,2796,2797],{},"reset(items)",": Re-assigns items and resets pagination metadata.",[501,2800],{},[375,2802,2804,2805,1947,2807,510],{"id":2803},"query-models-basequery-paginationquery","Query Models (",[384,2806,420],{},[384,2808,2809],{},"PaginationQuery",[380,2811,2812],{},"Query Models manage request search filters, sorting options, pagination parameters, and synchronization with Vue Router URL query strings.",[423,2814,1959,2816],{"id":2815},"subclassing-basequery",[384,2817,420],{},[380,2819,2820,2821,2823],{},"Extend ",[384,2822,420],{}," to construct search filter models for non-paginated endpoints:",[662,2825,2828],{"className":664,"code":2826,"filename":2827,"language":666,"meta":667,"style":667},"import BaseQuery from '@\u002Fmodels\u002FApi\u002FUtility\u002FBaseQuery'\n\nexport default class FilterQuery extends BaseQuery {\n  category: string = ''\n  status: string = 'active'\n\n  constructor() {\n    super('filter') \u002F\u002F 'filter' is the query scope prefix\n  }\n}\n","src\u002Fmodels\u002FApi\u002FQuery\u002FFilterQuery.ts",[384,2829,2830,2846,2850,2868,2881,2899,2903,2911,2930,2934],{"__ignoreMap":667},[671,2831,2832,2834,2837,2839,2841,2844],{"class":673,"line":674},[671,2833,678],{"class":677},[671,2835,2836],{"class":685}," BaseQuery ",[671,2838,1343],{"class":677},[671,2840,695],{"class":681},[671,2842,2843],{"class":698},"@\u002Fmodels\u002FApi\u002FUtility\u002FBaseQuery",[671,2845,702],{"class":681},[671,2847,2848],{"class":673,"line":705},[671,2849,733],{"emptyLinePlaceholder":732},[671,2851,2852,2854,2856,2858,2861,2863,2866],{"class":673,"line":729},[671,2853,965],{"class":677},[671,2855,968],{"class":677},[671,2857,2001],{"class":739},[671,2859,2860],{"class":748}," FilterQuery",[671,2862,2007],{"class":739},[671,2864,2865],{"class":748}," BaseQuery",[671,2867,754],{"class":681},[671,2869,2870,2873,2875,2877,2879],{"class":673,"line":736},[671,2871,2872],{"class":760},"  category",[671,2874,542],{"class":681},[671,2876,2022],{"class":748},[671,2878,751],{"class":681},[671,2880,2027],{"class":681},[671,2882,2883,2886,2888,2890,2892,2894,2897],{"class":673,"line":757},[671,2884,2885],{"class":760},"  status",[671,2887,542],{"class":681},[671,2889,2022],{"class":748},[671,2891,751],{"class":681},[671,2893,695],{"class":681},[671,2895,2896],{"class":698},"active",[671,2898,702],{"class":681},[671,2900,2901],{"class":673,"line":785},[671,2902,733],{"emptyLinePlaceholder":732},[671,2904,2905,2907,2909],{"class":673,"line":795},[671,2906,2077],{"class":739},[671,2908,2080],{"class":681},[671,2910,754],{"class":681},[671,2912,2913,2915,2917,2919,2922,2924,2927],{"class":673,"line":809},[671,2914,2087],{"class":685},[671,2916,769],{"class":760},[671,2918,772],{"class":681},[671,2920,2921],{"class":698},"filter",[671,2923,772],{"class":681},[671,2925,2926],{"class":760},") ",[671,2928,2929],{"class":1457},"\u002F\u002F 'filter' is the query scope prefix\n",[671,2931,2932],{"class":673,"line":826},[671,2933,948],{"class":681},[671,2935,2936],{"class":673,"line":841},[671,2937,954],{"class":681},[423,2939,2941],{"id":2940},"query-scoping-router-synchronization","Query Scoping & Router Synchronization",[380,2943,2944,2945,2948],{},"Query models support scoping (",[384,2946,2947],{},"__scope",") to avoid query parameter collisions when multiple components share URL query parameters:",[428,2950,2951,2963,2971,2979],{},[431,2952,2953,2956,2957,2959,2960,477],{},[434,2954,2955],{},"Scoped URL Output",": When a scope is supplied (e.g. ",[384,2958,607],{},"), parameters are rendered with a delimiter in the URL: ",[384,2961,2962],{},"?tags~searchTerm=security",[431,2964,2965,2970],{},[434,2966,2967],{},[384,2968,2969],{},"routable",": Getter returning sanitized query parameter pairs ready for Vue Router.",[431,2972,2973,2978],{},[434,2974,2975],{},[384,2976,2977],{},"go(router, absolute?)",": Updates Vue Router URL query string with current query model properties.",[431,2980,2981,2986],{},[434,2982,2983],{},[384,2984,2985],{},"parse(payload, props?, scope?)",": Deserializes route query strings or parameter objects directly into model properties.",[423,2988,2990],{"id":2989},"deferred-state-draft-filters","Deferred State (Draft Filters)",[380,2992,2993,2994,2997],{},"Query models provide a deferred state (",[384,2995,2996],{},"deferred",") so users can adjust filter controls in a modal or drawer without immediately triggering network requests:",[662,2999,3001],{"className":664,"code":3000,"language":666,"meta":667,"style":667},"const query = new TagsQuery()\n\n\u002F\u002F User edits draft state in form\nquery.deferred.searchTerm = 'compliance'\n\n\u002F\u002F Apply draft changes to active query state\nquery.commit()\n\n\u002F\u002F Or cancel draft changes\nquery.cancel()\n",[384,3002,3003,3019,3023,3028,3050,3054,3059,3070,3074,3079],{"__ignoreMap":667},[671,3004,3005,3007,3010,3012,3014,3017],{"class":673,"line":674},[671,3006,740],{"class":739},[671,3008,3009],{"class":685}," query ",[671,3011,1923],{"class":681},[671,3013,2501],{"class":681},[671,3015,3016],{"class":766}," TagsQuery",[671,3018,2090],{"class":685},[671,3020,3021],{"class":673,"line":705},[671,3022,733],{"emptyLinePlaceholder":732},[671,3024,3025],{"class":673,"line":729},[671,3026,3027],{"class":1457},"\u002F\u002F User edits draft state in form\n",[671,3029,3030,3032,3034,3036,3038,3041,3043,3045,3048],{"class":673,"line":736},[671,3031,449],{"class":685},[671,3033,477],{"class":681},[671,3035,2996],{"class":685},[671,3037,477],{"class":681},[671,3039,3040],{"class":685},"searchTerm ",[671,3042,1923],{"class":681},[671,3044,695],{"class":681},[671,3046,3047],{"class":698},"compliance",[671,3049,702],{"class":681},[671,3051,3052],{"class":673,"line":757},[671,3053,733],{"emptyLinePlaceholder":732},[671,3055,3056],{"class":673,"line":785},[671,3057,3058],{"class":1457},"\u002F\u002F Apply draft changes to active query state\n",[671,3060,3061,3063,3065,3068],{"class":673,"line":795},[671,3062,449],{"class":685},[671,3064,477],{"class":681},[671,3066,3067],{"class":766},"commit",[671,3069,2090],{"class":685},[671,3071,3072],{"class":673,"line":809},[671,3073,733],{"emptyLinePlaceholder":732},[671,3075,3076],{"class":673,"line":826},[671,3077,3078],{"class":1457},"\u002F\u002F Or cancel draft changes\n",[671,3080,3081,3083,3085,3088],{"class":673,"line":841},[671,3082,449],{"class":685},[671,3084,477],{"class":681},[671,3086,3087],{"class":766},"cancel",[671,3089,2090],{"class":685},[1179,3091,3093],{"id":3092},"query-state-control-methods","Query State Control Methods",[544,3095,3096,3104],{},[547,3097,3098],{},[550,3099,3100,3102],{},[553,3101,2354],{},[553,3103,993],{},[566,3105,3106,3119,3132,3146],{},[550,3107,3108,3113],{},[571,3109,3110],{},[384,3111,3112],{},"commit()",[571,3114,3115,3116,3118],{},"Copies values from ",[384,3117,2996],{}," draft state into active query fields and updates filter count.",[550,3120,3121,3126],{},[571,3122,3123],{},[384,3124,3125],{},"cancel()",[571,3127,3128,3129,3131],{},"Reverts ",[384,3130,2996],{}," draft state back to active query parameters.",[550,3133,3134,3138],{},[571,3135,3136],{},[384,3137,2450],{},[571,3139,3128,3140,3142,3143,3145],{},[384,3141,2996],{}," draft state to the ",[384,3144,2308],{}," query state snapshot.",[550,3147,3148,3153],{},[571,3149,3150],{},[384,3151,3152],{},"reset()",[571,3154,3128,3155,3157,3158,3160],{},[384,3156,2996],{}," and active query state to initial ",[384,3159,2297],{}," default values.",[423,3162,3164,3165,510],{"id":3163},"paginated-queries-paginationquery","Paginated Queries (",[384,3166,2809],{},[380,3168,3169,3170,542],{},"For endpoints supporting page numbers, page sizes, and sorting, extend ",[384,3171,2809],{},[662,3173,3176],{"className":664,"code":3174,"filename":3175,"language":666,"meta":667,"style":667},"import PaginationQuery from '@\u002Fmodels\u002FApi\u002FQuery\u002FPaginationQuery'\n\nexport default class TagsQuery extends PaginationQuery {\n  type: string = ''\n  searchTerm: string = ''\n\n  constructor() {\n    super('tags')\n  }\n}\n","src\u002Fmodels\u002FApi\u002FQuery\u002FTagsQuery.ts",[384,3177,3178,3194,3198,3215,3228,3241,3245,3253,3267,3271],{"__ignoreMap":667},[671,3179,3180,3182,3185,3187,3189,3192],{"class":673,"line":674},[671,3181,678],{"class":677},[671,3183,3184],{"class":685}," PaginationQuery ",[671,3186,1343],{"class":677},[671,3188,695],{"class":681},[671,3190,3191],{"class":698},"@\u002Fmodels\u002FApi\u002FQuery\u002FPaginationQuery",[671,3193,702],{"class":681},[671,3195,3196],{"class":673,"line":705},[671,3197,733],{"emptyLinePlaceholder":732},[671,3199,3200,3202,3204,3206,3208,3210,3213],{"class":673,"line":729},[671,3201,965],{"class":677},[671,3203,968],{"class":677},[671,3205,2001],{"class":739},[671,3207,3016],{"class":748},[671,3209,2007],{"class":739},[671,3211,3212],{"class":748}," PaginationQuery",[671,3214,754],{"class":681},[671,3216,3217,3220,3222,3224,3226],{"class":673,"line":736},[671,3218,3219],{"class":760},"  type",[671,3221,542],{"class":681},[671,3223,2022],{"class":748},[671,3225,751],{"class":681},[671,3227,2027],{"class":681},[671,3229,3230,3233,3235,3237,3239],{"class":673,"line":757},[671,3231,3232],{"class":760},"  searchTerm",[671,3234,542],{"class":681},[671,3236,2022],{"class":748},[671,3238,751],{"class":681},[671,3240,2027],{"class":681},[671,3242,3243],{"class":673,"line":785},[671,3244,733],{"emptyLinePlaceholder":732},[671,3246,3247,3249,3251],{"class":673,"line":795},[671,3248,2077],{"class":739},[671,3250,2080],{"class":681},[671,3252,754],{"class":681},[671,3254,3255,3257,3259,3261,3263,3265],{"class":673,"line":809},[671,3256,2087],{"class":685},[671,3258,769],{"class":760},[671,3260,772],{"class":681},[671,3262,607],{"class":698},[671,3264,772],{"class":681},[671,3266,1938],{"class":760},[671,3268,3269],{"class":673,"line":826},[671,3270,948],{"class":681},[671,3272,3273],{"class":673,"line":841},[671,3274,954],{"class":681},[1179,3276,3278,3279,3281],{"id":3277},"built-in-paginationquery-parameters","Built-in ",[384,3280,2809],{}," Parameters",[428,3283,3284,3295,3306,3321,3329,3337],{},[431,3285,3286,3291,3292,390],{},[434,3287,3288],{},[384,3289,3290],{},"page",": 1-indexed page number (automatically converted to 0-indexed for backend API requests in ",[384,3293,3294],{},"configuration",[431,3296,3297,3302,3303,390],{},[434,3298,3299],{},[384,3300,3301],{},"size",": Page size limit (defaults to ",[384,3304,3305],{},"20",[431,3307,3308,3313,3314,3317,3318,477],{},[434,3309,3310],{},[384,3311,3312],{},"sortBy",": Array of sort objects: ",[384,3315,3316],{},"[{ key: 'name', order: 'asc' }]",". Automatically serialized to ",[384,3319,3320],{},"sort: [\"name~A\"]",[431,3322,3323,3328],{},[434,3324,3325],{},[384,3326,3327],{},"groupBy",": Array of grouping items.",[431,3330,3331,3336],{},[434,3332,3333],{},[384,3334,3335],{},"search",": General search string.",[431,3338,3339,3343,3344,477],{},[434,3340,3341],{},[384,3342,3294],{},": Cleansed object passed directly to Axios request parameters by ",[384,3345,205],{},[501,3347],{},[375,3349,3351,3352,3354],{"id":3350},"using-useapi-in-vue-components","Using ",[384,3353,205],{}," in Vue Components",[423,3356,3358],{"id":3357},"_1-destructuring-state-standard-pattern","1. Destructuring State (Standard Pattern)",[380,3360,3361],{},"Best for components that destructure reactive state and trigger execution explicitly or in lifecycle hooks:",[662,3363,3368],{"className":3364,"code":3365,"filename":3366,"language":3367,"meta":667,"style":667},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nimport { onMounted } from 'vue'\nimport { useAPI } from '@\u002Fcomposables\u002FuseAPI'\n\nconst { data, query, execute, loading } = useAPI('meta.tags')\n\nonMounted(() => {\n  execute()\n})\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cv-select\n    v-model=\"query.tag\"\n    :items=\"data\"\n    :loading=\"loading\"\n    label=\"Filter by Tag\"\n  \u002F>\n\u003C\u002Ftemplate>\n","components\u002Ftags-filter.vue","vue",[384,3369,3370,3397,3416,3435,3439,3481,3485,3499,3506,3512,3521,3525,3534,3542,3557,3570,3583,3597,3602],{"__ignoreMap":667},[671,3371,3372,3375,3378,3381,3384,3386,3389,3392,3394],{"class":673,"line":674},[671,3373,3374],{"class":681},"\u003C",[671,3376,3377],{"class":760},"script",[671,3379,3380],{"class":739}," setup",[671,3382,3383],{"class":739}," lang",[671,3385,1923],{"class":681},[671,3387,3388],{"class":681},"\"",[671,3390,3391],{"class":698},"ts",[671,3393,3388],{"class":681},[671,3395,3396],{"class":681},">\n",[671,3398,3399,3401,3403,3406,3408,3410,3412,3414],{"class":673,"line":705},[671,3400,678],{"class":677},[671,3402,682],{"class":681},[671,3404,3405],{"class":685}," onMounted",[671,3407,689],{"class":681},[671,3409,692],{"class":677},[671,3411,695],{"class":681},[671,3413,3367],{"class":698},[671,3415,702],{"class":681},[671,3417,3418,3420,3422,3424,3426,3428,3430,3433],{"class":673,"line":729},[671,3419,678],{"class":677},[671,3421,682],{"class":681},[671,3423,1926],{"class":685},[671,3425,689],{"class":681},[671,3427,692],{"class":677},[671,3429,695],{"class":681},[671,3431,3432],{"class":698},"@\u002Fcomposables\u002FuseAPI",[671,3434,702],{"class":681},[671,3436,3437],{"class":673,"line":736},[671,3438,733],{"emptyLinePlaceholder":732},[671,3440,3441,3443,3445,3448,3451,3454,3456,3459,3461,3464,3467,3469,3471,3473,3475,3477,3479],{"class":673,"line":757},[671,3442,740],{"class":739},[671,3444,682],{"class":681},[671,3446,3447],{"class":685}," data",[671,3449,3450],{"class":681},",",[671,3452,3453],{"class":685}," query",[671,3455,3450],{"class":681},[671,3457,3458],{"class":685}," execute",[671,3460,3450],{"class":681},[671,3462,3463],{"class":685}," loading ",[671,3465,3466],{"class":681},"}",[671,3468,751],{"class":681},[671,3470,1926],{"class":766},[671,3472,769],{"class":685},[671,3474,772],{"class":681},[671,3476,1933],{"class":698},[671,3478,772],{"class":681},[671,3480,1938],{"class":685},[671,3482,3483],{"class":673,"line":785},[671,3484,733],{"emptyLinePlaceholder":732},[671,3486,3487,3490,3492,3494,3497],{"class":673,"line":795},[671,3488,3489],{"class":766},"onMounted",[671,3491,769],{"class":685},[671,3493,2080],{"class":681},[671,3495,3496],{"class":739}," =>",[671,3498,754],{"class":681},[671,3500,3501,3504],{"class":673,"line":809},[671,3502,3503],{"class":766},"  execute",[671,3505,2090],{"class":760},[671,3507,3508,3510],{"class":673,"line":826},[671,3509,3466],{"class":681},[671,3511,1938],{"class":685},[671,3513,3514,3517,3519],{"class":673,"line":841},[671,3515,3516],{"class":681},"\u003C\u002F",[671,3518,3377],{"class":760},[671,3520,3396],{"class":681},[671,3522,3523],{"class":673,"line":847},[671,3524,733],{"emptyLinePlaceholder":732},[671,3526,3527,3529,3532],{"class":673,"line":861},[671,3528,3374],{"class":681},[671,3530,3531],{"class":760},"template",[671,3533,3396],{"class":681},[671,3535,3536,3539],{"class":673,"line":877},[671,3537,3538],{"class":681},"  \u003C",[671,3540,3541],{"class":760},"v-select\n",[671,3543,3544,3547,3549,3551,3554],{"class":673,"line":891},[671,3545,3546],{"class":739},"    v-model",[671,3548,1923],{"class":681},[671,3550,3388],{"class":681},[671,3552,3553],{"class":698},"query.tag",[671,3555,3556],{"class":681},"\"\n",[671,3558,3559,3562,3564,3566,3568],{"class":673,"line":896},[671,3560,3561],{"class":739},"    :items",[671,3563,1923],{"class":681},[671,3565,3388],{"class":681},[671,3567,446],{"class":698},[671,3569,3556],{"class":681},[671,3571,3572,3575,3577,3579,3581],{"class":673,"line":910},[671,3573,3574],{"class":739},"    :loading",[671,3576,1923],{"class":681},[671,3578,3388],{"class":681},[671,3580,452],{"class":698},[671,3582,3556],{"class":681},[671,3584,3585,3588,3590,3592,3595],{"class":673,"line":926},[671,3586,3587],{"class":739},"    label",[671,3589,1923],{"class":681},[671,3591,3388],{"class":681},[671,3593,3594],{"class":698},"Filter by Tag",[671,3596,3556],{"class":681},[671,3598,3599],{"class":673,"line":939},[671,3600,3601],{"class":681},"  \u002F>\n",[671,3603,3604,3606,3608],{"class":673,"line":945},[671,3605,3516],{"class":681},[671,3607,3531],{"class":760},[671,3609,3396],{"class":681},[423,3611,3613],{"id":3612},"_2-reactive-wrapper-pattern","2. Reactive Wrapper Pattern",[380,3615,3616],{},"Best when passing the entire API instance into templates or computed properties:",[662,3618,3621],{"className":3364,"code":3619,"filename":3620,"language":3367,"meta":667,"style":667},"\u003Cscript setup lang=\"ts\">\nimport { reactive, onMounted } from 'vue'\nimport { useAPI } from '@\u002Fcomposables\u002FuseAPI'\n\nconst signals = reactive(useAPI('insights.signals.list'))\n\nonMounted(() => {\n  signals.execute()\n})\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cv-progress-linear v-if=\"signals.loading\" indeterminate \u002F>\n  \u003Cdiv v-else-if=\"signals.loaded\">\n    \u003Cdiv v-for=\"item in signals.data\" :key=\"item.id\">\n      {{ item.title }}\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n","components\u002Finsights-list.vue",[384,3622,3623,3643,3666,3684,3688,3715,3719,3731,3743,3749,3757,3761,3769,3794,3815,3848,3853,3862,3871],{"__ignoreMap":667},[671,3624,3625,3627,3629,3631,3633,3635,3637,3639,3641],{"class":673,"line":674},[671,3626,3374],{"class":681},[671,3628,3377],{"class":760},[671,3630,3380],{"class":739},[671,3632,3383],{"class":739},[671,3634,1923],{"class":681},[671,3636,3388],{"class":681},[671,3638,3391],{"class":698},[671,3640,3388],{"class":681},[671,3642,3396],{"class":681},[671,3644,3645,3647,3649,3652,3654,3656,3658,3660,3662,3664],{"class":673,"line":705},[671,3646,678],{"class":677},[671,3648,682],{"class":681},[671,3650,3651],{"class":685}," reactive",[671,3653,3450],{"class":681},[671,3655,3405],{"class":685},[671,3657,689],{"class":681},[671,3659,692],{"class":677},[671,3661,695],{"class":681},[671,3663,3367],{"class":698},[671,3665,702],{"class":681},[671,3667,3668,3670,3672,3674,3676,3678,3680,3682],{"class":673,"line":729},[671,3669,678],{"class":677},[671,3671,682],{"class":681},[671,3673,1926],{"class":685},[671,3675,689],{"class":681},[671,3677,692],{"class":677},[671,3679,695],{"class":681},[671,3681,3432],{"class":698},[671,3683,702],{"class":681},[671,3685,3686],{"class":673,"line":736},[671,3687,733],{"emptyLinePlaceholder":732},[671,3689,3690,3692,3695,3697,3699,3701,3703,3705,3707,3710,3712],{"class":673,"line":757},[671,3691,740],{"class":739},[671,3693,3694],{"class":685}," signals ",[671,3696,1923],{"class":681},[671,3698,3651],{"class":766},[671,3700,769],{"class":685},[671,3702,205],{"class":766},[671,3704,769],{"class":685},[671,3706,772],{"class":681},[671,3708,3709],{"class":698},"insights.signals.list",[671,3711,772],{"class":681},[671,3713,3714],{"class":685},"))\n",[671,3716,3717],{"class":673,"line":785},[671,3718,733],{"emptyLinePlaceholder":732},[671,3720,3721,3723,3725,3727,3729],{"class":673,"line":795},[671,3722,3489],{"class":766},[671,3724,769],{"class":685},[671,3726,2080],{"class":681},[671,3728,3496],{"class":739},[671,3730,754],{"class":681},[671,3732,3733,3736,3738,3741],{"class":673,"line":809},[671,3734,3735],{"class":685},"  signals",[671,3737,477],{"class":681},[671,3739,3740],{"class":766},"execute",[671,3742,2090],{"class":760},[671,3744,3745,3747],{"class":673,"line":826},[671,3746,3466],{"class":681},[671,3748,1938],{"class":685},[671,3750,3751,3753,3755],{"class":673,"line":841},[671,3752,3516],{"class":681},[671,3754,3377],{"class":760},[671,3756,3396],{"class":681},[671,3758,3759],{"class":673,"line":847},[671,3760,733],{"emptyLinePlaceholder":732},[671,3762,3763,3765,3767],{"class":673,"line":861},[671,3764,3374],{"class":681},[671,3766,3531],{"class":760},[671,3768,3396],{"class":681},[671,3770,3771,3773,3776,3779,3781,3783,3786,3788,3791],{"class":673,"line":877},[671,3772,3538],{"class":681},[671,3774,3775],{"class":760},"v-progress-linear",[671,3777,3778],{"class":739}," v-if",[671,3780,1923],{"class":681},[671,3782,3388],{"class":681},[671,3784,3785],{"class":698},"signals.loading",[671,3787,3388],{"class":681},[671,3789,3790],{"class":739}," indeterminate",[671,3792,3793],{"class":681}," \u002F>\n",[671,3795,3796,3798,3801,3804,3806,3808,3811,3813],{"class":673,"line":891},[671,3797,3538],{"class":681},[671,3799,3800],{"class":760},"div",[671,3802,3803],{"class":739}," v-else-if",[671,3805,1923],{"class":681},[671,3807,3388],{"class":681},[671,3809,3810],{"class":698},"signals.loaded",[671,3812,3388],{"class":681},[671,3814,3396],{"class":681},[671,3816,3817,3820,3822,3825,3827,3829,3832,3834,3837,3839,3841,3844,3846],{"class":673,"line":896},[671,3818,3819],{"class":681},"    \u003C",[671,3821,3800],{"class":760},[671,3823,3824],{"class":739}," v-for",[671,3826,1923],{"class":681},[671,3828,3388],{"class":681},[671,3830,3831],{"class":698},"item in signals.data",[671,3833,3388],{"class":681},[671,3835,3836],{"class":739}," :key",[671,3838,1923],{"class":681},[671,3840,3388],{"class":681},[671,3842,3843],{"class":698},"item.id",[671,3845,3388],{"class":681},[671,3847,3396],{"class":681},[671,3849,3850],{"class":673,"line":910},[671,3851,3852],{"class":685},"      {{ item.title }}\n",[671,3854,3855,3858,3860],{"class":673,"line":926},[671,3856,3857],{"class":681},"    \u003C\u002F",[671,3859,3800],{"class":760},[671,3861,3396],{"class":681},[671,3863,3864,3867,3869],{"class":673,"line":939},[671,3865,3866],{"class":681},"  \u003C\u002F",[671,3868,3800],{"class":760},[671,3870,3396],{"class":681},[671,3872,3873,3875,3877],{"class":673,"line":945},[671,3874,3516],{"class":681},[671,3876,3531],{"class":760},[671,3878,3396],{"class":681},[423,3880,3882,3883,510],{"id":3881},"_3-per-instance-customization-call-site-options","3. Per-Instance Customization (Call-Site ",[384,3884,3885],{},"options",[380,3887,3888,3889,3892,3893,473,3895,3897],{},"When calling ",[384,3890,3891],{},"useAPI('namespace', options)",", you can pass per-instance options to override or customize the endpoint's default ",[384,3894,1058],{},[384,3896,449],{}," configuration at the call site:",[662,3899,3901],{"className":664,"code":3900,"language":666,"meta":667,"style":667},"const api = useAPI('example', {\n  model: { key: 'value' },\n  query: { search: 'term' }\n})\n",[384,3902,3903,3927,3950,3973],{"__ignoreMap":667},[671,3904,3905,3907,3910,3912,3914,3916,3918,3921,3923,3925],{"class":673,"line":674},[671,3906,740],{"class":739},[671,3908,3909],{"class":685}," api ",[671,3911,1923],{"class":681},[671,3913,1926],{"class":766},[671,3915,769],{"class":685},[671,3917,772],{"class":681},[671,3919,3920],{"class":698},"example",[671,3922,772],{"class":681},[671,3924,3450],{"class":681},[671,3926,754],{"class":681},[671,3928,3929,3931,3933,3935,3938,3940,3942,3945,3947],{"class":673,"line":705},[671,3930,1463],{"class":760},[671,3932,542],{"class":681},[671,3934,682],{"class":681},[671,3936,3937],{"class":760}," key",[671,3939,542],{"class":681},[671,3941,695],{"class":681},[671,3943,3944],{"class":698},"value",[671,3946,772],{"class":681},[671,3948,3949],{"class":681}," },\n",[671,3951,3952,3955,3957,3959,3962,3964,3966,3969,3971],{"class":673,"line":729},[671,3953,3954],{"class":760},"  query",[671,3956,542],{"class":681},[671,3958,682],{"class":681},[671,3960,3961],{"class":760}," search",[671,3963,542],{"class":681},[671,3965,695],{"class":681},[671,3967,3968],{"class":698},"term",[671,3970,772],{"class":681},[671,3972,1632],{"class":681},[671,3974,3975,3977],{"class":673,"line":736},[671,3976,3466],{"class":681},[671,3978,1938],{"class":685},[380,3980,3981],{},"This is particularly useful when a component requires a specific initial payload shape, custom query filters, or isolated query scoping.",[1179,3983,3985,3986,3988],{"id":3984},"a-overriding-or-providing-initial-model-payload","A. Overriding or Providing Initial ",[384,3987,1058],{}," Payload",[380,3990,3991,3992,3994],{},"You can pass a static ",[384,3993,414],{}," class constructor, a custom object literal, or a pre-configured model instance:",[662,3996,3998],{"className":664,"code":3997,"language":666,"meta":667,"style":667},"\u002F\u002F 1. Passing a static BaseDataModel class constructor (auto-instantiated and setup by useAPI)\nconst productApi = useAPI('product.internal.update', {\n  model: ProductModel\n})\n\n\u002F\u002F 2. Passing a custom object literal as the initial model payload\nconst featureCreate = useAPI('feature.internal.create', {\n  model: { name: 'New Feature', description: '' }\n})\n\n\u002F\u002F 3. Passing a pre-configured BaseDataModel instance\nconst customProduct = new ProductModel().setup({ active: true })\nconst customProductApi = useAPI('product.internal.update', {\n  model: customProduct\n})\n",[384,3999,4000,4005,4029,4038,4044,4048,4053,4077,4107,4113,4117,4122,4156,4179,4188],{"__ignoreMap":667},[671,4001,4002],{"class":673,"line":674},[671,4003,4004],{"class":1457},"\u002F\u002F 1. Passing a static BaseDataModel class constructor (auto-instantiated and setup by useAPI)\n",[671,4006,4007,4009,4012,4014,4016,4018,4020,4023,4025,4027],{"class":673,"line":705},[671,4008,740],{"class":739},[671,4010,4011],{"class":685}," productApi ",[671,4013,1923],{"class":681},[671,4015,1926],{"class":766},[671,4017,769],{"class":685},[671,4019,772],{"class":681},[671,4021,4022],{"class":698},"product.internal.update",[671,4024,772],{"class":681},[671,4026,3450],{"class":681},[671,4028,754],{"class":681},[671,4030,4031,4033,4035],{"class":673,"line":729},[671,4032,1463],{"class":760},[671,4034,542],{"class":681},[671,4036,4037],{"class":685}," ProductModel\n",[671,4039,4040,4042],{"class":673,"line":736},[671,4041,3466],{"class":681},[671,4043,1938],{"class":685},[671,4045,4046],{"class":673,"line":757},[671,4047,733],{"emptyLinePlaceholder":732},[671,4049,4050],{"class":673,"line":785},[671,4051,4052],{"class":1457},"\u002F\u002F 2. Passing a custom object literal as the initial model payload\n",[671,4054,4055,4057,4060,4062,4064,4066,4068,4071,4073,4075],{"class":673,"line":795},[671,4056,740],{"class":739},[671,4058,4059],{"class":685}," featureCreate ",[671,4061,1923],{"class":681},[671,4063,1926],{"class":766},[671,4065,769],{"class":685},[671,4067,772],{"class":681},[671,4069,4070],{"class":698},"feature.internal.create",[671,4072,772],{"class":681},[671,4074,3450],{"class":681},[671,4076,754],{"class":681},[671,4078,4079,4081,4083,4085,4087,4089,4091,4094,4096,4098,4101,4103,4105],{"class":673,"line":809},[671,4080,1463],{"class":760},[671,4082,542],{"class":681},[671,4084,682],{"class":681},[671,4086,2518],{"class":760},[671,4088,542],{"class":681},[671,4090,695],{"class":681},[671,4092,4093],{"class":698},"New Feature",[671,4095,772],{"class":681},[671,4097,3450],{"class":681},[671,4099,4100],{"class":760}," description",[671,4102,542],{"class":681},[671,4104,1629],{"class":681},[671,4106,1632],{"class":681},[671,4108,4109,4111],{"class":673,"line":826},[671,4110,3466],{"class":681},[671,4112,1938],{"class":685},[671,4114,4115],{"class":673,"line":841},[671,4116,733],{"emptyLinePlaceholder":732},[671,4118,4119],{"class":673,"line":847},[671,4120,4121],{"class":1457},"\u002F\u002F 3. Passing a pre-configured BaseDataModel instance\n",[671,4123,4124,4126,4129,4131,4133,4135,4137,4139,4141,4143,4145,4148,4150,4152,4154],{"class":673,"line":861},[671,4125,740],{"class":739},[671,4127,4128],{"class":685}," customProduct ",[671,4130,1923],{"class":681},[671,4132,2501],{"class":681},[671,4134,2004],{"class":766},[671,4136,2080],{"class":685},[671,4138,477],{"class":681},[671,4140,2510],{"class":766},[671,4142,769],{"class":685},[671,4144,2515],{"class":681},[671,4146,4147],{"class":760}," active",[671,4149,542],{"class":681},[671,4151,1521],{"class":1520},[671,4153,689],{"class":681},[671,4155,1938],{"class":685},[671,4157,4158,4160,4163,4165,4167,4169,4171,4173,4175,4177],{"class":673,"line":877},[671,4159,740],{"class":739},[671,4161,4162],{"class":685}," customProductApi ",[671,4164,1923],{"class":681},[671,4166,1926],{"class":766},[671,4168,769],{"class":685},[671,4170,772],{"class":681},[671,4172,4022],{"class":698},[671,4174,772],{"class":681},[671,4176,3450],{"class":681},[671,4178,754],{"class":681},[671,4180,4181,4183,4185],{"class":673,"line":891},[671,4182,1463],{"class":760},[671,4184,542],{"class":681},[671,4186,4187],{"class":685}," customProduct\n",[671,4189,4190,4192],{"class":673,"line":896},[671,4191,3466],{"class":681},[671,4193,1938],{"class":685},[1179,4195,4197,4198,3281],{"id":4196},"b-overriding-or-providing-custom-query-parameters","B. Overriding or Providing Custom ",[384,4199,449],{},[380,4201,4202,4203,4205,4206,4208],{},"You can supply per-instance query options as a static ",[384,4204,420],{}," class constructor, a plain object literal, or a pre-configured ",[384,4207,420],{}," instance:",[662,4210,4212],{"className":664,"code":4211,"language":666,"meta":667,"style":667},"\u002F\u002F 1. Passing a static BaseQuery class constructor (auto-instantiated by useAPI)\nconst tagsApi = useAPI('meta.tags', {\n  query: TagsQuery\n})\n\n\u002F\u002F 2. Passing a plain query object literal (automatically wrapped in WrappedQuery)\nconst customTagsApi = useAPI('meta.tags', {\n  query: { type: 'system', searchTerm: 'security' }\n})\n\n\u002F\u002F 3. Passing a pre-configured, scoped BaseQuery instance\nconst dialogQuery = new TagsQuery('dialogScope')\ndialogQuery.searchTerm = 'audit'\n\nconst scopedTagsApi = useAPI('meta.tags', {\n  query: dialogQuery\n})\n",[384,4213,4214,4219,4242,4251,4257,4261,4266,4289,4324,4330,4334,4339,4363,4381,4385,4408,4417],{"__ignoreMap":667},[671,4215,4216],{"class":673,"line":674},[671,4217,4218],{"class":1457},"\u002F\u002F 1. Passing a static BaseQuery class constructor (auto-instantiated by useAPI)\n",[671,4220,4221,4223,4226,4228,4230,4232,4234,4236,4238,4240],{"class":673,"line":705},[671,4222,740],{"class":739},[671,4224,4225],{"class":685}," tagsApi ",[671,4227,1923],{"class":681},[671,4229,1926],{"class":766},[671,4231,769],{"class":685},[671,4233,772],{"class":681},[671,4235,1933],{"class":698},[671,4237,772],{"class":681},[671,4239,3450],{"class":681},[671,4241,754],{"class":681},[671,4243,4244,4246,4248],{"class":673,"line":729},[671,4245,3954],{"class":760},[671,4247,542],{"class":681},[671,4249,4250],{"class":685}," TagsQuery\n",[671,4252,4253,4255],{"class":673,"line":736},[671,4254,3466],{"class":681},[671,4256,1938],{"class":685},[671,4258,4259],{"class":673,"line":757},[671,4260,733],{"emptyLinePlaceholder":732},[671,4262,4263],{"class":673,"line":785},[671,4264,4265],{"class":1457},"\u002F\u002F 2. Passing a plain query object literal (automatically wrapped in WrappedQuery)\n",[671,4267,4268,4270,4273,4275,4277,4279,4281,4283,4285,4287],{"class":673,"line":795},[671,4269,740],{"class":739},[671,4271,4272],{"class":685}," customTagsApi ",[671,4274,1923],{"class":681},[671,4276,1926],{"class":766},[671,4278,769],{"class":685},[671,4280,772],{"class":681},[671,4282,1933],{"class":698},[671,4284,772],{"class":681},[671,4286,3450],{"class":681},[671,4288,754],{"class":681},[671,4290,4291,4293,4295,4297,4299,4301,4303,4306,4308,4310,4313,4315,4317,4320,4322],{"class":673,"line":809},[671,4292,3954],{"class":760},[671,4294,542],{"class":681},[671,4296,682],{"class":681},[671,4298,710],{"class":760},[671,4300,542],{"class":681},[671,4302,695],{"class":681},[671,4304,4305],{"class":698},"system",[671,4307,772],{"class":681},[671,4309,3450],{"class":681},[671,4311,4312],{"class":760}," searchTerm",[671,4314,542],{"class":681},[671,4316,695],{"class":681},[671,4318,4319],{"class":698},"security",[671,4321,772],{"class":681},[671,4323,1632],{"class":681},[671,4325,4326,4328],{"class":673,"line":826},[671,4327,3466],{"class":681},[671,4329,1938],{"class":685},[671,4331,4332],{"class":673,"line":841},[671,4333,733],{"emptyLinePlaceholder":732},[671,4335,4336],{"class":673,"line":847},[671,4337,4338],{"class":1457},"\u002F\u002F 3. Passing a pre-configured, scoped BaseQuery instance\n",[671,4340,4341,4343,4346,4348,4350,4352,4354,4356,4359,4361],{"class":673,"line":861},[671,4342,740],{"class":739},[671,4344,4345],{"class":685}," dialogQuery ",[671,4347,1923],{"class":681},[671,4349,2501],{"class":681},[671,4351,3016],{"class":766},[671,4353,769],{"class":685},[671,4355,772],{"class":681},[671,4357,4358],{"class":698},"dialogScope",[671,4360,772],{"class":681},[671,4362,1938],{"class":685},[671,4364,4365,4368,4370,4372,4374,4376,4379],{"class":673,"line":877},[671,4366,4367],{"class":685},"dialogQuery",[671,4369,477],{"class":681},[671,4371,3040],{"class":685},[671,4373,1923],{"class":681},[671,4375,695],{"class":681},[671,4377,4378],{"class":698},"audit",[671,4380,702],{"class":681},[671,4382,4383],{"class":673,"line":891},[671,4384,733],{"emptyLinePlaceholder":732},[671,4386,4387,4389,4392,4394,4396,4398,4400,4402,4404,4406],{"class":673,"line":896},[671,4388,740],{"class":739},[671,4390,4391],{"class":685}," scopedTagsApi ",[671,4393,1923],{"class":681},[671,4395,1926],{"class":766},[671,4397,769],{"class":685},[671,4399,772],{"class":681},[671,4401,1933],{"class":698},[671,4403,772],{"class":681},[671,4405,3450],{"class":681},[671,4407,754],{"class":681},[671,4409,4410,4412,4414],{"class":673,"line":910},[671,4411,3954],{"class":760},[671,4413,542],{"class":681},[671,4415,4416],{"class":685}," dialogQuery\n",[671,4418,4419,4421],{"class":673,"line":926},[671,4420,3466],{"class":681},[671,4422,1938],{"class":685},[1179,4424,4426,4427,1163,4429],{"id":4425},"c-passing-static-class-constructors-for-both-model-and-query","C. Passing Static Class Constructors for Both ",[384,4428,1058],{},[384,4430,449],{},[380,4432,4433,4434,4436,4437,4439],{},"You can simply pass both static class constructors to ",[384,4435,205],{},". ",[384,4438,205],{}," will automatically instantiate and initialize both the model and query instances:",[662,4441,4443],{"className":664,"code":4442,"language":666,"meta":667,"style":667},"const productApi = useAPI('product.internal.update', {\n  model: ProductModel,\n  query: ProductQuery\n})\n",[384,4444,4445,4467,4477,4486],{"__ignoreMap":667},[671,4446,4447,4449,4451,4453,4455,4457,4459,4461,4463,4465],{"class":673,"line":674},[671,4448,740],{"class":739},[671,4450,4011],{"class":685},[671,4452,1923],{"class":681},[671,4454,1926],{"class":766},[671,4456,769],{"class":685},[671,4458,772],{"class":681},[671,4460,4022],{"class":698},[671,4462,772],{"class":681},[671,4464,3450],{"class":681},[671,4466,754],{"class":681},[671,4468,4469,4471,4473,4475],{"class":673,"line":705},[671,4470,1463],{"class":760},[671,4472,542],{"class":681},[671,4474,2004],{"class":685},[671,4476,782],{"class":681},[671,4478,4479,4481,4483],{"class":673,"line":729},[671,4480,3954],{"class":760},[671,4482,542],{"class":681},[671,4484,4485],{"class":685}," ProductQuery\n",[671,4487,4488,4490],{"class":673,"line":736},[671,4489,3466],{"class":681},[671,4491,1938],{"class":685},[1179,4493,4495],{"id":4494},"d-combining-object-literals-or-custom-overrides","D. Combining Object Literals or Custom Overrides",[662,4497,4499],{"className":664,"code":4498,"language":666,"meta":667,"style":667},"const directiveApi = useAPI('settings.directive.list', {\n  model: { key: 'theme', value: 'dark' },\n  query: { category: 'user-preference', limit: 10 }\n})\n",[384,4500,4501,4525,4560,4593],{"__ignoreMap":667},[671,4502,4503,4505,4508,4510,4512,4514,4516,4519,4521,4523],{"class":673,"line":674},[671,4504,740],{"class":739},[671,4506,4507],{"class":685}," directiveApi ",[671,4509,1923],{"class":681},[671,4511,1926],{"class":766},[671,4513,769],{"class":685},[671,4515,772],{"class":681},[671,4517,4518],{"class":698},"settings.directive.list",[671,4520,772],{"class":681},[671,4522,3450],{"class":681},[671,4524,754],{"class":681},[671,4526,4527,4529,4531,4533,4535,4537,4539,4542,4544,4546,4549,4551,4553,4556,4558],{"class":673,"line":705},[671,4528,1463],{"class":760},[671,4530,542],{"class":681},[671,4532,682],{"class":681},[671,4534,3937],{"class":760},[671,4536,542],{"class":681},[671,4538,695],{"class":681},[671,4540,4541],{"class":698},"theme",[671,4543,772],{"class":681},[671,4545,3450],{"class":681},[671,4547,4548],{"class":760}," value",[671,4550,542],{"class":681},[671,4552,695],{"class":681},[671,4554,4555],{"class":698},"dark",[671,4557,772],{"class":681},[671,4559,3949],{"class":681},[671,4561,4562,4564,4566,4568,4571,4573,4575,4578,4580,4582,4585,4587,4591],{"class":673,"line":729},[671,4563,3954],{"class":760},[671,4565,542],{"class":681},[671,4567,682],{"class":681},[671,4569,4570],{"class":760}," category",[671,4572,542],{"class":681},[671,4574,695],{"class":681},[671,4576,4577],{"class":698},"user-preference",[671,4579,772],{"class":681},[671,4581,3450],{"class":681},[671,4583,4584],{"class":760}," limit",[671,4586,542],{"class":681},[671,4588,4590],{"class":4589},"sbssI"," 10",[671,4592,1632],{"class":681},[671,4594,4595,4597],{"class":673,"line":736},[671,4596,3466],{"class":681},[671,4598,1938],{"class":685},[399,4600,4601,4602,4605,4606,477],{},"Options supplied to ",[384,4603,4604],{},"useAPI(namespace, options)"," take precedence over the endpoint defaults registered in ",[384,4607,4608],{},"src\u002Fapi\u002F*.ts",[501,4610],{},[375,4612,4614],{"id":4613},"api-reference","API Reference",[380,4616,4617,4618,4621,4622,4625],{},"Invoking ",[384,4619,4620],{},"useAPI(namespace, options?)"," returns an ",[384,4623,4624],{},"ApiInstance"," object containing the following properties and methods:",[544,4627,4628,4639],{},[547,4629,4630],{},[550,4631,4632,4635,4637],{},[553,4633,4634],{},"Member",[553,4636,987],{},[553,4638,993],{},[566,4640,4641,4655,4668,4684,4699,4714,4728,4743,4758,4781,4798],{},[550,4642,4643,4647,4652],{},[571,4644,4645],{},[384,4646,446],{},[571,4648,4649],{},[384,4650,4651],{},"BaseDataModel | BaseListModel | Object | Array",[571,4653,4654],{},"Reactive data instance populated with the response resource upon request completion.",[550,4656,4657,4661,4665],{},[571,4658,4659],{},[384,4660,449],{},[571,4662,4663],{},[384,4664,420],{},[571,4666,4667],{},"Reactive query instance holding URL search parameters.",[550,4669,4670,4674,4679],{},[571,4671,4672],{},[384,4673,452],{},[571,4675,4676],{},[384,4677,4678],{},"ShallowRef\u003Cboolean>",[571,4680,4681,4683],{},[384,4682,1122],{}," while an HTTP request is in-flight.",[550,4685,4686,4690,4694],{},[571,4687,4688],{},[384,4689,455],{},[571,4691,4692],{},[384,4693,4678],{},[571,4695,4696,4698],{},[384,4697,1122],{}," after at least one successful request has completed.",[550,4700,4701,4705,4709],{},[571,4702,4703],{},[384,4704,458],{},[571,4706,4707],{},[384,4708,4678],{},[571,4710,4711,4713],{},[384,4712,1122],{}," if the last executed request succeeded.",[550,4715,4716,4720,4725],{},[571,4717,4718],{},[384,4719,462],{},[571,4721,4722],{},[384,4723,4724],{},"ResponseErrorHandler",[571,4726,4727],{},"Error handler instance containing active response errors.",[550,4729,4730,4735,4740],{},[571,4731,4732],{},[384,4733,4734],{},"execute(options?, force?)",[571,4736,4737],{},[384,4738,4739],{},"(options?: APIExecOptions, force?: boolean) => Promise\u003Cany>",[571,4741,4742],{},"Executes the HTTP request. Accepts parameter overrides, custom Axios config, or model payloads.",[550,4744,4745,4750,4755],{},[571,4746,4747],{},[384,4748,4749],{},"refresh()",[571,4751,4752],{},[384,4753,4754],{},"() => Promise\u003Cany>",[571,4756,4757],{},"Re-executes the previous request with saved attributes, forcing a fresh network call (bypassing deduplication).",[550,4759,4760,4764,4769],{},[571,4761,4762],{},[384,4763,2467],{},[571,4765,4766],{},[384,4767,4768],{},"(data?: any, hard?: boolean) => void",[571,4770,4771,4772,2787,4774,4777,4778,4780],{},"Resets ",[384,4773,455],{},[384,4775,4776],{},"false",", resets ",[384,4779,446],{}," model, and clears error state.",[550,4782,4783,4787,4792],{},[571,4784,4785],{},[384,4786,2450],{},[571,4788,4789],{},[384,4790,4791],{},"() => void",[571,4793,4794,4795,4797],{},"Reverts modified values on ",[384,4796,446],{}," model if supported by the model instance.",[550,4799,4800,4805,4809],{},[571,4801,4802],{},[384,4803,4804],{},"recallable()",[571,4806,4807],{},[384,4808,4791],{},[571,4810,4811],{},"Clears the request deduplication memory for this endpoint.",[501,4813],{},[375,4815,4817],{"id":4816},"core-behaviors-architecture","Core Behaviors & Architecture",[423,4819,4821],{"id":4820},"path-parameter-interpolation","Path Parameter Interpolation",[380,4823,4824,4825,4827,4828,4830],{},"If an endpoint path includes parameters prefixed with a colon (e.g. ",[384,4826,472],{},"), ",[384,4829,205],{}," resolves these values at execution time.",[380,4832,4833],{},"Parameters are resolved from:",[4835,4836,4837,4846],"ol",{},[431,4838,382,4839,4842,4843],{},[384,4840,4841],{},"params"," object passed to ",[384,4844,4845],{},"execute({ params: { productId: 123 } })",[431,4847,4848,4849,4851],{},"Properties on the ",[384,4850,446],{}," instance matching the parameter key name",[662,4853,4855],{"className":664,"code":4854,"language":666,"meta":667,"style":667},"const patcher = useAPI('insights.signals.patch')\n\n\u002F\u002F Path: \u002Fv1\u002Finsights\u002Fsignals\u002F:signalId\nawait patcher.execute({\n  params: { signalId: 'sig_123' },\n  model: { title: 'Updated Title' }\n})\n",[384,4856,4857,4879,4883,4888,4905,4928,4950],{"__ignoreMap":667},[671,4858,4859,4861,4864,4866,4868,4870,4872,4875,4877],{"class":673,"line":674},[671,4860,740],{"class":739},[671,4862,4863],{"class":685}," patcher ",[671,4865,1923],{"class":681},[671,4867,1926],{"class":766},[671,4869,769],{"class":685},[671,4871,772],{"class":681},[671,4873,4874],{"class":698},"insights.signals.patch",[671,4876,772],{"class":681},[671,4878,1938],{"class":685},[671,4880,4881],{"class":673,"line":705},[671,4882,733],{"emptyLinePlaceholder":732},[671,4884,4885],{"class":673,"line":729},[671,4886,4887],{"class":1457},"\u002F\u002F Path: \u002Fv1\u002Finsights\u002Fsignals\u002F:signalId\n",[671,4889,4890,4893,4896,4898,4900,4902],{"class":673,"line":736},[671,4891,4892],{"class":677},"await",[671,4894,4895],{"class":685}," patcher",[671,4897,477],{"class":681},[671,4899,3740],{"class":766},[671,4901,769],{"class":685},[671,4903,4904],{"class":681},"{\n",[671,4906,4907,4910,4912,4914,4917,4919,4921,4924,4926],{"class":673,"line":757},[671,4908,4909],{"class":760},"  params",[671,4911,542],{"class":681},[671,4913,682],{"class":681},[671,4915,4916],{"class":760}," signalId",[671,4918,542],{"class":681},[671,4920,695],{"class":681},[671,4922,4923],{"class":698},"sig_123",[671,4925,772],{"class":681},[671,4927,3949],{"class":681},[671,4929,4930,4932,4934,4936,4939,4941,4943,4946,4948],{"class":673,"line":785},[671,4931,1463],{"class":760},[671,4933,542],{"class":681},[671,4935,682],{"class":681},[671,4937,4938],{"class":760}," title",[671,4940,542],{"class":681},[671,4942,695],{"class":681},[671,4944,4945],{"class":698},"Updated Title",[671,4947,772],{"class":681},[671,4949,1632],{"class":681},[671,4951,4952,4954],{"class":673,"line":795},[671,4953,3466],{"class":681},[671,4955,1938],{"class":685},[423,4957,482],{"id":4958},"request-deduplication",[380,4960,4961,4962,4964,4965,4967],{},"To minimize unnecessary network traffic, ",[384,4963,205],{}," automatically deduplicates identical ",[384,4966,486],{}," requests sent to the exact same URL and query string.",[399,4969,4970,4971,4973,4974,4976],{},"If a ",[384,4972,486],{}," request is triggered with a destination URL identical to the immediate previous request, ",[384,4975,205],{}," skips execution and logs a console warning in debug mode.",[380,4978,4979,4980,2787,4983,4986,4987,542],{},"To bypass deduplication and force a network request, pass ",[384,4981,4982],{},"force = true",[384,4984,4985],{},"execute()"," or use ",[384,4988,4749],{},[662,4990,4992],{"className":664,"code":4991,"language":666,"meta":667,"style":667},"\u002F\u002F Bypasses deduplication\nawait api.refresh()\n\n\u002F\u002F Or explicitly force execution\nawait api.execute({}, true)\n",[384,4993,4994,4999,5013,5017,5022],{"__ignoreMap":667},[671,4995,4996],{"class":673,"line":674},[671,4997,4998],{"class":1457},"\u002F\u002F Bypasses deduplication\n",[671,5000,5001,5003,5006,5008,5011],{"class":673,"line":705},[671,5002,4892],{"class":677},[671,5004,5005],{"class":685}," api",[671,5007,477],{"class":681},[671,5009,5010],{"class":766},"refresh",[671,5012,2090],{"class":685},[671,5014,5015],{"class":673,"line":729},[671,5016,733],{"emptyLinePlaceholder":732},[671,5018,5019],{"class":673,"line":736},[671,5020,5021],{"class":1457},"\u002F\u002F Or explicitly force execution\n",[671,5023,5024,5026,5028,5030,5032,5034,5037,5039],{"class":673,"line":757},[671,5025,4892],{"class":677},[671,5027,5005],{"class":685},[671,5029,477],{"class":681},[671,5031,3740],{"class":766},[671,5033,769],{"class":685},[671,5035,5036],{"class":681},"{},",[671,5038,1521],{"class":1520},[671,5040,1938],{"class":685},[423,5042,5044],{"id":5043},"automatic-request-cancellation","Automatic Request Cancellation",[380,5046,5047,5048,5050,5051,5053,5054,5056,5057,477],{},"If ",[384,5049,4985],{}," is called on a ",[384,5052,205],{}," instance while a previous request for the same endpoint is still pending, ",[384,5055,205],{}," automatically aborts the previous in-flight request via ",[384,5058,5059],{},"AbortController",[423,5061,5063],{"id":5062},"authentication-error-handling","Authentication & Error Handling",[4835,5065,5066,5082,5092],{},[431,5067,5068,1160,5071,5073,5074,5077,5078,5081],{},[434,5069,5070],{},"Token Injection",[384,5072,205],{}," calls ",[384,5075,5076],{},"waitUntilAuthed()"," and attaches the ",[384,5079,5080],{},"Authorization: Bearer \u003Ctoken>"," header automatically before sending authenticated requests.",[431,5083,5084,5087,5088,5091],{},[434,5085,5086],{},"401 Unauthorized",": Automatically triggers silent sign-out (",[384,5089,5090],{},"signoutSilent()",") to re-authenticate the user session.",[431,5093,5094,5097,5098,5101,5102],{},[434,5095,5096],{},"403 Forbidden",": Intercepts HTTP 403 responses and presents an interactive ",[384,5099,5100],{},"Confirmation.Acknowledge()"," modal detailing:\n",[428,5103,5104,5107,5110],{},[431,5105,5106],{},"Target HTTP method and endpoint URL",[431,5108,5109],{},"User identity (Email, Client Type, Client ID, Organisation ID)",[431,5111,5112],{},"Assigned security policy actions",[501,5114],{},[375,5116,5118],{"id":5117},"code-examples","Code Examples",[423,5120,5122],{"id":5121},"form-submission-with-payload","Form Submission with Payload",[662,5124,5127],{"className":3364,"code":5125,"filename":5126,"language":3367,"meta":667,"style":667},"\u003Cscript setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { useAPI } from '@\u002Fcomposables\u002FuseAPI'\n\nconst props = defineProps\u003C{ productId: string }>()\nconst emit = defineEmits(['saved'])\n\nconst featureCreate = useAPI('feature.internal.create', {\n  model: { name: '', description: '' }\n})\n\nconst save = async () => {\n  try {\n    await featureCreate.execute({\n      params: { productId: props.productId }\n    })\n    emit('saved')\n  } catch (err) {\n    \u002F\u002F Error is automatically populated in featureCreate.error\n  }\n}\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cv-card>\n    \u003Cv-card-text>\n      \u003Cv-text-field v-model=\"featureCreate.data.name\" label=\"Feature Name\" \u002F>\n      \u003Cv-textarea v-model=\"featureCreate.data.description\" label=\"Description\" \u002F>\n    \u003C\u002Fv-card-text>\n    \u003Cv-card-actions>\n      \u003Cv-btn\n        :loading=\"featureCreate.loading\"\n        color=\"primary\"\n        @click=\"save\"\n      >\n        Create Feature\n      \u003C\u002Fv-btn>\n    \u003C\u002Fv-card-actions>\n  \u003C\u002Fv-card>\n\u003C\u002Ftemplate>\n","components\u002Fadd-feature-dialog.vue",[384,5128,5129,5149,5168,5186,5190,5217,5242,5246,5268,5292,5298,5302,5321,5328,5344,5367,5374,5389,5406,5411,5415,5419,5427,5431,5439,5448,5457,5491,5521,5529,5538,5545,5559,5573,5587,5592,5597,5607,5615,5623],{"__ignoreMap":667},[671,5130,5131,5133,5135,5137,5139,5141,5143,5145,5147],{"class":673,"line":674},[671,5132,3374],{"class":681},[671,5134,3377],{"class":760},[671,5136,3380],{"class":739},[671,5138,3383],{"class":739},[671,5140,1923],{"class":681},[671,5142,3388],{"class":681},[671,5144,3391],{"class":698},[671,5146,3388],{"class":681},[671,5148,3396],{"class":681},[671,5150,5151,5153,5155,5158,5160,5162,5164,5166],{"class":673,"line":705},[671,5152,678],{"class":677},[671,5154,682],{"class":681},[671,5156,5157],{"class":685}," ref",[671,5159,689],{"class":681},[671,5161,692],{"class":677},[671,5163,695],{"class":681},[671,5165,3367],{"class":698},[671,5167,702],{"class":681},[671,5169,5170,5172,5174,5176,5178,5180,5182,5184],{"class":673,"line":729},[671,5171,678],{"class":677},[671,5173,682],{"class":681},[671,5175,1926],{"class":685},[671,5177,689],{"class":681},[671,5179,692],{"class":677},[671,5181,695],{"class":681},[671,5183,3432],{"class":698},[671,5185,702],{"class":681},[671,5187,5188],{"class":673,"line":736},[671,5189,733],{"emptyLinePlaceholder":732},[671,5191,5192,5194,5197,5199,5202,5205,5208,5210,5212,5215],{"class":673,"line":757},[671,5193,740],{"class":739},[671,5195,5196],{"class":685}," props ",[671,5198,1923],{"class":681},[671,5200,5201],{"class":766}," defineProps",[671,5203,5204],{"class":681},"\u003C{",[671,5206,5207],{"class":760}," productId",[671,5209,542],{"class":681},[671,5211,2022],{"class":748},[671,5213,5214],{"class":681}," }>",[671,5216,2090],{"class":685},[671,5218,5219,5221,5224,5226,5229,5232,5234,5237,5239],{"class":673,"line":785},[671,5220,740],{"class":739},[671,5222,5223],{"class":685}," emit ",[671,5225,1923],{"class":681},[671,5227,5228],{"class":766}," defineEmits",[671,5230,5231],{"class":685},"([",[671,5233,772],{"class":681},[671,5235,5236],{"class":698},"saved",[671,5238,772],{"class":681},[671,5240,5241],{"class":685},"])\n",[671,5243,5244],{"class":673,"line":795},[671,5245,733],{"emptyLinePlaceholder":732},[671,5247,5248,5250,5252,5254,5256,5258,5260,5262,5264,5266],{"class":673,"line":809},[671,5249,740],{"class":739},[671,5251,4059],{"class":685},[671,5253,1923],{"class":681},[671,5255,1926],{"class":766},[671,5257,769],{"class":685},[671,5259,772],{"class":681},[671,5261,4070],{"class":698},[671,5263,772],{"class":681},[671,5265,3450],{"class":681},[671,5267,754],{"class":681},[671,5269,5270,5272,5274,5276,5278,5280,5282,5284,5286,5288,5290],{"class":673,"line":826},[671,5271,1463],{"class":760},[671,5273,542],{"class":681},[671,5275,682],{"class":681},[671,5277,2518],{"class":760},[671,5279,542],{"class":681},[671,5281,1629],{"class":681},[671,5283,3450],{"class":681},[671,5285,4100],{"class":760},[671,5287,542],{"class":681},[671,5289,1629],{"class":681},[671,5291,1632],{"class":681},[671,5293,5294,5296],{"class":673,"line":841},[671,5295,3466],{"class":681},[671,5297,1938],{"class":685},[671,5299,5300],{"class":673,"line":847},[671,5301,733],{"emptyLinePlaceholder":732},[671,5303,5304,5306,5309,5311,5314,5317,5319],{"class":673,"line":861},[671,5305,740],{"class":739},[671,5307,5308],{"class":685}," save ",[671,5310,1923],{"class":681},[671,5312,5313],{"class":739}," async",[671,5315,5316],{"class":681}," ()",[671,5318,3496],{"class":739},[671,5320,754],{"class":681},[671,5322,5323,5326],{"class":673,"line":877},[671,5324,5325],{"class":677},"  try",[671,5327,754],{"class":681},[671,5329,5330,5333,5336,5338,5340,5342],{"class":673,"line":891},[671,5331,5332],{"class":677},"    await",[671,5334,5335],{"class":685}," featureCreate",[671,5337,477],{"class":681},[671,5339,3740],{"class":766},[671,5341,769],{"class":760},[671,5343,4904],{"class":681},[671,5345,5346,5349,5351,5353,5355,5357,5360,5362,5365],{"class":673,"line":896},[671,5347,5348],{"class":760},"      params",[671,5350,542],{"class":681},[671,5352,682],{"class":681},[671,5354,5207],{"class":760},[671,5356,542],{"class":681},[671,5358,5359],{"class":685}," props",[671,5361,477],{"class":681},[671,5363,5364],{"class":685},"productId",[671,5366,1632],{"class":681},[671,5368,5369,5372],{"class":673,"line":910},[671,5370,5371],{"class":681},"    }",[671,5373,1938],{"class":760},[671,5375,5376,5379,5381,5383,5385,5387],{"class":673,"line":926},[671,5377,5378],{"class":766},"    emit",[671,5380,769],{"class":760},[671,5382,772],{"class":681},[671,5384,5236],{"class":698},[671,5386,772],{"class":681},[671,5388,1938],{"class":760},[671,5390,5391,5394,5397,5399,5402,5404],{"class":673,"line":939},[671,5392,5393],{"class":681},"  }",[671,5395,5396],{"class":677}," catch",[671,5398,1223],{"class":760},[671,5400,5401],{"class":685},"err",[671,5403,2926],{"class":760},[671,5405,4904],{"class":681},[671,5407,5408],{"class":673,"line":945},[671,5409,5410],{"class":1457},"    \u002F\u002F Error is automatically populated in featureCreate.error\n",[671,5412,5413],{"class":673,"line":951},[671,5414,948],{"class":681},[671,5416,5417],{"class":673,"line":957},[671,5418,954],{"class":681},[671,5420,5421,5423,5425],{"class":673,"line":962},[671,5422,3516],{"class":681},[671,5424,3377],{"class":760},[671,5426,3396],{"class":681},[671,5428,5429],{"class":673,"line":1558},[671,5430,733],{"emptyLinePlaceholder":732},[671,5432,5433,5435,5437],{"class":673,"line":1572},[671,5434,3374],{"class":681},[671,5436,3531],{"class":760},[671,5438,3396],{"class":681},[671,5440,5441,5443,5446],{"class":673,"line":1577},[671,5442,3538],{"class":681},[671,5444,5445],{"class":760},"v-card",[671,5447,3396],{"class":681},[671,5449,5450,5452,5455],{"class":673,"line":1582},[671,5451,3819],{"class":681},[671,5453,5454],{"class":760},"v-card-text",[671,5456,3396],{"class":681},[671,5458,5459,5462,5465,5468,5470,5472,5475,5477,5480,5482,5484,5487,5489],{"class":673,"line":1588},[671,5460,5461],{"class":681},"      \u003C",[671,5463,5464],{"class":760},"v-text-field",[671,5466,5467],{"class":739}," v-model",[671,5469,1923],{"class":681},[671,5471,3388],{"class":681},[671,5473,5474],{"class":698},"featureCreate.data.name",[671,5476,3388],{"class":681},[671,5478,5479],{"class":739}," label",[671,5481,1923],{"class":681},[671,5483,3388],{"class":681},[671,5485,5486],{"class":698},"Feature Name",[671,5488,3388],{"class":681},[671,5490,3793],{"class":681},[671,5492,5493,5495,5498,5500,5502,5504,5507,5509,5511,5513,5515,5517,5519],{"class":673,"line":1598},[671,5494,5461],{"class":681},[671,5496,5497],{"class":760},"v-textarea",[671,5499,5467],{"class":739},[671,5501,1923],{"class":681},[671,5503,3388],{"class":681},[671,5505,5506],{"class":698},"featureCreate.data.description",[671,5508,3388],{"class":681},[671,5510,5479],{"class":739},[671,5512,1923],{"class":681},[671,5514,3388],{"class":681},[671,5516,993],{"class":698},[671,5518,3388],{"class":681},[671,5520,3793],{"class":681},[671,5522,5523,5525,5527],{"class":673,"line":1614},[671,5524,3857],{"class":681},[671,5526,5454],{"class":760},[671,5528,3396],{"class":681},[671,5530,5531,5533,5536],{"class":673,"line":1635},[671,5532,3819],{"class":681},[671,5534,5535],{"class":760},"v-card-actions",[671,5537,3396],{"class":681},[671,5539,5540,5542],{"class":673,"line":1640},[671,5541,5461],{"class":681},[671,5543,5544],{"class":760},"v-btn\n",[671,5546,5547,5550,5552,5554,5557],{"class":673,"line":1645},[671,5548,5549],{"class":739},"        :loading",[671,5551,1923],{"class":681},[671,5553,3388],{"class":681},[671,5555,5556],{"class":698},"featureCreate.loading",[671,5558,3556],{"class":681},[671,5560,5561,5564,5566,5568,5571],{"class":673,"line":1651},[671,5562,5563],{"class":739},"        color",[671,5565,1923],{"class":681},[671,5567,3388],{"class":681},[671,5569,5570],{"class":698},"primary",[671,5572,3556],{"class":681},[671,5574,5575,5578,5580,5582,5585],{"class":673,"line":1661},[671,5576,5577],{"class":739},"        @click",[671,5579,1923],{"class":681},[671,5581,3388],{"class":681},[671,5583,5584],{"class":698},"save",[671,5586,3556],{"class":681},[671,5588,5589],{"class":673,"line":1677},[671,5590,5591],{"class":681},"      >\n",[671,5593,5594],{"class":673,"line":1688},[671,5595,5596],{"class":685},"        Create Feature\n",[671,5598,5599,5602,5605],{"class":673,"line":1697},[671,5600,5601],{"class":681},"      \u003C\u002F",[671,5603,5604],{"class":760},"v-btn",[671,5606,3396],{"class":681},[671,5608,5609,5611,5613],{"class":673,"line":1702},[671,5610,3857],{"class":681},[671,5612,5535],{"class":760},[671,5614,3396],{"class":681},[671,5616,5617,5619,5621],{"class":673,"line":1707},[671,5618,3866],{"class":681},[671,5620,5445],{"class":760},[671,5622,3396],{"class":681},[671,5624,5625,5627,5629],{"class":673,"line":1713},[671,5626,3516],{"class":681},[671,5628,3531],{"class":760},[671,5630,3396],{"class":681},[423,5632,5634],{"id":5633},"deleting-resources-with-parameters","Deleting Resources with Parameters",[662,5636,5638],{"className":664,"code":5637,"language":666,"meta":667,"style":667},"const deletion = useAPI('insights.findings.delete')\n\nconst removeFinding = async (findingId: string) => {\n  await deletion.execute({\n    params: { findingId }\n  })\n}\n",[384,5639,5640,5662,5666,5693,5709,5723,5729],{"__ignoreMap":667},[671,5641,5642,5644,5647,5649,5651,5653,5655,5658,5660],{"class":673,"line":674},[671,5643,740],{"class":739},[671,5645,5646],{"class":685}," deletion ",[671,5648,1923],{"class":681},[671,5650,1926],{"class":766},[671,5652,769],{"class":685},[671,5654,772],{"class":681},[671,5656,5657],{"class":698},"insights.findings.delete",[671,5659,772],{"class":681},[671,5661,1938],{"class":685},[671,5663,5664],{"class":673,"line":705},[671,5665,733],{"emptyLinePlaceholder":732},[671,5667,5668,5670,5673,5675,5677,5679,5683,5685,5687,5689,5691],{"class":673,"line":729},[671,5669,740],{"class":739},[671,5671,5672],{"class":685}," removeFinding ",[671,5674,1923],{"class":681},[671,5676,5313],{"class":739},[671,5678,1223],{"class":681},[671,5680,5682],{"class":5681},"sHdIc","findingId",[671,5684,542],{"class":681},[671,5686,2022],{"class":748},[671,5688,510],{"class":681},[671,5690,3496],{"class":739},[671,5692,754],{"class":681},[671,5694,5695,5698,5701,5703,5705,5707],{"class":673,"line":736},[671,5696,5697],{"class":677},"  await",[671,5699,5700],{"class":685}," deletion",[671,5702,477],{"class":681},[671,5704,3740],{"class":766},[671,5706,769],{"class":760},[671,5708,4904],{"class":681},[671,5710,5711,5714,5716,5718,5721],{"class":673,"line":757},[671,5712,5713],{"class":760},"    params",[671,5715,542],{"class":681},[671,5717,682],{"class":681},[671,5719,5720],{"class":685}," findingId",[671,5722,1632],{"class":681},[671,5724,5725,5727],{"class":673,"line":785},[671,5726,5393],{"class":681},[671,5728,1938],{"class":760},[671,5730,5731],{"class":673,"line":795},[671,5732,954],{"class":681},[5734,5735,5736],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":667,"searchDepth":705,"depth":705,"links":5738},[5739,5742,5750,5752,5763,5772,5779,5780,5786],{"id":377,"depth":705,"text":378,"children":5740},[5741],{"id":425,"depth":729,"text":426},{"id":505,"depth":705,"text":5743,"children":5744},"Defining API Endpoints (defineAPI)",[5745,5746,5747,5748],{"id":534,"depth":729,"text":535},{"id":659,"depth":729,"text":660},{"id":974,"depth":729,"text":975},{"id":1156,"depth":729,"text":5749},"Advanced APIConfig: model and query Patterns",{"id":1869,"depth":705,"text":5751},"Automatic Type Safety (vite-plugin-api-types)",{"id":1943,"depth":705,"text":5753,"children":5754},"Data Models (BaseDataModel & BaseListModel)",[5755,5757,5759,5760,5761],{"id":1958,"depth":729,"text":5756},"Subclassing BaseDataModel",{"id":2101,"depth":729,"text":5758},"Automatic Nested BaseListModel Instantiation",{"id":2282,"depth":729,"text":2283},{"id":2344,"depth":729,"text":2345},{"id":2611,"depth":729,"text":5762},"Handling Collections (BaseListModel)",{"id":2803,"depth":705,"text":5764,"children":5765},"Query Models (BaseQuery & PaginationQuery)",[5766,5768,5769,5770],{"id":2815,"depth":729,"text":5767},"Subclassing BaseQuery",{"id":2940,"depth":729,"text":2941},{"id":2989,"depth":729,"text":2990},{"id":3163,"depth":729,"text":5771},"Paginated Queries (PaginationQuery)",{"id":3350,"depth":705,"text":5773,"children":5774},"Using useAPI in Vue Components",[5775,5776,5777],{"id":3357,"depth":729,"text":3358},{"id":3612,"depth":729,"text":3613},{"id":3881,"depth":729,"text":5778},"3. Per-Instance Customization (Call-Site options)",{"id":4613,"depth":705,"text":4614},{"id":4816,"depth":705,"text":4817,"children":5781},[5782,5783,5784,5785],{"id":4820,"depth":729,"text":4821},{"id":4958,"depth":729,"text":482},{"id":5043,"depth":729,"text":5044},{"id":5062,"depth":729,"text":5063},{"id":5117,"depth":705,"text":5118,"children":5787},[5788,5789],{"id":5121,"depth":729,"text":5122},{"id":5633,"depth":729,"text":5634},"Guide to defining API endpoints, Data Models, Query Models, and using the reactive useAPI composable in the ES-Profiler platform frontend.","md",null,{},{"title":205,"description":5790},"Txjjr31f3C70VdPApu9r0LCP3LN1gd38j8ji3z0Tf5g",[5797,5799],{"title":197,"path":198,"stem":199,"description":5798,"children":-1},"Everything you need to know about observability of ESProfiler, as well as reporting and handling issues as they arise with infrastructure and hosting.",{"title":209,"path":210,"stem":211,"description":5800,"children":-1},"A comprehensive overview of project management processes and procedures that guide product development at ESProfiler.",1790076746813]