[{"data":1,"prerenderedAt":2083},["ShallowReactive",2],{"navigation":3,"\u002Fpackages\u002Fadonisjs-api-query\u002Ffeatures\u002Fvalidation":273,"\u002Fpackages\u002Fadonisjs-api-query\u002Ffeatures\u002Fvalidation-surround":2029,"packages-data":2034},[4,23],{"title":5,"path":6,"stem":7,"children":8,"icon":22},"Getting Started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,12,17],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-tabler-home",{"title":13,"path":14,"stem":15,"icon":16},"Manifest","\u002Fgetting-started\u002Fmanifest","1.getting-started\u002F2.manifest","i-tabler-file-diff",{"title":18,"path":19,"stem":20,"icon":21},"Contributing","\u002Fgetting-started\u002Fcontributing","1.getting-started\u002F3.contributing","i-tabler-git-fork",false,{"title":24,"path":25,"stem":26,"children":27,"icon":30},"Packages","\u002Fpackages","2.packages\u002F1.index",[28,31,108,194,247],{"title":29,"path":25,"stem":26,"icon":30},"Overview","i-tabler-packages",{"title":32,"icon":33,"path":34,"stem":35,"children":36,"page":22},"AdonisJS API Query","i-tabler-filter-search","\u002Fpackages\u002Fadonisjs-api-query","2.packages\u002Fadonisjs-api-query",[37,56,87],{"title":5,"icon":38,"path":39,"stem":40,"children":41,"page":22},"i-tabler-rocket","\u002Fpackages\u002Fadonisjs-api-query\u002Fgetting-started","2.packages\u002Fadonisjs-api-query\u002F1.getting-started",[42,46,51],{"title":10,"path":43,"stem":44,"icon":45},"\u002Fpackages\u002Fadonisjs-api-query\u002Fgetting-started\u002Fintroduction","2.packages\u002Fadonisjs-api-query\u002F1.getting-started\u002F1.introduction","i-tabler-book",{"title":47,"path":48,"stem":49,"icon":50},"Installation","\u002Fpackages\u002Fadonisjs-api-query\u002Fgetting-started\u002Finstallation","2.packages\u002Fadonisjs-api-query\u002F1.getting-started\u002F2.installation","i-tabler-download",{"title":52,"path":53,"stem":54,"icon":55},"Configuration","\u002Fpackages\u002Fadonisjs-api-query\u002Fgetting-started\u002Fconfiguration","2.packages\u002Fadonisjs-api-query\u002F1.getting-started\u002F3.configuration","i-tabler-settings",{"title":57,"icon":58,"path":59,"stem":60,"children":61,"page":22},"Features","i-tabler-sparkles","\u002Fpackages\u002Fadonisjs-api-query\u002Ffeatures","2.packages\u002Fadonisjs-api-query\u002F2.features",[62,67,72,77,82],{"title":63,"path":64,"stem":65,"icon":66},"Filtering","\u002Fpackages\u002Fadonisjs-api-query\u002Ffeatures\u002Ffiltering","2.packages\u002Fadonisjs-api-query\u002F2.features\u002F1.filtering","i-tabler-filter",{"title":68,"path":69,"stem":70,"icon":71},"Sorting","\u002Fpackages\u002Fadonisjs-api-query\u002Ffeatures\u002Fsorting","2.packages\u002Fadonisjs-api-query\u002F2.features\u002F2.sorting","i-tabler-arrows-sort",{"title":73,"path":74,"stem":75,"icon":76},"Including Relationships","\u002Fpackages\u002Fadonisjs-api-query\u002Ffeatures\u002Fincluding-relationships","2.packages\u002Fadonisjs-api-query\u002F2.features\u002F3.including-relationships","i-tabler-hierarchy-2",{"title":78,"path":79,"stem":80,"icon":81},"Filterable Classes","\u002Fpackages\u002Fadonisjs-api-query\u002Ffeatures\u002Ffilterable-classes","2.packages\u002Fadonisjs-api-query\u002F2.features\u002F4.filterable-classes","i-tabler-box-model",{"title":83,"path":84,"stem":85,"icon":86},"Validation","\u002Fpackages\u002Fadonisjs-api-query\u002Ffeatures\u002Fvalidation","2.packages\u002Fadonisjs-api-query\u002F2.features\u002F5.validation","i-tabler-shield-check",{"title":88,"icon":89,"path":90,"stem":91,"children":92,"page":22},"Advanced Usage","i-tabler-adjustments","\u002Fpackages\u002Fadonisjs-api-query\u002Fadvanced","2.packages\u002Fadonisjs-api-query\u002F3.advanced",[93,98,103],{"title":94,"path":95,"stem":96,"icon":97},"Custom Filters, Sorts & Includes","\u002Fpackages\u002Fadonisjs-api-query\u002Fadvanced\u002Fcustom-clauses","2.packages\u002Fadonisjs-api-query\u002F3.advanced\u002F1.custom-clauses","i-tabler-puzzle",{"title":99,"path":100,"stem":101,"icon":102},"Request & Delimiters","\u002Fpackages\u002Fadonisjs-api-query\u002Fadvanced\u002Frequest-and-delimiters","2.packages\u002Fadonisjs-api-query\u002F3.advanced\u002F2.request-and-delimiters","i-tabler-brackets-contain",{"title":104,"path":105,"stem":106,"icon":107},"Exceptions","\u002Fpackages\u002Fadonisjs-api-query\u002Fadvanced\u002Fexceptions","2.packages\u002Fadonisjs-api-query\u002F3.advanced\u002F3.exceptions","i-tabler-alert-triangle",{"title":109,"icon":110,"path":111,"stem":112,"children":113,"page":22},"AdonisJS Permission","i-tabler-shield-lock","\u002Fpackages\u002Fadonisjs-permission","2.packages\u002Fadonisjs-permission",[114,127,157,183],{"title":5,"icon":38,"path":115,"stem":116,"children":117,"page":22},"\u002Fpackages\u002Fadonisjs-permission\u002Fgetting-started","2.packages\u002Fadonisjs-permission\u002F1.getting-started",[118,121,124],{"title":10,"path":119,"stem":120,"icon":45},"\u002Fpackages\u002Fadonisjs-permission\u002Fgetting-started\u002Fintroduction","2.packages\u002Fadonisjs-permission\u002F1.getting-started\u002F1.introduction",{"title":47,"path":122,"stem":123,"icon":50},"\u002Fpackages\u002Fadonisjs-permission\u002Fgetting-started\u002Finstallation","2.packages\u002Fadonisjs-permission\u002F1.getting-started\u002F2.installation",{"title":52,"path":125,"stem":126,"icon":55},"\u002Fpackages\u002Fadonisjs-permission\u002Fgetting-started\u002Fconfiguration","2.packages\u002Fadonisjs-permission\u002F1.getting-started\u002F3.configuration",{"title":128,"icon":86,"path":129,"stem":130,"children":131,"page":22},"Basic Usage","\u002Fpackages\u002Fadonisjs-permission\u002Fbasic-usage","2.packages\u002Fadonisjs-permission\u002F2.basic-usage",[132,137,142,147,152],{"title":133,"path":134,"stem":135,"icon":136},"Roles & Permissions","\u002Fpackages\u002Fadonisjs-permission\u002Fbasic-usage\u002Froles-and-permissions","2.packages\u002Fadonisjs-permission\u002F2.basic-usage\u002F1.roles-and-permissions","i-tabler-users",{"title":138,"path":139,"stem":140,"icon":141},"Checking Access","\u002Fpackages\u002Fadonisjs-permission\u002Fbasic-usage\u002Fchecking","2.packages\u002Fadonisjs-permission\u002F2.basic-usage\u002F2.checking","i-tabler-checks",{"title":143,"path":144,"stem":145,"icon":146},"Middleware","\u002Fpackages\u002Fadonisjs-permission\u002Fbasic-usage\u002Fmiddleware","2.packages\u002Fadonisjs-permission\u002F2.basic-usage\u002F3.middleware","i-tabler-route",{"title":148,"path":149,"stem":150,"icon":151},"Wildcard Permissions","\u002Fpackages\u002Fadonisjs-permission\u002Fbasic-usage\u002Fwildcard-permissions","2.packages\u002Fadonisjs-permission\u002F2.basic-usage\u002F4.wildcard-permissions","i-tabler-asterisk",{"title":153,"path":154,"stem":155,"icon":156},"Catalog & Sync","\u002Fpackages\u002Fadonisjs-permission\u002Fbasic-usage\u002Fcatalog","2.packages\u002Fadonisjs-permission\u002F2.basic-usage\u002F5.catalog","i-tabler-refresh",{"title":158,"icon":159,"path":160,"stem":161,"children":162,"page":22},"Advanced","i-tabler-tool","\u002Fpackages\u002Fadonisjs-permission\u002Fadvanced","2.packages\u002Fadonisjs-permission\u002F3.advanced",[163,168,173,178],{"title":164,"path":165,"stem":166,"icon":167},"Teams","\u002Fpackages\u002Fadonisjs-permission\u002Fadvanced\u002Fteams","2.packages\u002Fadonisjs-permission\u002F3.advanced\u002F1.teams","i-tabler-building",{"title":169,"path":170,"stem":171,"icon":172},"Super-Admin","\u002Fpackages\u002Fadonisjs-permission\u002Fadvanced\u002Fsuper-admin","2.packages\u002Fadonisjs-permission\u002F3.advanced\u002F2.super-admin","i-tabler-crown",{"title":174,"path":175,"stem":176,"icon":177},"Events","\u002Fpackages\u002Fadonisjs-permission\u002Fadvanced\u002Fevents","2.packages\u002Fadonisjs-permission\u002F3.advanced\u002F3.events","i-tabler-radio",{"title":179,"path":180,"stem":181,"icon":182},"Cache","\u002Fpackages\u002Fadonisjs-permission\u002Fadvanced\u002Fcache","2.packages\u002Fadonisjs-permission\u002F3.advanced\u002F4.cache","i-tabler-database",{"title":184,"icon":185,"path":186,"stem":187,"children":188,"page":22},"Upgrading","i-tabler-circle-arrow-up","\u002Fpackages\u002Fadonisjs-permission\u002Fupgrading","2.packages\u002Fadonisjs-permission\u002F4.upgrading",[189],{"title":190,"path":191,"stem":192,"icon":193},"From adonis-lucid-permission","\u002Fpackages\u002Fadonisjs-permission\u002Fupgrading\u002Ffrom-adonis-lucid-permission","2.packages\u002Fadonisjs-permission\u002F4.upgrading\u002F1.from-adonis-lucid-permission","i-tabler-git-compare",{"title":195,"icon":196,"path":197,"stem":198,"children":199,"page":22},"Simple Auth","i-tabler-key","\u002Fpackages\u002Fadonisjs-simple-auth","2.packages\u002Fadonisjs-simple-auth",[200,214,233],{"title":5,"icon":38,"path":201,"stem":202,"children":203,"page":22},"\u002Fpackages\u002Fadonisjs-simple-auth\u002Fgetting-started","2.packages\u002Fadonisjs-simple-auth\u002F1.getting-started",[204,208,211],{"title":10,"path":205,"stem":206,"icon":207},"\u002Fpackages\u002Fadonisjs-simple-auth\u002Fgetting-started\u002Fintroduction","2.packages\u002Fadonisjs-simple-auth\u002F1.getting-started\u002F1.introduction","i-tabler-info-circle",{"title":47,"path":209,"stem":210,"icon":50},"\u002Fpackages\u002Fadonisjs-simple-auth\u002Fgetting-started\u002Finstallation","2.packages\u002Fadonisjs-simple-auth\u002F1.getting-started\u002F2.installation",{"title":52,"path":212,"stem":213,"icon":55},"\u002Fpackages\u002Fadonisjs-simple-auth\u002Fgetting-started\u002Fconfiguration","2.packages\u002Fadonisjs-simple-auth\u002F1.getting-started\u002F3.configuration",{"title":215,"icon":110,"path":216,"stem":217,"children":218,"page":22},"Usage","\u002Fpackages\u002Fadonisjs-simple-auth\u002Fusage","2.packages\u002Fadonisjs-simple-auth\u002F2.usage",[219,224,229],{"title":220,"path":221,"stem":222,"icon":223},"Generating API Keys","\u002Fpackages\u002Fadonisjs-simple-auth\u002Fusage\u002Fgenerating-api-keys","2.packages\u002Fadonisjs-simple-auth\u002F2.usage\u002F1.generating-api-keys","i-tabler-terminal-2",{"title":225,"path":226,"stem":227,"icon":228},"Protecting Routes","\u002Fpackages\u002Fadonisjs-simple-auth\u002Fusage\u002Fprotecting-routes","2.packages\u002Fadonisjs-simple-auth\u002F2.usage\u002F2.protecting-routes","i-tabler-lock",{"title":230,"path":231,"stem":232,"icon":107},"Error Handling & i18n","\u002Fpackages\u002Fadonisjs-simple-auth\u002Fusage\u002Ferror-handling","2.packages\u002Fadonisjs-simple-auth\u002F2.usage\u002F3.error-handling",{"title":158,"icon":89,"path":234,"stem":235,"children":236,"page":22},"\u002Fpackages\u002Fadonisjs-simple-auth\u002Fadvanced","2.packages\u002Fadonisjs-simple-auth\u002F3.advanced",[237,242],{"title":238,"path":239,"stem":240,"icon":241},"Testing with Japa","\u002Fpackages\u002Fadonisjs-simple-auth\u002Fadvanced\u002Ftesting-with-japa","2.packages\u002Fadonisjs-simple-auth\u002F3.advanced\u002F1.testing-with-japa","i-tabler-flask",{"title":243,"path":244,"stem":245,"icon":246},"API Reference","\u002Fpackages\u002Fadonisjs-simple-auth\u002Fadvanced\u002Fapi-reference","2.packages\u002Fadonisjs-simple-auth\u002F3.advanced\u002F2.api-reference","i-tabler-code",{"title":248,"icon":249,"path":250,"stem":251,"children":252,"page":22},"AdonisJS Soft Deletes","i-tabler-trash-off","\u002Fpackages\u002Fadonisjs-soft-deletes","2.packages\u002Fadonisjs-soft-deletes",[253,263],{"title":5,"icon":38,"path":254,"stem":255,"children":256,"page":22},"\u002Fpackages\u002Fadonisjs-soft-deletes\u002Fgetting-started","2.packages\u002Fadonisjs-soft-deletes\u002F1.getting-started",[257,260],{"title":10,"path":258,"stem":259,"icon":207},"\u002Fpackages\u002Fadonisjs-soft-deletes\u002Fgetting-started\u002Fintroduction","2.packages\u002Fadonisjs-soft-deletes\u002F1.getting-started\u002F1.introduction",{"title":47,"path":261,"stem":262,"icon":50},"\u002Fpackages\u002Fadonisjs-soft-deletes\u002Fgetting-started\u002Finstallation","2.packages\u002Fadonisjs-soft-deletes\u002F1.getting-started\u002F2.installation",{"title":215,"icon":45,"path":264,"stem":265,"children":266,"page":22},"\u002Fpackages\u002Fadonisjs-soft-deletes\u002Fusage","2.packages\u002Fadonisjs-soft-deletes\u002F2.usage",[267,270],{"title":215,"path":268,"stem":269,"icon":246},"\u002Fpackages\u002Fadonisjs-soft-deletes\u002Fusage\u002Fusage","2.packages\u002Fadonisjs-soft-deletes\u002F2.usage\u002F1.usage",{"title":243,"path":271,"stem":272,"icon":45},"\u002Fpackages\u002Fadonisjs-soft-deletes\u002Fusage\u002Fapi-reference","2.packages\u002Fadonisjs-soft-deletes\u002F2.usage\u002F2.api-reference",{"id":274,"title":83,"body":275,"description":2023,"extension":2024,"meta":2025,"navigation":2026,"path":84,"seo":2027,"stem":85,"__hash__":2028},"docs\u002F2.packages\u002Fadonisjs-api-query\u002F2.features\u002F5.validation.md",{"type":276,"value":277,"toc":2011},"minimark",[278,307,327,332,335,367,375,382,717,735,739,749,779,1277,1309,1313,1317,1338,1489,1502,1506,1509,1668,1672,1675,1990,2007],[279,280,281,285,286,295,296,299,300,299,303,306],"p",{},[282,283,284],"code",{},"@eienjs\u002Fadonisjs-api-query"," provides first-class, optional integration with ",[287,288,292],"a",{"href":289,"rel":290},"https:\u002F\u002Fvinejs.dev",[291],"nofollow",[282,293,294],{},"@vinejs\u002Fvine"," to validate incoming query parameters (",[282,297,298],{},"filter",", ",[282,301,302],{},"sort",[282,304,305],{},"include",", etc.) before executing database queries.",[308,309,310],"note",{},[279,311,312,314,315,318,319,323,324,326],{},[282,313,294],{}," (",[282,316,317],{},">= 4.4.0",") is an ",[320,321,322],"strong",{},"optional peer dependency",". If your project does not use validation rules, you do not need ",[282,325,294],{}," installed.",[328,329,331],"h2",{"id":330},"defining-validation-rules","Defining Validation Rules",[279,333,334],{},"You can define validation rules in two places (or combine both):",[336,337,338,349],"ol",{},[339,340,341,344,345,348],"li",{},[320,342,343],{},"Per-filter rules"," using ",[282,346,347],{},"AllowedFilter.rule(schema)",".",[339,350,351,354,355,358,359,362,363,366],{},[320,352,353],{},"Request-level rules"," using the ",[282,356,357],{},"rules"," property on a ",[282,360,361],{},"BaseFilterable"," class (or via ",[282,364,365],{},"apiRequest.setRules()",").",[368,369,371,372],"h3",{"id":370},"_1-per-filter-rules-with-rule","1. Per-Filter Rules with ",[282,373,374],{},".rule()",[279,376,377,378,381],{},"Attach a VineJS schema directly to any ",[282,379,380],{},"AllowedFilter",":",[383,384,389],"pre",{"className":385,"code":386,"language":387,"meta":388,"style":388},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { AllowedFilter } from '@eienjs\u002Fadonisjs-api-query';\nimport vine from '@vinejs\u002Fvine';\n\nconst users = await User.query()\n  .withRequest(request)\n  .allowedFilters([\n    AllowedFilter.partial('name').rule(vine.string().minLength(2)),\n    AllowedFilter.exact('age').rule(vine.number().min(18)),\n    AllowedFilter.exact('status').rule(vine.enum(['active', 'inactive', 'pending'])),\n    AllowedFilter.exact('createdAt').rule(vine.date()),\n  ]);\n","ts","",[282,390,391,426,445,452,480,492,503,560,608,673,709],{"__ignoreMap":388},[392,393,396,400,404,408,411,414,417,420,423],"span",{"class":394,"line":395},"line",1,[392,397,399],{"class":398},"s7zQu","import",[392,401,403],{"class":402},"sMK4o"," {",[392,405,407],{"class":406},"sTEyZ"," AllowedFilter",[392,409,410],{"class":402}," }",[392,412,413],{"class":398}," from",[392,415,416],{"class":402}," '",[392,418,284],{"class":419},"sfazB",[392,421,422],{"class":402},"'",[392,424,425],{"class":402},";\n",[392,427,429,431,434,437,439,441,443],{"class":394,"line":428},2,[392,430,399],{"class":398},[392,432,433],{"class":406}," vine ",[392,435,436],{"class":398},"from",[392,438,416],{"class":402},[392,440,294],{"class":419},[392,442,422],{"class":402},[392,444,425],{"class":402},[392,446,448],{"class":394,"line":447},3,[392,449,451],{"emptyLinePlaceholder":450},true,"\n",[392,453,455,459,462,465,468,471,473,477],{"class":394,"line":454},4,[392,456,458],{"class":457},"spNyl","const",[392,460,461],{"class":406}," users ",[392,463,464],{"class":402},"=",[392,466,467],{"class":398}," await",[392,469,470],{"class":406}," User",[392,472,348],{"class":402},[392,474,476],{"class":475},"s2Zo4","query",[392,478,479],{"class":406},"()\n",[392,481,483,486,489],{"class":394,"line":482},5,[392,484,485],{"class":402},"  .",[392,487,488],{"class":475},"withRequest",[392,490,491],{"class":406},"(request)\n",[392,493,495,497,500],{"class":394,"line":494},6,[392,496,485],{"class":402},[392,498,499],{"class":475},"allowedFilters",[392,501,502],{"class":406},"([\n",[392,504,506,509,511,514,517,519,522,524,527,529,532,535,537,540,543,545,548,550,554,557],{"class":394,"line":505},7,[392,507,508],{"class":406},"    AllowedFilter",[392,510,348],{"class":402},[392,512,513],{"class":475},"partial",[392,515,516],{"class":406},"(",[392,518,422],{"class":402},[392,520,521],{"class":419},"name",[392,523,422],{"class":402},[392,525,526],{"class":406},")",[392,528,348],{"class":402},[392,530,531],{"class":475},"rule",[392,533,534],{"class":406},"(vine",[392,536,348],{"class":402},[392,538,539],{"class":475},"string",[392,541,542],{"class":406},"()",[392,544,348],{"class":402},[392,546,547],{"class":475},"minLength",[392,549,516],{"class":406},[392,551,553],{"class":552},"sbssI","2",[392,555,556],{"class":406},"))",[392,558,559],{"class":402},",\n",[392,561,563,565,567,570,572,574,577,579,581,583,585,587,589,592,594,596,599,601,604,606],{"class":394,"line":562},8,[392,564,508],{"class":406},[392,566,348],{"class":402},[392,568,569],{"class":475},"exact",[392,571,516],{"class":406},[392,573,422],{"class":402},[392,575,576],{"class":419},"age",[392,578,422],{"class":402},[392,580,526],{"class":406},[392,582,348],{"class":402},[392,584,531],{"class":475},[392,586,534],{"class":406},[392,588,348],{"class":402},[392,590,591],{"class":475},"number",[392,593,542],{"class":406},[392,595,348],{"class":402},[392,597,598],{"class":475},"min",[392,600,516],{"class":406},[392,602,603],{"class":552},"18",[392,605,556],{"class":406},[392,607,559],{"class":402},[392,609,611,613,615,617,619,621,624,626,628,630,632,634,636,639,642,644,647,649,652,654,657,659,661,663,666,668,671],{"class":394,"line":610},9,[392,612,508],{"class":406},[392,614,348],{"class":402},[392,616,569],{"class":475},[392,618,516],{"class":406},[392,620,422],{"class":402},[392,622,623],{"class":419},"status",[392,625,422],{"class":402},[392,627,526],{"class":406},[392,629,348],{"class":402},[392,631,531],{"class":475},[392,633,534],{"class":406},[392,635,348],{"class":402},[392,637,638],{"class":475},"enum",[392,640,641],{"class":406},"([",[392,643,422],{"class":402},[392,645,646],{"class":419},"active",[392,648,422],{"class":402},[392,650,651],{"class":402},",",[392,653,416],{"class":402},[392,655,656],{"class":419},"inactive",[392,658,422],{"class":402},[392,660,651],{"class":402},[392,662,416],{"class":402},[392,664,665],{"class":419},"pending",[392,667,422],{"class":402},[392,669,670],{"class":406},"]))",[392,672,559],{"class":402},[392,674,676,678,680,682,684,686,689,691,693,695,697,699,701,704,707],{"class":394,"line":675},10,[392,677,508],{"class":406},[392,679,348],{"class":402},[392,681,569],{"class":475},[392,683,516],{"class":406},[392,685,422],{"class":402},[392,687,688],{"class":419},"createdAt",[392,690,422],{"class":402},[392,692,526],{"class":406},[392,694,348],{"class":402},[392,696,531],{"class":475},[392,698,534],{"class":406},[392,700,348],{"class":402},[392,702,703],{"class":475},"date",[392,705,706],{"class":406},"())",[392,708,559],{"class":402},[392,710,712,715],{"class":394,"line":711},11,[392,713,714],{"class":406},"  ])",[392,716,425],{"class":402},[718,719,720],"tip",{},[279,721,722,723,726,727,730,731,734],{},"Because filters in a URL are optional by nature, any schema passed to ",[282,724,725],{},".rule(...)"," is automatically made ",[282,728,729],{},".optional()"," under ",[282,732,733],{},"filter.\u003Cname>"," when the validator is compiled, while preserving all type conversions and constraints whenever the client provides that filter.",[368,736,738],{"id":737},"_2-rules-on-a-filterable-class","2. Rules on a Filterable Class",[279,740,741,742,744,745,748],{},"On a ",[282,743,361],{}," class, you can define ",[282,746,747],{},"public rules"," as:",[750,751,752,758,765,772],"ul",{},[339,753,754,755,526],{},"A plain object of VineJS schemas (",[282,756,757],{},"Record\u003Cstring, SchemaTypes>",[339,759,760,761,764],{},"A ",[282,762,763],{},"vine.object({...})"," schema",[339,766,767,768,771],{},"A pre-compiled ",[282,769,770],{},"vine.create(...)"," validator",[339,773,774,775,778],{},"Or a method ",[282,776,777],{},"public rules() { ... }"," returning any of the above",[383,780,783],{"className":385,"code":781,"filename":782,"language":387,"meta":388,"style":388},"import { AllowedFilter, BaseFilterable } from '@eienjs\u002Fadonisjs-api-query';\nimport vine from '@vinejs\u002Fvine';\nimport User from '#models\u002Fuser';\n\nexport default class UserFilterable extends BaseFilterable.for(() => User) {\n  public filters = [\n    'name',\n    'status',\n    AllowedFilter.exact('age').rule(vine.number().min(18)),\n  ];\n\n  public sorts = ['name', 'createdAt'];\n\n  public includes = ['posts'];\n\n  public rules = vine.object({\n    filter: vine.object({\n      name: vine.string().trim().minLength(2).optional(),\n      status: vine.enum(['active', 'inactive']).optional(),\n      age: vine.number().min(18).optional(),\n    }).optional(),\n    sort: vine.string().optional(),\n    include: vine.string().optional(),\n  });\n}\n","app\u002Ffilters\u002Fuser_filterable.ts",[282,784,785,810,826,844,848,886,901,912,922,964,971,975,1007,1012,1035,1040,1062,1080,1122,1163,1197,1213,1237,1261,1271],{"__ignoreMap":388},[392,786,787,789,791,793,795,798,800,802,804,806,808],{"class":394,"line":395},[392,788,399],{"class":398},[392,790,403],{"class":402},[392,792,407],{"class":406},[392,794,651],{"class":402},[392,796,797],{"class":406}," BaseFilterable",[392,799,410],{"class":402},[392,801,413],{"class":398},[392,803,416],{"class":402},[392,805,284],{"class":419},[392,807,422],{"class":402},[392,809,425],{"class":402},[392,811,812,814,816,818,820,822,824],{"class":394,"line":428},[392,813,399],{"class":398},[392,815,433],{"class":406},[392,817,436],{"class":398},[392,819,416],{"class":402},[392,821,294],{"class":419},[392,823,422],{"class":402},[392,825,425],{"class":402},[392,827,828,830,833,835,837,840,842],{"class":394,"line":447},[392,829,399],{"class":398},[392,831,832],{"class":406}," User ",[392,834,436],{"class":398},[392,836,416],{"class":402},[392,838,839],{"class":419},"#models\u002Fuser",[392,841,422],{"class":402},[392,843,425],{"class":402},[392,845,846],{"class":394,"line":454},[392,847,451],{"emptyLinePlaceholder":450},[392,849,850,853,856,859,863,866,868,870,873,875,877,880,883],{"class":394,"line":482},[392,851,852],{"class":398},"export",[392,854,855],{"class":398}," default",[392,857,858],{"class":457}," class",[392,860,862],{"class":861},"sBMFI"," UserFilterable",[392,864,865],{"class":457}," extends",[392,867,797],{"class":406},[392,869,348],{"class":402},[392,871,872],{"class":475},"for",[392,874,516],{"class":406},[392,876,542],{"class":402},[392,878,879],{"class":457}," =>",[392,881,882],{"class":406}," User) ",[392,884,885],{"class":402},"{\n",[392,887,888,891,895,898],{"class":394,"line":494},[392,889,890],{"class":457},"  public",[392,892,894],{"class":893},"swJcz"," filters",[392,896,897],{"class":402}," =",[392,899,900],{"class":406}," [\n",[392,902,903,906,908,910],{"class":394,"line":505},[392,904,905],{"class":402},"    '",[392,907,521],{"class":419},[392,909,422],{"class":402},[392,911,559],{"class":402},[392,913,914,916,918,920],{"class":394,"line":562},[392,915,905],{"class":402},[392,917,623],{"class":419},[392,919,422],{"class":402},[392,921,559],{"class":402},[392,923,924,926,928,930,932,934,936,938,940,942,944,946,948,950,952,954,956,958,960,962],{"class":394,"line":610},[392,925,508],{"class":406},[392,927,348],{"class":402},[392,929,569],{"class":893},[392,931,516],{"class":406},[392,933,422],{"class":402},[392,935,576],{"class":419},[392,937,422],{"class":402},[392,939,526],{"class":406},[392,941,348],{"class":402},[392,943,531],{"class":893},[392,945,534],{"class":406},[392,947,348],{"class":402},[392,949,591],{"class":893},[392,951,542],{"class":406},[392,953,348],{"class":402},[392,955,598],{"class":893},[392,957,516],{"class":406},[392,959,603],{"class":552},[392,961,556],{"class":406},[392,963,559],{"class":402},[392,965,966,969],{"class":394,"line":675},[392,967,968],{"class":406},"  ]",[392,970,425],{"class":402},[392,972,973],{"class":394,"line":711},[392,974,451],{"emptyLinePlaceholder":450},[392,976,978,980,983,985,988,990,992,994,996,998,1000,1002,1005],{"class":394,"line":977},12,[392,979,890],{"class":457},[392,981,982],{"class":893}," sorts",[392,984,897],{"class":402},[392,986,987],{"class":406}," [",[392,989,422],{"class":402},[392,991,521],{"class":419},[392,993,422],{"class":402},[392,995,651],{"class":402},[392,997,416],{"class":402},[392,999,688],{"class":419},[392,1001,422],{"class":402},[392,1003,1004],{"class":406},"]",[392,1006,425],{"class":402},[392,1008,1010],{"class":394,"line":1009},13,[392,1011,451],{"emptyLinePlaceholder":450},[392,1013,1015,1017,1020,1022,1024,1026,1029,1031,1033],{"class":394,"line":1014},14,[392,1016,890],{"class":457},[392,1018,1019],{"class":893}," includes",[392,1021,897],{"class":402},[392,1023,987],{"class":406},[392,1025,422],{"class":402},[392,1027,1028],{"class":419},"posts",[392,1030,422],{"class":402},[392,1032,1004],{"class":406},[392,1034,425],{"class":402},[392,1036,1038],{"class":394,"line":1037},15,[392,1039,451],{"emptyLinePlaceholder":450},[392,1041,1043,1045,1048,1050,1053,1055,1058,1060],{"class":394,"line":1042},16,[392,1044,890],{"class":457},[392,1046,1047],{"class":893}," rules",[392,1049,897],{"class":402},[392,1051,1052],{"class":406}," vine",[392,1054,348],{"class":402},[392,1056,1057],{"class":893},"object",[392,1059,516],{"class":406},[392,1061,885],{"class":402},[392,1063,1065,1068,1070,1072,1074,1076,1078],{"class":394,"line":1064},17,[392,1066,1067],{"class":893},"    filter",[392,1069,381],{"class":402},[392,1071,1052],{"class":406},[392,1073,348],{"class":402},[392,1075,1057],{"class":893},[392,1077,516],{"class":406},[392,1079,885],{"class":402},[392,1081,1083,1086,1088,1090,1092,1094,1096,1098,1101,1103,1105,1107,1109,1111,1113,1115,1118,1120],{"class":394,"line":1082},18,[392,1084,1085],{"class":893},"      name",[392,1087,381],{"class":402},[392,1089,1052],{"class":406},[392,1091,348],{"class":402},[392,1093,539],{"class":893},[392,1095,542],{"class":406},[392,1097,348],{"class":402},[392,1099,1100],{"class":893},"trim",[392,1102,542],{"class":406},[392,1104,348],{"class":402},[392,1106,547],{"class":893},[392,1108,516],{"class":406},[392,1110,553],{"class":552},[392,1112,526],{"class":406},[392,1114,348],{"class":402},[392,1116,1117],{"class":893},"optional",[392,1119,542],{"class":406},[392,1121,559],{"class":402},[392,1123,1125,1128,1130,1132,1134,1136,1138,1140,1142,1144,1146,1148,1150,1152,1155,1157,1159,1161],{"class":394,"line":1124},19,[392,1126,1127],{"class":893},"      status",[392,1129,381],{"class":402},[392,1131,1052],{"class":406},[392,1133,348],{"class":402},[392,1135,638],{"class":893},[392,1137,641],{"class":406},[392,1139,422],{"class":402},[392,1141,646],{"class":419},[392,1143,422],{"class":402},[392,1145,651],{"class":402},[392,1147,416],{"class":402},[392,1149,656],{"class":419},[392,1151,422],{"class":402},[392,1153,1154],{"class":406},"])",[392,1156,348],{"class":402},[392,1158,1117],{"class":893},[392,1160,542],{"class":406},[392,1162,559],{"class":402},[392,1164,1166,1169,1171,1173,1175,1177,1179,1181,1183,1185,1187,1189,1191,1193,1195],{"class":394,"line":1165},20,[392,1167,1168],{"class":893},"      age",[392,1170,381],{"class":402},[392,1172,1052],{"class":406},[392,1174,348],{"class":402},[392,1176,591],{"class":893},[392,1178,542],{"class":406},[392,1180,348],{"class":402},[392,1182,598],{"class":893},[392,1184,516],{"class":406},[392,1186,603],{"class":552},[392,1188,526],{"class":406},[392,1190,348],{"class":402},[392,1192,1117],{"class":893},[392,1194,542],{"class":406},[392,1196,559],{"class":402},[392,1198,1200,1203,1205,1207,1209,1211],{"class":394,"line":1199},21,[392,1201,1202],{"class":402},"    }",[392,1204,526],{"class":406},[392,1206,348],{"class":402},[392,1208,1117],{"class":893},[392,1210,542],{"class":406},[392,1212,559],{"class":402},[392,1214,1216,1219,1221,1223,1225,1227,1229,1231,1233,1235],{"class":394,"line":1215},22,[392,1217,1218],{"class":893},"    sort",[392,1220,381],{"class":402},[392,1222,1052],{"class":406},[392,1224,348],{"class":402},[392,1226,539],{"class":893},[392,1228,542],{"class":406},[392,1230,348],{"class":402},[392,1232,1117],{"class":893},[392,1234,542],{"class":406},[392,1236,559],{"class":402},[392,1238,1240,1243,1245,1247,1249,1251,1253,1255,1257,1259],{"class":394,"line":1239},23,[392,1241,1242],{"class":893},"    include",[392,1244,381],{"class":402},[392,1246,1052],{"class":406},[392,1248,348],{"class":402},[392,1250,539],{"class":893},[392,1252,542],{"class":406},[392,1254,348],{"class":402},[392,1256,1117],{"class":893},[392,1258,542],{"class":406},[392,1260,559],{"class":402},[392,1262,1264,1267,1269],{"class":394,"line":1263},24,[392,1265,1266],{"class":402},"  }",[392,1268,526],{"class":406},[392,1270,425],{"class":402},[392,1272,1274],{"class":394,"line":1273},25,[392,1275,1276],{"class":402},"}\n",[308,1278,1279],{},[279,1280,1281,1282,1284,1285,1288,1289,1291,1292,1295,1296,1298,1299,1301,1302,1305,1306,1308],{},"If you omit ",[282,1283,298],{}," from ",[282,1286,1287],{},"this.rules"," (for example, only validating ",[282,1290,302],{}," or ",[282,1293,1294],{},"page"," in ",[282,1297,357],{},"), any per-filter ",[282,1300,725],{}," definitions from ",[282,1303,1304],{},"this.filters"," are automatically merged into the ",[282,1307,298],{}," key of the compiled validator.",[328,1310,1312],{"id":1311},"automatic-vs-manual-validation","Automatic vs. Manual Validation",[368,1314,1316],{"id":1315},"automatic-validation-default","Automatic Validation (Default)",[279,1318,1319,1320,1323,1324,1327,1328,1291,1331,1334,1335,366],{},"When ",[282,1321,1322],{},"autoValidate"," is ",[282,1325,1326],{},"true"," (the default), any query that has validation rules configured—either via ",[282,1329,1330],{},"BaseFilterable.rules",[282,1332,1333],{},"AllowedFilter.rule()","—automatically validates the request right before the query is executed (",[282,1336,1337],{},"execQuery",[383,1339,1342],{"className":385,"code":1340,"filename":1341,"language":387,"meta":388,"style":388},"import type { HttpContext } from '@adonisjs\u002Fcore\u002Fhttp';\nimport User from '#models\u002Fuser';\n\nexport default class UsersController {\n  public async index({ request }: HttpContext) {\n    \u002F\u002F Automatically validates using VineJS before running the SQL query!\n    \u002F\u002F Throws E_VALIDATION_ERROR (HTTP 422) if validation fails.\n    return await User.$filter(request).paginate(1, 15);\n  }\n}\n","app\u002Fcontrollers\u002Fusers_controller.ts",[282,1343,1344,1369,1385,1389,1403,1429,1435,1440,1480,1485],{"__ignoreMap":388},[392,1345,1346,1348,1351,1353,1356,1358,1360,1362,1365,1367],{"class":394,"line":395},[392,1347,399],{"class":398},[392,1349,1350],{"class":398}," type",[392,1352,403],{"class":402},[392,1354,1355],{"class":406}," HttpContext",[392,1357,410],{"class":402},[392,1359,413],{"class":398},[392,1361,416],{"class":402},[392,1363,1364],{"class":419},"@adonisjs\u002Fcore\u002Fhttp",[392,1366,422],{"class":402},[392,1368,425],{"class":402},[392,1370,1371,1373,1375,1377,1379,1381,1383],{"class":394,"line":428},[392,1372,399],{"class":398},[392,1374,832],{"class":406},[392,1376,436],{"class":398},[392,1378,416],{"class":402},[392,1380,839],{"class":419},[392,1382,422],{"class":402},[392,1384,425],{"class":402},[392,1386,1387],{"class":394,"line":447},[392,1388,451],{"emptyLinePlaceholder":450},[392,1390,1391,1393,1395,1397,1400],{"class":394,"line":454},[392,1392,852],{"class":398},[392,1394,855],{"class":398},[392,1396,858],{"class":457},[392,1398,1399],{"class":861}," UsersController",[392,1401,1402],{"class":402}," {\n",[392,1404,1405,1407,1410,1413,1416,1420,1423,1425,1427],{"class":394,"line":482},[392,1406,890],{"class":457},[392,1408,1409],{"class":457}," async",[392,1411,1412],{"class":893}," index",[392,1414,1415],{"class":402},"({",[392,1417,1419],{"class":1418},"sHdIc"," request",[392,1421,1422],{"class":402}," }:",[392,1424,1355],{"class":861},[392,1426,526],{"class":402},[392,1428,1402],{"class":402},[392,1430,1431],{"class":394,"line":494},[392,1432,1434],{"class":1433},"sHwdD","    \u002F\u002F Automatically validates using VineJS before running the SQL query!\n",[392,1436,1437],{"class":394,"line":505},[392,1438,1439],{"class":1433},"    \u002F\u002F Throws E_VALIDATION_ERROR (HTTP 422) if validation fails.\n",[392,1441,1442,1445,1447,1449,1451,1454,1456,1459,1461,1463,1466,1468,1471,1473,1476,1478],{"class":394,"line":562},[392,1443,1444],{"class":398},"    return",[392,1446,467],{"class":398},[392,1448,470],{"class":406},[392,1450,348],{"class":402},[392,1452,1453],{"class":475},"$filter",[392,1455,516],{"class":893},[392,1457,1458],{"class":406},"request",[392,1460,526],{"class":893},[392,1462,348],{"class":402},[392,1464,1465],{"class":475},"paginate",[392,1467,516],{"class":893},[392,1469,1470],{"class":552},"1",[392,1472,651],{"class":402},[392,1474,1475],{"class":552}," 15",[392,1477,526],{"class":893},[392,1479,425],{"class":402},[392,1481,1482],{"class":394,"line":610},[392,1483,1484],{"class":402},"  }\n",[392,1486,1487],{"class":394,"line":675},[392,1488,1276],{"class":402},[279,1490,1319,1491,1494,1495,1498,1499,1501],{},[282,1492,1493],{},"request.validateUsing"," is available on the AdonisJS ",[282,1496,1497],{},"HttpRequest",", the package uses it so standard AdonisJS error reporters and content negotiation work seamlessly. Furthermore, validated and transformed values from ",[282,1500,298],{}," (such as trimmed strings or coerced numbers\u002Fbooleans) are used when reading filter values.",[368,1503,1505],{"id":1504},"disabling-automatic-validation","Disabling Automatic Validation",[279,1507,1508],{},"You can disable automatic validation for a single filterable class or globally across your app:",[1510,1511,1512,1605],"code-group",{},[383,1513,1516],{"className":385,"code":1514,"filename":1515,"language":387,"meta":388,"style":388},"import { BaseFilterable } from '@eienjs\u002Fadonisjs-api-query';\nimport User from '#models\u002Fuser';\n\nexport default class UserFilterable extends BaseFilterable.for(() => User) {\n  public autoValidate = false;\n}\n","Per Filterable Class",[282,1517,1518,1538,1554,1558,1586,1601],{"__ignoreMap":388},[392,1519,1520,1522,1524,1526,1528,1530,1532,1534,1536],{"class":394,"line":395},[392,1521,399],{"class":398},[392,1523,403],{"class":402},[392,1525,797],{"class":406},[392,1527,410],{"class":402},[392,1529,413],{"class":398},[392,1531,416],{"class":402},[392,1533,284],{"class":419},[392,1535,422],{"class":402},[392,1537,425],{"class":402},[392,1539,1540,1542,1544,1546,1548,1550,1552],{"class":394,"line":428},[392,1541,399],{"class":398},[392,1543,832],{"class":406},[392,1545,436],{"class":398},[392,1547,416],{"class":402},[392,1549,839],{"class":419},[392,1551,422],{"class":402},[392,1553,425],{"class":402},[392,1555,1556],{"class":394,"line":447},[392,1557,451],{"emptyLinePlaceholder":450},[392,1559,1560,1562,1564,1566,1568,1570,1572,1574,1576,1578,1580,1582,1584],{"class":394,"line":454},[392,1561,852],{"class":398},[392,1563,855],{"class":398},[392,1565,858],{"class":457},[392,1567,862],{"class":861},[392,1569,865],{"class":457},[392,1571,797],{"class":406},[392,1573,348],{"class":402},[392,1575,872],{"class":475},[392,1577,516],{"class":406},[392,1579,542],{"class":402},[392,1581,879],{"class":457},[392,1583,882],{"class":406},[392,1585,885],{"class":402},[392,1587,1588,1590,1593,1595,1599],{"class":394,"line":482},[392,1589,890],{"class":457},[392,1591,1592],{"class":893}," autoValidate",[392,1594,897],{"class":402},[392,1596,1598],{"class":1597},"sfNiH"," false",[392,1600,425],{"class":402},[392,1602,1603],{"class":394,"line":494},[392,1604,1276],{"class":402},[383,1606,1609],{"className":385,"code":1607,"filename":1608,"language":387,"meta":388,"style":388},"import { defineConfig } from '@eienjs\u002Fadonisjs-api-query';\n\nexport default defineConfig({\n  autoValidate: false,\n});\n","Globally in config\u002Fapiquery.ts",[282,1610,1611,1632,1636,1648,1659],{"__ignoreMap":388},[392,1612,1613,1615,1617,1620,1622,1624,1626,1628,1630],{"class":394,"line":395},[392,1614,399],{"class":398},[392,1616,403],{"class":402},[392,1618,1619],{"class":406}," defineConfig",[392,1621,410],{"class":402},[392,1623,413],{"class":398},[392,1625,416],{"class":402},[392,1627,284],{"class":419},[392,1629,422],{"class":402},[392,1631,425],{"class":402},[392,1633,1634],{"class":394,"line":428},[392,1635,451],{"emptyLinePlaceholder":450},[392,1637,1638,1640,1642,1644,1646],{"class":394,"line":447},[392,1639,852],{"class":398},[392,1641,855],{"class":398},[392,1643,1619],{"class":475},[392,1645,516],{"class":406},[392,1647,885],{"class":402},[392,1649,1650,1653,1655,1657],{"class":394,"line":454},[392,1651,1652],{"class":893},"  autoValidate",[392,1654,381],{"class":402},[392,1656,1598],{"class":1597},[392,1658,559],{"class":402},[392,1660,1661,1664,1666],{"class":394,"line":482},[392,1662,1663],{"class":402},"}",[392,1665,526],{"class":406},[392,1667,425],{"class":402},[368,1669,1671],{"id":1670},"explicit-manual-validation","Explicit \u002F Manual Validation",[279,1673,1674],{},"You can trigger validation explicitly at any time using:",[383,1676,1678],{"className":385,"code":1677,"language":387,"meta":388,"style":388},"import { ApiQueryBuilderRequest } from '@eienjs\u002Fadonisjs-api-query';\nimport vine from '@vinejs\u002Fvine';\n\n\u002F\u002F 1. Via the Filterable class static methods:\nconst validatedPayload = await UserFilterable.validate(request);\n\n\u002F\u002F Or validate and obtain the query builder in one step:\nconst query = await UserFilterable.$validateAndQuery(request);\nconst users = await query.paginate(1, 15);\n\n\u002F\u002F 2. Via the query builder `.validate()` macro:\nconst userQuery = User.$filter(request);\nawait userQuery.validate();\nconst results = await userQuery;\n\n\u002F\u002F 3. Directly via ApiQueryBuilderRequest in a controller:\nconst apiRequest = new ApiQueryBuilderRequest(request);\nconst data = await apiRequest.validate({\n  filter: vine.object({\n    name: vine.string().minLength(3).optional(),\n  }).optional(),\n});\n",[282,1679,1680,1701,1717,1721,1726,1749,1753,1758,1780,1809,1813,1818,1837,1853,1868,1872,1877,1895,1917,1934,1968,1982],{"__ignoreMap":388},[392,1681,1682,1684,1686,1689,1691,1693,1695,1697,1699],{"class":394,"line":395},[392,1683,399],{"class":398},[392,1685,403],{"class":402},[392,1687,1688],{"class":406}," ApiQueryBuilderRequest",[392,1690,410],{"class":402},[392,1692,413],{"class":398},[392,1694,416],{"class":402},[392,1696,284],{"class":419},[392,1698,422],{"class":402},[392,1700,425],{"class":402},[392,1702,1703,1705,1707,1709,1711,1713,1715],{"class":394,"line":428},[392,1704,399],{"class":398},[392,1706,433],{"class":406},[392,1708,436],{"class":398},[392,1710,416],{"class":402},[392,1712,294],{"class":419},[392,1714,422],{"class":402},[392,1716,425],{"class":402},[392,1718,1719],{"class":394,"line":447},[392,1720,451],{"emptyLinePlaceholder":450},[392,1722,1723],{"class":394,"line":454},[392,1724,1725],{"class":1433},"\u002F\u002F 1. Via the Filterable class static methods:\n",[392,1727,1728,1730,1733,1735,1737,1739,1741,1744,1747],{"class":394,"line":482},[392,1729,458],{"class":457},[392,1731,1732],{"class":406}," validatedPayload ",[392,1734,464],{"class":402},[392,1736,467],{"class":398},[392,1738,862],{"class":406},[392,1740,348],{"class":402},[392,1742,1743],{"class":475},"validate",[392,1745,1746],{"class":406},"(request)",[392,1748,425],{"class":402},[392,1750,1751],{"class":394,"line":494},[392,1752,451],{"emptyLinePlaceholder":450},[392,1754,1755],{"class":394,"line":505},[392,1756,1757],{"class":1433},"\u002F\u002F Or validate and obtain the query builder in one step:\n",[392,1759,1760,1762,1765,1767,1769,1771,1773,1776,1778],{"class":394,"line":562},[392,1761,458],{"class":457},[392,1763,1764],{"class":406}," query ",[392,1766,464],{"class":402},[392,1768,467],{"class":398},[392,1770,862],{"class":406},[392,1772,348],{"class":402},[392,1774,1775],{"class":475},"$validateAndQuery",[392,1777,1746],{"class":406},[392,1779,425],{"class":402},[392,1781,1782,1784,1786,1788,1790,1793,1795,1797,1799,1801,1803,1805,1807],{"class":394,"line":610},[392,1783,458],{"class":457},[392,1785,461],{"class":406},[392,1787,464],{"class":402},[392,1789,467],{"class":398},[392,1791,1792],{"class":406}," query",[392,1794,348],{"class":402},[392,1796,1465],{"class":475},[392,1798,516],{"class":406},[392,1800,1470],{"class":552},[392,1802,651],{"class":402},[392,1804,1475],{"class":552},[392,1806,526],{"class":406},[392,1808,425],{"class":402},[392,1810,1811],{"class":394,"line":675},[392,1812,451],{"emptyLinePlaceholder":450},[392,1814,1815],{"class":394,"line":711},[392,1816,1817],{"class":1433},"\u002F\u002F 2. Via the query builder `.validate()` macro:\n",[392,1819,1820,1822,1825,1827,1829,1831,1833,1835],{"class":394,"line":977},[392,1821,458],{"class":457},[392,1823,1824],{"class":406}," userQuery ",[392,1826,464],{"class":402},[392,1828,470],{"class":406},[392,1830,348],{"class":402},[392,1832,1453],{"class":475},[392,1834,1746],{"class":406},[392,1836,425],{"class":402},[392,1838,1839,1842,1845,1847,1849,1851],{"class":394,"line":1009},[392,1840,1841],{"class":398},"await",[392,1843,1844],{"class":406}," userQuery",[392,1846,348],{"class":402},[392,1848,1743],{"class":475},[392,1850,542],{"class":406},[392,1852,425],{"class":402},[392,1854,1855,1857,1860,1862,1864,1866],{"class":394,"line":1014},[392,1856,458],{"class":457},[392,1858,1859],{"class":406}," results ",[392,1861,464],{"class":402},[392,1863,467],{"class":398},[392,1865,1844],{"class":406},[392,1867,425],{"class":402},[392,1869,1870],{"class":394,"line":1037},[392,1871,451],{"emptyLinePlaceholder":450},[392,1873,1874],{"class":394,"line":1042},[392,1875,1876],{"class":1433},"\u002F\u002F 3. Directly via ApiQueryBuilderRequest in a controller:\n",[392,1878,1879,1881,1884,1886,1889,1891,1893],{"class":394,"line":1064},[392,1880,458],{"class":457},[392,1882,1883],{"class":406}," apiRequest ",[392,1885,464],{"class":402},[392,1887,1888],{"class":402}," new",[392,1890,1688],{"class":475},[392,1892,1746],{"class":406},[392,1894,425],{"class":402},[392,1896,1897,1899,1902,1904,1906,1909,1911,1913,1915],{"class":394,"line":1082},[392,1898,458],{"class":457},[392,1900,1901],{"class":406}," data ",[392,1903,464],{"class":402},[392,1905,467],{"class":398},[392,1907,1908],{"class":406}," apiRequest",[392,1910,348],{"class":402},[392,1912,1743],{"class":475},[392,1914,516],{"class":406},[392,1916,885],{"class":402},[392,1918,1919,1922,1924,1926,1928,1930,1932],{"class":394,"line":1124},[392,1920,1921],{"class":893},"  filter",[392,1923,381],{"class":402},[392,1925,1052],{"class":406},[392,1927,348],{"class":402},[392,1929,1057],{"class":475},[392,1931,516],{"class":406},[392,1933,885],{"class":402},[392,1935,1936,1939,1941,1943,1945,1947,1949,1951,1953,1955,1958,1960,1962,1964,1966],{"class":394,"line":1165},[392,1937,1938],{"class":893},"    name",[392,1940,381],{"class":402},[392,1942,1052],{"class":406},[392,1944,348],{"class":402},[392,1946,539],{"class":475},[392,1948,542],{"class":406},[392,1950,348],{"class":402},[392,1952,547],{"class":475},[392,1954,516],{"class":406},[392,1956,1957],{"class":552},"3",[392,1959,526],{"class":406},[392,1961,348],{"class":402},[392,1963,1117],{"class":475},[392,1965,542],{"class":406},[392,1967,559],{"class":402},[392,1969,1970,1972,1974,1976,1978,1980],{"class":394,"line":1199},[392,1971,1266],{"class":402},[392,1973,526],{"class":406},[392,1975,348],{"class":402},[392,1977,1117],{"class":475},[392,1979,542],{"class":406},[392,1981,559],{"class":402},[392,1983,1984,1986,1988],{"class":394,"line":1215},[392,1985,1663],{"class":402},[392,1987,526],{"class":406},[392,1989,425],{"class":402},[718,1991,1992],{},[279,1993,1994,1995,1998,1999,2002,2003,2006],{},"Validation is memoized per ",[282,1996,1997],{},"ApiQueryBuilderRequest"," instance, so calling ",[282,2000,2001],{},".validate()"," manually before executing a query with ",[282,2004,2005],{},"autoValidate: true"," will not run validation twice.",[2008,2009,2010],"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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .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 .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}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}",{"title":388,"searchDepth":395,"depth":428,"links":2012},[2013,2018],{"id":330,"depth":428,"text":331,"children":2014},[2015,2017],{"id":370,"depth":447,"text":2016},"1. Per-Filter Rules with .rule()",{"id":737,"depth":447,"text":738},{"id":1311,"depth":428,"text":1312,"children":2019},[2020,2021,2022],{"id":1315,"depth":447,"text":1316},{"id":1504,"depth":447,"text":1505},{"id":1670,"depth":447,"text":1671},"Validate API query parameters automatically or explicitly using VineJS.","md",{},{"icon":86},{"title":83,"description":2023},"B99ZiUlp87UNbkoIAvzWBPFqK-xTBdcAfgyaSyjUXeQ",[2030,2032],{"title":78,"path":79,"stem":80,"description":2031,"icon":81,"children":-1},"Encapsulate allowed filters, sorts, includes, setup hooks, and validation rules in dedicated classes.",{"title":94,"path":95,"stem":96,"description":2033,"icon":97,"children":-1},"Build reusable filter, sort, and include classes implementing Filter, Sort, and Include interfaces.",{"id":2035,"extension":2036,"meta":2037,"packages":2038,"stem":2081,"__hash__":2082},"packages\u002Fdata\u002Fpackages.json","json",{},[2039,2046,2052,2058,2063,2069,2075],{"name":2040,"title":2041,"description":2042,"icon":86,"category":2043,"repo":2044,"version":2045,"docs":450},"adonisjs-permission","Permission","Associate users with roles and permissions in your AdonisJS app","adonisjs","https:\u002F\u002Fgithub.com\u002Feienjs\u002Fadonisjs-permission","1.0.0",{"name":2047,"title":2048,"description":2049,"icon":33,"category":2043,"repo":2050,"version":2051,"docs":450},"adonisjs-api-query","API Query","Easily build Lucid queries from API requests","https:\u002F\u002Fgithub.com\u002Feienjs\u002Fadonisjs-api-query","3.0.1",{"name":2053,"title":2054,"description":2055,"icon":249,"category":2043,"repo":2056,"version":2057,"docs":450},"adonisjs-soft-deletes","Soft Deletes","Provider-based Soft deletes for AdonisJS","https:\u002F\u002Fgithub.com\u002Feienjs\u002Fadonisjs-soft-deletes","1.0.2",{"name":2059,"title":195,"description":2060,"icon":196,"category":2043,"repo":2061,"version":2062,"docs":450},"adonisjs-simple-auth","Single API key authentication for AdonisJS v7 applications","https:\u002F\u002Fgithub.com\u002Feienjs\u002Fadonisjs-simple-auth","2.1.0",{"name":2064,"title":2065,"description":2066,"icon":2067,"category":2043,"repo":2068,"docs":22},"adonisjs-sentry","Sentry","Sentry service provider for AdonisJS v7.","i-tabler-bug","https:\u002F\u002Fgithub.com\u002Feienjs\u002Fadonisjs-sentry",{"name":2070,"title":2071,"description":2072,"icon":141,"category":2073,"repo":2074,"docs":22},"eslint-config","ESLint Config","The EienJS ESLint config preset.","tooling","https:\u002F\u002Fgithub.com\u002Feienjs\u002Feslint-config",{"name":2076,"title":2077,"description":2078,"icon":2079,"category":2073,"repo":2080,"docs":22},"adonisjs-pkg-boilerplate","Package Boilerplate","A boilerplate for creating AdonisJS packages.","i-tabler-package","https:\u002F\u002Fgithub.com\u002Feienjs\u002Fadonisjs-pkg-boilerplate","data\u002Fpackages","5fILU7Jigsw2ib-NQg4Fr4sWgIkg0kLgpVm371gTzVY",1793868429093]