[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-directus-rstore-nuxt-drizzle":3,"mdc-dlfnru-key":36,"related-org-directus-rstore-nuxt-drizzle":2227,"related-repo-directus-rstore-nuxt-drizzle":2331},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":31,"sourceUrl":34,"mdContent":35},"rstore-nuxt-drizzle","expose Drizzle data in Nuxt applications","Use when exposing Drizzle-backed data in Nuxt, OR before writing a custom `server\u002Fapi` route, Nitro `defineEventHandler`, H3 handler, or REST\u002FCRUD endpoint that reads or writes a Drizzle table — prefer the module's generated endpoints, `allowTables`, `hooksForTable`, and `publishRstoreDrizzleRealtimeUpdate` over hand-rolled routes; also covers generating collections\u002FAPI routes from schema, adding a new Drizzle table to the rstore API, fixing `Collection \"\u003Cname>\" is not allowed` errors, fetch\u002Ffilter\u002Fpaginate, create\u002Fupdate\u002Fdelete, realtime, offline, and table-level access control; pair with `rstore-nuxt` for Nuxt integration and `rstore-vue` for collection\u002Fquery\u002Fform behavior.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"directus","Directus","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdirectus.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Nuxt","nuxt","tag",{"name":17,"slug":18,"type":15},"Database","database",{"name":20,"slug":21,"type":15},"API Development","api-development",{"name":23,"slug":24,"type":15},"Drizzle","drizzle",425,"https:\u002F\u002Fgithub.com\u002Fdirectus\u002Frstore","2026-07-12T07:51:10.079641",null,19,[],{"repoUrl":26,"stars":25,"forks":29,"topics":32,"description":33},[],"The Reactive Data Store for Vue and Nuxt developers.","https:\u002F\u002Fgithub.com\u002Fdirectus\u002Frstore\u002Ftree\u002FHEAD\u002Fpackages\u002Fnuxt-drizzle\u002Fskills\u002Frstore-nuxt-drizzle","---\nname: rstore-nuxt-drizzle\ndescription: \"Use when exposing Drizzle-backed data in Nuxt, OR before writing a custom `server\u002Fapi` route, Nitro `defineEventHandler`, H3 handler, or REST\u002FCRUD endpoint that reads or writes a Drizzle table — prefer the module's generated endpoints, `allowTables`, `hooksForTable`, and `publishRstoreDrizzleRealtimeUpdate` over hand-rolled routes; also covers generating collections\u002FAPI routes from schema, adding a new Drizzle table to the rstore API, fixing `Collection \\\"\u003Cname>\\\" is not allowed` errors, fetch\u002Ffilter\u002Fpaginate, create\u002Fupdate\u002Fdelete, realtime, offline, and table-level access control; pair with `rstore-nuxt` for Nuxt integration and `rstore-vue` for collection\u002Fquery\u002Fform behavior.\"\n---\n\n# Rstore Nuxt Drizzle\n\nGenerate rstore collections and API\u002Fruntime behavior from Drizzle schema metadata, then add realtime\u002Foffline and hook-based server controls as needed.\nUse this skill with the `@rstore\u002Fnuxt` skill for Nuxt module\u002Fruntime behavior and with the `@rstore\u002Fvue` skill for underlying collection\u002Fquery\u002Fform semantics.\n\n## Documentation map\n\n| Area | Documentation |\n| --- | --- |\n| Nuxt + Drizzle plugin overview | [https:\u002F\u002Frstore.akryum.dev\u002Fplugins\u002Fnuxt-drizzle](https:\u002F\u002Frstore.akryum.dev\u002Fplugins\u002Fnuxt-drizzle) |\n| Query and filter model | [https:\u002F\u002Frstore.akryum.dev\u002Fguide\u002Fdata\u002Fquery](https:\u002F\u002Frstore.akryum.dev\u002Fguide\u002Fdata\u002Fquery) |\n| Relations behavior | [https:\u002F\u002Frstore.akryum.dev\u002Fguide\u002Fschema\u002Frelations](https:\u002F\u002Frstore.akryum.dev\u002Fguide\u002Fschema\u002Frelations) |\n| Realtime subscriptions | [https:\u002F\u002Frstore.akryum.dev\u002Fguide\u002Fdata\u002Flive](https:\u002F\u002Frstore.akryum.dev\u002Fguide\u002Fdata\u002Flive) |\n| Offline behavior | [https:\u002F\u002Frstore.akryum.dev\u002Fguide\u002Fdata\u002Foffline](https:\u002F\u002Frstore.akryum.dev\u002Fguide\u002Fdata\u002Foffline) |\n| Plugin hooks and extension points | [https:\u002F\u002Frstore.akryum.dev\u002Fguide\u002Fplugin\u002Fhooks](https:\u002F\u002Frstore.akryum.dev\u002Fguide\u002Fplugin\u002Fhooks) |\n| Related package skills | `rstore-nuxt` skill (`@rstore\u002Fnuxt`), `rstore-vue` skill (`@rstore\u002Fvue`) |\n| Skill-local API references | [.\u002Freferences\u002Findex.md](.\u002Freferences\u002Findex.md) |\n\n## Core concepts\n\n| Primitive | Purpose |\n| --- | --- |\n| `rstoreDrizzle.drizzleConfigPath` | Locates Drizzle config file loaded by the module |\n| `drizzleConfig.schema` | Must be a single importable schema file path |\n| `drizzleImport` | Defines server-side drizzle getter import used by generated handlers |\n| `#build\u002F$rstore-drizzle-collections` | Generated collections with inferred keys, meta, and relations |\n| `apiPath` | Base REST route for generated CRUD handlers |\n| `ws` | Enables websocket realtime handler and client plugin |\n| `offline` | Enables offline sync plugins and sync config template values |\n| `rstoreDrizzleHooks` \u002F `hooksForTable` \u002F `allowTables` | Server extension and access-control APIs |\n\n## Quick start\n\n```ts\nexport default defineNuxtConfig({\n  modules: ['@rstore\u002Fnuxt-drizzle'],\n  rstoreDrizzle: {\n    drizzleImport: {\n      name: 'useDrizzle',\n      from: '~~\u002Fserver\u002Futils\u002Fdrizzle',\n    },\n    apiPath: '\u002Fapi\u002Frstore',\n  },\n})\n```\n\nAlso provide the server import the module expects by default:\n\n```ts\n\u002F\u002F server\u002Futils\u002Fdrizzle.ts\nexport function useDrizzle() {\n  \u002F\u002F return your drizzle instance\n}\n```\n\n## Task workflow\n\n1. Confirm `drizzle.config.ts` exists and exports a config with string `schema`.\n2. Configure `drizzleImport` if not using `~~\u002Fserver\u002Futils\u002Fdrizzle` with `useDrizzle`.\n3. Let the module generate collections and handlers; avoid parallel manual CRUD layers.\n4. Query through rstore collection APIs using `findOptions.where` and supported drizzle params.\n5. Enable `ws` and\u002For `offline` only when required by product behavior.\n6. Add server-side restrictions\u002Ftransforms via hook APIs (`hooksForTable`, `allowTables`, `rstoreDrizzleHooks`).\n7. When adding a new Drizzle table to a project that already calls `allowTables`, register the new table in the same `allowTables([...])` list — once initialized the allow-list is permanent and unlisted tables throw `Collection \"\u003Cname>\" is not allowed.`.\n8. For Nuxt module\u002Fruntime integration behavior, use the `rstore-nuxt` skill.\n9. For non-drizzle-specific store\u002Fquery\u002Fform behavior, use the `rstore-vue` skill.\n\n## When you are tempted to write a custom endpoint\n\nBefore adding a `server\u002Fapi\u002F*.ts` handler, a `defineEventHandler`, or any custom REST route that touches a Drizzle table, decide which case applies:\n\n- **Plain CRUD for an existing Drizzle table** → stop. Use the generated endpoints under `apiPath`. Add logic via `hooksForTable(table, { 'item.beforeCreate': ... })` or the matching `*.before` \u002F `*.after` hook — don't fork into a parallel route.\n- **Row-level access control, tenant scoping, soft-delete filters** → use `allowTables([...])` plus `hooksForTable` with `*.before` hooks calling `transformQuery(({ where, extras }) => ...)`. A custom route would bypass both guards.\n- **Bulk or direct Drizzle write the generated endpoints cannot express** (multi-table transaction, raw SQL, migration-style script) → a custom route is fine, but **call `publishRstoreDrizzleRealtimeUpdate`** after the write so `liveQuery` subscribers stay in sync. See the Nuxt + Drizzle docs section on \"Publishing realtime updates from direct Drizzle queries\".\n- **Non-CRUD RPC** (trigger an external workflow, send an email, compute a derived value) → custom route is appropriate; it is outside rstore's scope.\n\n## Query and cache conventions\n\n- Prefer `findOptions.where` over the deprecated `params.where`.\n- Use `findOptions.include` for relation loading; relation include objects support `where`, `orderBy`, `columns`, `limit`, and nested `include`.\n- Use `params.limit`, `offset`, `columns`, `orderBy`, and `keys` to shape Drizzle-backed queries.\n- Use `params.with` only as a low-level Drizzle override; when both are provided, `params.with` takes precedence over `findOptions.include`.\n- Query params and request bodies are serialized with `SuperJSON`, so keep them serializable.\n- The runtime plugin parses `createdAt` and `updatedAt` string values into `Date` objects through collection defaults.\n- `fetchRelations` translates included relations into follow-up equality queries against the generated target collections.\n- Cache filtering for `findFirst` and `findMany` reuses the same `where` and `orderBy` semantics client-side.\n\n## Realtime and offline behavior\n\n- `ws: true` (or object form) enables websocket handler registration and client subscription plugin wiring.\n- Realtime subscriptions are keyed by collection, key, and `where`; exact filter shape impacts topic reuse.\n- On websocket reconnect, the runtime re-sends active subscriptions and triggers `realtimeReconnectEventHook`, which makes `liveQuery` refresh.\n- `offline` enables offline plugin generation and sync config wiring.\n- Offline sync expects stable keys and usable `updatedAt` comparison values.\n- `offline.serializeDateValue` exists for non-default date comparison serialization.\n\n## Server extension points\n\n- Use `hooksForTable(table, hooks)` to scope API hooks to a specific Drizzle table.\n- Use `rstoreDrizzleHooks.hook(...)` when the extension needs to work across multiple tables.\n- `*.before` hooks can call `transformQuery(({ where, extras }) => ...)` to add constraints before execution.\n- Use `allowTables([...])` to deny access to unlisted generated collections.\n- Use the `realtime.filter` hook to reject websocket updates for a peer when row-level rules apply.\n\n## Guardrails\n\n1. If drizzle config is missing, module setup is skipped after warning.\n2. Non-string `schema` in drizzle config throws.\n3. Multi-field relations\u002Freferences are not supported by current relation inference and throw.\n4. Renaming schema exports renames generated collection names.\n5. Composite keys serialize as `value1::value2`; mismatches here cause lookup\u002Fupdate issues.\n6. `params.where` is deprecated; use `findOptions.where`.\n7. `allowTables` flips the default from \"all tables exposed\" to \"deny by default\". After the first call, every new Drizzle table you add to the schema must also be added to `allowTables` — otherwise endpoints throw `Collection \"\u003Cname>\" is not allowed.` at runtime.\n8. Do not hand-write `server\u002Fapi\u002F\u003Ctable>\u002F*` CRUD routes for tables already exposed by the generated `apiPath`. Duplicate code paths drift, bypass `allowTables` \u002F `hooksForTable`, and miss realtime publishing — extend behavior through hooks or use `publishRstoreDrizzleRealtimeUpdate` from a justified custom route.\n\n## References\n\n| Topic | Description | Reference |\n| --- | --- | --- |\n| API index | Full map of Nuxt-Drizzle API\u002Fconfig references | [api-index](.\u002Freferences\u002Findex.md) |\n| rstoreDrizzle.drizzleConfigPath | Drizzle config lookup path | [api-drizzle-config-path](.\u002Freferences\u002Fapi-drizzle-config-path.md) |\n| rstoreDrizzle.drizzleImport | Server drizzle getter import contract | [api-drizzle-import](.\u002Freferences\u002Fapi-drizzle-import.md) |\n| rstoreDrizzle.apiPath | Generated REST base path | [api-api-path](.\u002Freferences\u002Fapi-api-path.md) |\n| rstoreDrizzle.ws | Enable websocket realtime integration | [api-ws](.\u002Freferences\u002Fapi-ws.md) |\n| rstoreDrizzle.ws.apiPath | Override websocket endpoint path | [api-ws-api-path](.\u002Freferences\u002Fapi-ws-api-path.md) |\n| rstoreDrizzle.offline | Enable offline sync integration | [api-offline](.\u002Freferences\u002Fapi-offline.md) |\n| rstoreDrizzle.offline.serializeDateValue | Customize offline sync date serialization | [api-offline-serialize-date-value](.\u002Freferences\u002Fapi-offline-serialize-date-value.md) |\n| findOptions.include | Primary relation include option | [api-find-options-include](.\u002Freferences\u002Fapi-find-options-include.md) |\n| findOptions.where | Primary drizzle filter option | [api-find-options-where](.\u002Freferences\u002Fapi-find-options-where.md) |\n| params.where (deprecated) | Legacy filter location | [api-params-where](.\u002Freferences\u002Fapi-params-where.md) |\n| params.limit | Limit rows in list queries | [api-params-limit](.\u002Freferences\u002Fapi-params-limit.md) |\n| params.offset | Offset rows in list queries | [api-params-offset](.\u002Freferences\u002Fapi-params-offset.md) |\n| params.with | Low-level Drizzle relation override | [api-params-with](.\u002Freferences\u002Fapi-params-with.md) |\n| params.columns | Selected column projection | [api-params-columns](.\u002Freferences\u002Fapi-params-columns.md) |\n| params.orderBy | Sort order format and behavior | [api-params-order-by](.\u002Freferences\u002Fapi-params-order-by.md) |\n| params.keys | Key-constrained list fetches | [api-params-keys](.\u002Freferences\u002Fapi-params-keys.md) |\n| filterWhere | Local cache condition evaluator | [api-filter-where](.\u002Freferences\u002Fapi-filter-where.md) |\n| rstoreDrizzleHooks | Global server\u002Frealtime hook bus | [api-rstore-drizzle-hooks](.\u002Freferences\u002Fapi-rstore-drizzle-hooks.md) |\n| hooksForTable | Table-scoped hook registration helper | [api-hooks-for-table](.\u002Freferences\u002Fapi-hooks-for-table.md) |\n| allowTables | Collection allow-list access control | [api-allow-tables](.\u002Freferences\u002Fapi-allow-tables.md) |\n| publishRstoreDrizzleRealtimeUpdate | Publish manual realtime updates for direct Drizzle writes | [api-publish-rstore-drizzle-realtime-update](.\u002Freferences\u002Fapi-publish-rstore-drizzle-realtime-update.md) |\n| Base @rstore\u002Fnuxt skill | Nuxt module\u002Fruntime integration semantics | `rstore-nuxt` skill |\n| Base @rstore\u002Fvue skill | Underlying collection\u002Fquery\u002Fform semantics | `rstore-vue` skill |\n\n## Further reading\n\n- Nuxt + Drizzle docs: [https:\u002F\u002Frstore.akryum.dev\u002Fplugins\u002Fnuxt-drizzle](https:\u002F\u002Frstore.akryum.dev\u002Fplugins\u002Fnuxt-drizzle)\n- Query docs: [https:\u002F\u002Frstore.akryum.dev\u002Fguide\u002Fdata\u002Fquery](https:\u002F\u002Frstore.akryum.dev\u002Fguide\u002Fdata\u002Fquery)\n- Live docs: [https:\u002F\u002Frstore.akryum.dev\u002Fguide\u002Fdata\u002Flive](https:\u002F\u002Frstore.akryum.dev\u002Fguide\u002Fdata\u002Flive)\n- Offline docs: [https:\u002F\u002Frstore.akryum.dev\u002Fguide\u002Fdata\u002Foffline](https:\u002F\u002Frstore.akryum.dev\u002Fguide\u002Fdata\u002Foffline)\n- @rstore\u002Fnuxt skill: `rstore-nuxt`\n- @rstore\u002Fvue skill: `rstore-vue`\n",{"data":37,"body":38},{"name":4,"description":6},{"type":39,"children":40},"root",[41,49,72,79,267,273,446,452,701,706,765,771,934,940,961,1085,1091,1312,1318,1397,1403,1471,1477,1600,1606,2152,2158,2221],{"type":42,"tag":43,"props":44,"children":45},"element","h1",{"id":4},[46],{"type":47,"value":48},"text","Rstore Nuxt Drizzle",{"type":42,"tag":50,"props":51,"children":52},"p",{},[53,55,62,64,70],{"type":47,"value":54},"Generate rstore collections and API\u002Fruntime behavior from Drizzle schema metadata, then add realtime\u002Foffline and hook-based server controls as needed.\nUse this skill with the ",{"type":42,"tag":56,"props":57,"children":59},"code",{"className":58},[],[60],{"type":47,"value":61},"@rstore\u002Fnuxt",{"type":47,"value":63}," skill for Nuxt module\u002Fruntime behavior and with the ",{"type":42,"tag":56,"props":65,"children":67},{"className":66},[],[68],{"type":47,"value":69},"@rstore\u002Fvue",{"type":47,"value":71}," skill for underlying collection\u002Fquery\u002Fform semantics.",{"type":42,"tag":73,"props":74,"children":76},"h2",{"id":75},"documentation-map",[77],{"type":47,"value":78},"Documentation map",{"type":42,"tag":80,"props":81,"children":82},"table",{},[83,102],{"type":42,"tag":84,"props":85,"children":86},"thead",{},[87],{"type":42,"tag":88,"props":89,"children":90},"tr",{},[91,97],{"type":42,"tag":92,"props":93,"children":94},"th",{},[95],{"type":47,"value":96},"Area",{"type":42,"tag":92,"props":98,"children":99},{},[100],{"type":47,"value":101},"Documentation",{"type":42,"tag":103,"props":104,"children":105},"tbody",{},[106,126,143,160,177,194,211,251],{"type":42,"tag":88,"props":107,"children":108},{},[109,115],{"type":42,"tag":110,"props":111,"children":112},"td",{},[113],{"type":47,"value":114},"Nuxt + Drizzle plugin overview",{"type":42,"tag":110,"props":116,"children":117},{},[118],{"type":42,"tag":119,"props":120,"children":124},"a",{"href":121,"rel":122},"https:\u002F\u002Frstore.akryum.dev\u002Fplugins\u002Fnuxt-drizzle",[123],"nofollow",[125],{"type":47,"value":121},{"type":42,"tag":88,"props":127,"children":128},{},[129,134],{"type":42,"tag":110,"props":130,"children":131},{},[132],{"type":47,"value":133},"Query and filter model",{"type":42,"tag":110,"props":135,"children":136},{},[137],{"type":42,"tag":119,"props":138,"children":141},{"href":139,"rel":140},"https:\u002F\u002Frstore.akryum.dev\u002Fguide\u002Fdata\u002Fquery",[123],[142],{"type":47,"value":139},{"type":42,"tag":88,"props":144,"children":145},{},[146,151],{"type":42,"tag":110,"props":147,"children":148},{},[149],{"type":47,"value":150},"Relations behavior",{"type":42,"tag":110,"props":152,"children":153},{},[154],{"type":42,"tag":119,"props":155,"children":158},{"href":156,"rel":157},"https:\u002F\u002Frstore.akryum.dev\u002Fguide\u002Fschema\u002Frelations",[123],[159],{"type":47,"value":156},{"type":42,"tag":88,"props":161,"children":162},{},[163,168],{"type":42,"tag":110,"props":164,"children":165},{},[166],{"type":47,"value":167},"Realtime subscriptions",{"type":42,"tag":110,"props":169,"children":170},{},[171],{"type":42,"tag":119,"props":172,"children":175},{"href":173,"rel":174},"https:\u002F\u002Frstore.akryum.dev\u002Fguide\u002Fdata\u002Flive",[123],[176],{"type":47,"value":173},{"type":42,"tag":88,"props":178,"children":179},{},[180,185],{"type":42,"tag":110,"props":181,"children":182},{},[183],{"type":47,"value":184},"Offline behavior",{"type":42,"tag":110,"props":186,"children":187},{},[188],{"type":42,"tag":119,"props":189,"children":192},{"href":190,"rel":191},"https:\u002F\u002Frstore.akryum.dev\u002Fguide\u002Fdata\u002Foffline",[123],[193],{"type":47,"value":190},{"type":42,"tag":88,"props":195,"children":196},{},[197,202],{"type":42,"tag":110,"props":198,"children":199},{},[200],{"type":47,"value":201},"Plugin hooks and extension points",{"type":42,"tag":110,"props":203,"children":204},{},[205],{"type":42,"tag":119,"props":206,"children":209},{"href":207,"rel":208},"https:\u002F\u002Frstore.akryum.dev\u002Fguide\u002Fplugin\u002Fhooks",[123],[210],{"type":47,"value":207},{"type":42,"tag":88,"props":212,"children":213},{},[214,219],{"type":42,"tag":110,"props":215,"children":216},{},[217],{"type":47,"value":218},"Related package skills",{"type":42,"tag":110,"props":220,"children":221},{},[222,228,230,235,237,243,244,249],{"type":42,"tag":56,"props":223,"children":225},{"className":224},[],[226],{"type":47,"value":227},"rstore-nuxt",{"type":47,"value":229}," skill (",{"type":42,"tag":56,"props":231,"children":233},{"className":232},[],[234],{"type":47,"value":61},{"type":47,"value":236},"), ",{"type":42,"tag":56,"props":238,"children":240},{"className":239},[],[241],{"type":47,"value":242},"rstore-vue",{"type":47,"value":229},{"type":42,"tag":56,"props":245,"children":247},{"className":246},[],[248],{"type":47,"value":69},{"type":47,"value":250},")",{"type":42,"tag":88,"props":252,"children":253},{},[254,259],{"type":42,"tag":110,"props":255,"children":256},{},[257],{"type":47,"value":258},"Skill-local API references",{"type":42,"tag":110,"props":260,"children":261},{},[262],{"type":42,"tag":119,"props":263,"children":265},{"href":264},".\u002Freferences\u002Findex.md",[266],{"type":47,"value":264},{"type":42,"tag":73,"props":268,"children":270},{"id":269},"core-concepts",[271],{"type":47,"value":272},"Core concepts",{"type":42,"tag":80,"props":274,"children":275},{},[276,292],{"type":42,"tag":84,"props":277,"children":278},{},[279],{"type":42,"tag":88,"props":280,"children":281},{},[282,287],{"type":42,"tag":92,"props":283,"children":284},{},[285],{"type":47,"value":286},"Primitive",{"type":42,"tag":92,"props":288,"children":289},{},[290],{"type":47,"value":291},"Purpose",{"type":42,"tag":103,"props":293,"children":294},{},[295,312,329,346,363,380,397,414],{"type":42,"tag":88,"props":296,"children":297},{},[298,307],{"type":42,"tag":110,"props":299,"children":300},{},[301],{"type":42,"tag":56,"props":302,"children":304},{"className":303},[],[305],{"type":47,"value":306},"rstoreDrizzle.drizzleConfigPath",{"type":42,"tag":110,"props":308,"children":309},{},[310],{"type":47,"value":311},"Locates Drizzle config file loaded by the module",{"type":42,"tag":88,"props":313,"children":314},{},[315,324],{"type":42,"tag":110,"props":316,"children":317},{},[318],{"type":42,"tag":56,"props":319,"children":321},{"className":320},[],[322],{"type":47,"value":323},"drizzleConfig.schema",{"type":42,"tag":110,"props":325,"children":326},{},[327],{"type":47,"value":328},"Must be a single importable schema file path",{"type":42,"tag":88,"props":330,"children":331},{},[332,341],{"type":42,"tag":110,"props":333,"children":334},{},[335],{"type":42,"tag":56,"props":336,"children":338},{"className":337},[],[339],{"type":47,"value":340},"drizzleImport",{"type":42,"tag":110,"props":342,"children":343},{},[344],{"type":47,"value":345},"Defines server-side drizzle getter import used by generated handlers",{"type":42,"tag":88,"props":347,"children":348},{},[349,358],{"type":42,"tag":110,"props":350,"children":351},{},[352],{"type":42,"tag":56,"props":353,"children":355},{"className":354},[],[356],{"type":47,"value":357},"#build\u002F$rstore-drizzle-collections",{"type":42,"tag":110,"props":359,"children":360},{},[361],{"type":47,"value":362},"Generated collections with inferred keys, meta, and relations",{"type":42,"tag":88,"props":364,"children":365},{},[366,375],{"type":42,"tag":110,"props":367,"children":368},{},[369],{"type":42,"tag":56,"props":370,"children":372},{"className":371},[],[373],{"type":47,"value":374},"apiPath",{"type":42,"tag":110,"props":376,"children":377},{},[378],{"type":47,"value":379},"Base REST route for generated CRUD handlers",{"type":42,"tag":88,"props":381,"children":382},{},[383,392],{"type":42,"tag":110,"props":384,"children":385},{},[386],{"type":42,"tag":56,"props":387,"children":389},{"className":388},[],[390],{"type":47,"value":391},"ws",{"type":42,"tag":110,"props":393,"children":394},{},[395],{"type":47,"value":396},"Enables websocket realtime handler and client plugin",{"type":42,"tag":88,"props":398,"children":399},{},[400,409],{"type":42,"tag":110,"props":401,"children":402},{},[403],{"type":42,"tag":56,"props":404,"children":406},{"className":405},[],[407],{"type":47,"value":408},"offline",{"type":42,"tag":110,"props":410,"children":411},{},[412],{"type":47,"value":413},"Enables offline sync plugins and sync config template values",{"type":42,"tag":88,"props":415,"children":416},{},[417,441],{"type":42,"tag":110,"props":418,"children":419},{},[420,426,428,434,435],{"type":42,"tag":56,"props":421,"children":423},{"className":422},[],[424],{"type":47,"value":425},"rstoreDrizzleHooks",{"type":47,"value":427}," \u002F ",{"type":42,"tag":56,"props":429,"children":431},{"className":430},[],[432],{"type":47,"value":433},"hooksForTable",{"type":47,"value":427},{"type":42,"tag":56,"props":436,"children":438},{"className":437},[],[439],{"type":47,"value":440},"allowTables",{"type":42,"tag":110,"props":442,"children":443},{},[444],{"type":47,"value":445},"Server extension and access-control APIs",{"type":42,"tag":73,"props":447,"children":449},{"id":448},"quick-start",[450],{"type":47,"value":451},"Quick start",{"type":42,"tag":453,"props":454,"children":459},"pre",{"className":455,"code":456,"language":457,"meta":458,"style":458},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: ['@rstore\u002Fnuxt-drizzle'],\n  rstoreDrizzle: {\n    drizzleImport: {\n      name: 'useDrizzle',\n      from: '~~\u002Fserver\u002Futils\u002Fdrizzle',\n    },\n    apiPath: '\u002Fapi\u002Frstore',\n  },\n})\n","ts","",[460],{"type":42,"tag":56,"props":461,"children":462},{"__ignoreMap":458},[463,498,543,561,578,609,639,648,678,687],{"type":42,"tag":464,"props":465,"children":468},"span",{"class":466,"line":467},"line",1,[469,475,480,486,492],{"type":42,"tag":464,"props":470,"children":472},{"style":471},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[473],{"type":47,"value":474},"export",{"type":42,"tag":464,"props":476,"children":477},{"style":471},[478],{"type":47,"value":479}," default",{"type":42,"tag":464,"props":481,"children":483},{"style":482},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[484],{"type":47,"value":485}," defineNuxtConfig",{"type":42,"tag":464,"props":487,"children":489},{"style":488},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[490],{"type":47,"value":491},"(",{"type":42,"tag":464,"props":493,"children":495},{"style":494},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[496],{"type":47,"value":497},"{\n",{"type":42,"tag":464,"props":499,"children":501},{"class":466,"line":500},2,[502,508,513,518,523,529,533,538],{"type":42,"tag":464,"props":503,"children":505},{"style":504},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[506],{"type":47,"value":507},"  modules",{"type":42,"tag":464,"props":509,"children":510},{"style":494},[511],{"type":47,"value":512},":",{"type":42,"tag":464,"props":514,"children":515},{"style":488},[516],{"type":47,"value":517}," [",{"type":42,"tag":464,"props":519,"children":520},{"style":494},[521],{"type":47,"value":522},"'",{"type":42,"tag":464,"props":524,"children":526},{"style":525},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[527],{"type":47,"value":528},"@rstore\u002Fnuxt-drizzle",{"type":42,"tag":464,"props":530,"children":531},{"style":494},[532],{"type":47,"value":522},{"type":42,"tag":464,"props":534,"children":535},{"style":488},[536],{"type":47,"value":537},"]",{"type":42,"tag":464,"props":539,"children":540},{"style":494},[541],{"type":47,"value":542},",\n",{"type":42,"tag":464,"props":544,"children":546},{"class":466,"line":545},3,[547,552,556],{"type":42,"tag":464,"props":548,"children":549},{"style":504},[550],{"type":47,"value":551},"  rstoreDrizzle",{"type":42,"tag":464,"props":553,"children":554},{"style":494},[555],{"type":47,"value":512},{"type":42,"tag":464,"props":557,"children":558},{"style":494},[559],{"type":47,"value":560}," {\n",{"type":42,"tag":464,"props":562,"children":564},{"class":466,"line":563},4,[565,570,574],{"type":42,"tag":464,"props":566,"children":567},{"style":504},[568],{"type":47,"value":569},"    drizzleImport",{"type":42,"tag":464,"props":571,"children":572},{"style":494},[573],{"type":47,"value":512},{"type":42,"tag":464,"props":575,"children":576},{"style":494},[577],{"type":47,"value":560},{"type":42,"tag":464,"props":579,"children":581},{"class":466,"line":580},5,[582,587,591,596,601,605],{"type":42,"tag":464,"props":583,"children":584},{"style":504},[585],{"type":47,"value":586},"      name",{"type":42,"tag":464,"props":588,"children":589},{"style":494},[590],{"type":47,"value":512},{"type":42,"tag":464,"props":592,"children":593},{"style":494},[594],{"type":47,"value":595}," '",{"type":42,"tag":464,"props":597,"children":598},{"style":525},[599],{"type":47,"value":600},"useDrizzle",{"type":42,"tag":464,"props":602,"children":603},{"style":494},[604],{"type":47,"value":522},{"type":42,"tag":464,"props":606,"children":607},{"style":494},[608],{"type":47,"value":542},{"type":42,"tag":464,"props":610,"children":612},{"class":466,"line":611},6,[613,618,622,626,631,635],{"type":42,"tag":464,"props":614,"children":615},{"style":504},[616],{"type":47,"value":617},"      from",{"type":42,"tag":464,"props":619,"children":620},{"style":494},[621],{"type":47,"value":512},{"type":42,"tag":464,"props":623,"children":624},{"style":494},[625],{"type":47,"value":595},{"type":42,"tag":464,"props":627,"children":628},{"style":525},[629],{"type":47,"value":630},"~~\u002Fserver\u002Futils\u002Fdrizzle",{"type":42,"tag":464,"props":632,"children":633},{"style":494},[634],{"type":47,"value":522},{"type":42,"tag":464,"props":636,"children":637},{"style":494},[638],{"type":47,"value":542},{"type":42,"tag":464,"props":640,"children":642},{"class":466,"line":641},7,[643],{"type":42,"tag":464,"props":644,"children":645},{"style":494},[646],{"type":47,"value":647},"    },\n",{"type":42,"tag":464,"props":649,"children":651},{"class":466,"line":650},8,[652,657,661,665,670,674],{"type":42,"tag":464,"props":653,"children":654},{"style":504},[655],{"type":47,"value":656},"    apiPath",{"type":42,"tag":464,"props":658,"children":659},{"style":494},[660],{"type":47,"value":512},{"type":42,"tag":464,"props":662,"children":663},{"style":494},[664],{"type":47,"value":595},{"type":42,"tag":464,"props":666,"children":667},{"style":525},[668],{"type":47,"value":669},"\u002Fapi\u002Frstore",{"type":42,"tag":464,"props":671,"children":672},{"style":494},[673],{"type":47,"value":522},{"type":42,"tag":464,"props":675,"children":676},{"style":494},[677],{"type":47,"value":542},{"type":42,"tag":464,"props":679,"children":681},{"class":466,"line":680},9,[682],{"type":42,"tag":464,"props":683,"children":684},{"style":494},[685],{"type":47,"value":686},"  },\n",{"type":42,"tag":464,"props":688,"children":690},{"class":466,"line":689},10,[691,696],{"type":42,"tag":464,"props":692,"children":693},{"style":494},[694],{"type":47,"value":695},"}",{"type":42,"tag":464,"props":697,"children":698},{"style":488},[699],{"type":47,"value":700},")\n",{"type":42,"tag":50,"props":702,"children":703},{},[704],{"type":47,"value":705},"Also provide the server import the module expects by default:",{"type":42,"tag":453,"props":707,"children":709},{"className":455,"code":708,"language":457,"meta":458,"style":458},"\u002F\u002F server\u002Futils\u002Fdrizzle.ts\nexport function useDrizzle() {\n  \u002F\u002F return your drizzle instance\n}\n",[710],{"type":42,"tag":56,"props":711,"children":712},{"__ignoreMap":458},[713,722,749,757],{"type":42,"tag":464,"props":714,"children":715},{"class":466,"line":467},[716],{"type":42,"tag":464,"props":717,"children":719},{"style":718},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[720],{"type":47,"value":721},"\u002F\u002F server\u002Futils\u002Fdrizzle.ts\n",{"type":42,"tag":464,"props":723,"children":724},{"class":466,"line":500},[725,729,735,740,745],{"type":42,"tag":464,"props":726,"children":727},{"style":471},[728],{"type":47,"value":474},{"type":42,"tag":464,"props":730,"children":732},{"style":731},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[733],{"type":47,"value":734}," function",{"type":42,"tag":464,"props":736,"children":737},{"style":482},[738],{"type":47,"value":739}," useDrizzle",{"type":42,"tag":464,"props":741,"children":742},{"style":494},[743],{"type":47,"value":744},"()",{"type":42,"tag":464,"props":746,"children":747},{"style":494},[748],{"type":47,"value":560},{"type":42,"tag":464,"props":750,"children":751},{"class":466,"line":545},[752],{"type":42,"tag":464,"props":753,"children":754},{"style":718},[755],{"type":47,"value":756},"  \u002F\u002F return your drizzle instance\n",{"type":42,"tag":464,"props":758,"children":759},{"class":466,"line":563},[760],{"type":42,"tag":464,"props":761,"children":762},{"style":494},[763],{"type":47,"value":764},"}\n",{"type":42,"tag":73,"props":766,"children":768},{"id":767},"task-workflow",[769],{"type":47,"value":770},"Task workflow",{"type":42,"tag":772,"props":773,"children":774},"ol",{},[775,797,822,827,840,859,884,911,923],{"type":42,"tag":776,"props":777,"children":778},"li",{},[779,781,787,789,795],{"type":47,"value":780},"Confirm ",{"type":42,"tag":56,"props":782,"children":784},{"className":783},[],[785],{"type":47,"value":786},"drizzle.config.ts",{"type":47,"value":788}," exists and exports a config with string ",{"type":42,"tag":56,"props":790,"children":792},{"className":791},[],[793],{"type":47,"value":794},"schema",{"type":47,"value":796},".",{"type":42,"tag":776,"props":798,"children":799},{},[800,802,807,809,814,816,821],{"type":47,"value":801},"Configure ",{"type":42,"tag":56,"props":803,"children":805},{"className":804},[],[806],{"type":47,"value":340},{"type":47,"value":808}," if not using ",{"type":42,"tag":56,"props":810,"children":812},{"className":811},[],[813],{"type":47,"value":630},{"type":47,"value":815}," with ",{"type":42,"tag":56,"props":817,"children":819},{"className":818},[],[820],{"type":47,"value":600},{"type":47,"value":796},{"type":42,"tag":776,"props":823,"children":824},{},[825],{"type":47,"value":826},"Let the module generate collections and handlers; avoid parallel manual CRUD layers.",{"type":42,"tag":776,"props":828,"children":829},{},[830,832,838],{"type":47,"value":831},"Query through rstore collection APIs using ",{"type":42,"tag":56,"props":833,"children":835},{"className":834},[],[836],{"type":47,"value":837},"findOptions.where",{"type":47,"value":839}," and supported drizzle params.",{"type":42,"tag":776,"props":841,"children":842},{},[843,845,850,852,857],{"type":47,"value":844},"Enable ",{"type":42,"tag":56,"props":846,"children":848},{"className":847},[],[849],{"type":47,"value":391},{"type":47,"value":851}," and\u002For ",{"type":42,"tag":56,"props":853,"children":855},{"className":854},[],[856],{"type":47,"value":408},{"type":47,"value":858}," only when required by product behavior.",{"type":42,"tag":776,"props":860,"children":861},{},[862,864,869,871,876,877,882],{"type":47,"value":863},"Add server-side restrictions\u002Ftransforms via hook APIs (",{"type":42,"tag":56,"props":865,"children":867},{"className":866},[],[868],{"type":47,"value":433},{"type":47,"value":870},", ",{"type":42,"tag":56,"props":872,"children":874},{"className":873},[],[875],{"type":47,"value":440},{"type":47,"value":870},{"type":42,"tag":56,"props":878,"children":880},{"className":879},[],[881],{"type":47,"value":425},{"type":47,"value":883},").",{"type":42,"tag":776,"props":885,"children":886},{},[887,889,894,896,902,904,910],{"type":47,"value":888},"When adding a new Drizzle table to a project that already calls ",{"type":42,"tag":56,"props":890,"children":892},{"className":891},[],[893],{"type":47,"value":440},{"type":47,"value":895},", register the new table in the same ",{"type":42,"tag":56,"props":897,"children":899},{"className":898},[],[900],{"type":47,"value":901},"allowTables([...])",{"type":47,"value":903}," list — once initialized the allow-list is permanent and unlisted tables throw ",{"type":42,"tag":56,"props":905,"children":907},{"className":906},[],[908],{"type":47,"value":909},"Collection \"\u003Cname>\" is not allowed.",{"type":47,"value":796},{"type":42,"tag":776,"props":912,"children":913},{},[914,916,921],{"type":47,"value":915},"For Nuxt module\u002Fruntime integration behavior, use the ",{"type":42,"tag":56,"props":917,"children":919},{"className":918},[],[920],{"type":47,"value":227},{"type":47,"value":922}," skill.",{"type":42,"tag":776,"props":924,"children":925},{},[926,928,933],{"type":47,"value":927},"For non-drizzle-specific store\u002Fquery\u002Fform behavior, use the ",{"type":42,"tag":56,"props":929,"children":931},{"className":930},[],[932],{"type":47,"value":242},{"type":47,"value":922},{"type":42,"tag":73,"props":935,"children":937},{"id":936},"when-you-are-tempted-to-write-a-custom-endpoint",[938],{"type":47,"value":939},"When you are tempted to write a custom endpoint",{"type":42,"tag":50,"props":941,"children":942},{},[943,945,951,953,959],{"type":47,"value":944},"Before adding a ",{"type":42,"tag":56,"props":946,"children":948},{"className":947},[],[949],{"type":47,"value":950},"server\u002Fapi\u002F*.ts",{"type":47,"value":952}," handler, a ",{"type":42,"tag":56,"props":954,"children":956},{"className":955},[],[957],{"type":47,"value":958},"defineEventHandler",{"type":47,"value":960},", or any custom REST route that touches a Drizzle table, decide which case applies:",{"type":42,"tag":962,"props":963,"children":964},"ul",{},[965,1006,1044,1075],{"type":42,"tag":776,"props":966,"children":967},{},[968,974,976,981,983,989,991,997,998,1004],{"type":42,"tag":969,"props":970,"children":971},"strong",{},[972],{"type":47,"value":973},"Plain CRUD for an existing Drizzle table",{"type":47,"value":975}," → stop. Use the generated endpoints under ",{"type":42,"tag":56,"props":977,"children":979},{"className":978},[],[980],{"type":47,"value":374},{"type":47,"value":982},". Add logic via ",{"type":42,"tag":56,"props":984,"children":986},{"className":985},[],[987],{"type":47,"value":988},"hooksForTable(table, { 'item.beforeCreate': ... })",{"type":47,"value":990}," or the matching ",{"type":42,"tag":56,"props":992,"children":994},{"className":993},[],[995],{"type":47,"value":996},"*.before",{"type":47,"value":427},{"type":42,"tag":56,"props":999,"children":1001},{"className":1000},[],[1002],{"type":47,"value":1003},"*.after",{"type":47,"value":1005}," hook — don't fork into a parallel route.",{"type":42,"tag":776,"props":1007,"children":1008},{},[1009,1014,1016,1021,1023,1028,1029,1034,1036,1042],{"type":42,"tag":969,"props":1010,"children":1011},{},[1012],{"type":47,"value":1013},"Row-level access control, tenant scoping, soft-delete filters",{"type":47,"value":1015}," → use ",{"type":42,"tag":56,"props":1017,"children":1019},{"className":1018},[],[1020],{"type":47,"value":901},{"type":47,"value":1022}," plus ",{"type":42,"tag":56,"props":1024,"children":1026},{"className":1025},[],[1027],{"type":47,"value":433},{"type":47,"value":815},{"type":42,"tag":56,"props":1030,"children":1032},{"className":1031},[],[1033],{"type":47,"value":996},{"type":47,"value":1035}," hooks calling ",{"type":42,"tag":56,"props":1037,"children":1039},{"className":1038},[],[1040],{"type":47,"value":1041},"transformQuery(({ where, extras }) => ...)",{"type":47,"value":1043},". A custom route would bypass both guards.",{"type":42,"tag":776,"props":1045,"children":1046},{},[1047,1052,1054,1065,1067,1073],{"type":42,"tag":969,"props":1048,"children":1049},{},[1050],{"type":47,"value":1051},"Bulk or direct Drizzle write the generated endpoints cannot express",{"type":47,"value":1053}," (multi-table transaction, raw SQL, migration-style script) → a custom route is fine, but ",{"type":42,"tag":969,"props":1055,"children":1056},{},[1057,1059],{"type":47,"value":1058},"call ",{"type":42,"tag":56,"props":1060,"children":1062},{"className":1061},[],[1063],{"type":47,"value":1064},"publishRstoreDrizzleRealtimeUpdate",{"type":47,"value":1066}," after the write so ",{"type":42,"tag":56,"props":1068,"children":1070},{"className":1069},[],[1071],{"type":47,"value":1072},"liveQuery",{"type":47,"value":1074}," subscribers stay in sync. See the Nuxt + Drizzle docs section on \"Publishing realtime updates from direct Drizzle queries\".",{"type":42,"tag":776,"props":1076,"children":1077},{},[1078,1083],{"type":42,"tag":969,"props":1079,"children":1080},{},[1081],{"type":47,"value":1082},"Non-CRUD RPC",{"type":47,"value":1084}," (trigger an external workflow, send an email, compute a derived value) → custom route is appropriate; it is outside rstore's scope.",{"type":42,"tag":73,"props":1086,"children":1088},{"id":1087},"query-and-cache-conventions",[1089],{"type":47,"value":1090},"Query and cache conventions",{"type":42,"tag":962,"props":1092,"children":1093},{},[1094,1113,1162,1201,1226,1239,1268,1279],{"type":42,"tag":776,"props":1095,"children":1096},{},[1097,1099,1104,1106,1112],{"type":47,"value":1098},"Prefer ",{"type":42,"tag":56,"props":1100,"children":1102},{"className":1101},[],[1103],{"type":47,"value":837},{"type":47,"value":1105}," over the deprecated ",{"type":42,"tag":56,"props":1107,"children":1109},{"className":1108},[],[1110],{"type":47,"value":1111},"params.where",{"type":47,"value":796},{"type":42,"tag":776,"props":1114,"children":1115},{},[1116,1118,1124,1126,1132,1133,1139,1140,1146,1147,1153,1155,1161],{"type":47,"value":1117},"Use ",{"type":42,"tag":56,"props":1119,"children":1121},{"className":1120},[],[1122],{"type":47,"value":1123},"findOptions.include",{"type":47,"value":1125}," for relation loading; relation include objects support ",{"type":42,"tag":56,"props":1127,"children":1129},{"className":1128},[],[1130],{"type":47,"value":1131},"where",{"type":47,"value":870},{"type":42,"tag":56,"props":1134,"children":1136},{"className":1135},[],[1137],{"type":47,"value":1138},"orderBy",{"type":47,"value":870},{"type":42,"tag":56,"props":1141,"children":1143},{"className":1142},[],[1144],{"type":47,"value":1145},"columns",{"type":47,"value":870},{"type":42,"tag":56,"props":1148,"children":1150},{"className":1149},[],[1151],{"type":47,"value":1152},"limit",{"type":47,"value":1154},", and nested ",{"type":42,"tag":56,"props":1156,"children":1158},{"className":1157},[],[1159],{"type":47,"value":1160},"include",{"type":47,"value":796},{"type":42,"tag":776,"props":1163,"children":1164},{},[1165,1166,1172,1173,1179,1180,1185,1186,1191,1193,1199],{"type":47,"value":1117},{"type":42,"tag":56,"props":1167,"children":1169},{"className":1168},[],[1170],{"type":47,"value":1171},"params.limit",{"type":47,"value":870},{"type":42,"tag":56,"props":1174,"children":1176},{"className":1175},[],[1177],{"type":47,"value":1178},"offset",{"type":47,"value":870},{"type":42,"tag":56,"props":1181,"children":1183},{"className":1182},[],[1184],{"type":47,"value":1145},{"type":47,"value":870},{"type":42,"tag":56,"props":1187,"children":1189},{"className":1188},[],[1190],{"type":47,"value":1138},{"type":47,"value":1192},", and ",{"type":42,"tag":56,"props":1194,"children":1196},{"className":1195},[],[1197],{"type":47,"value":1198},"keys",{"type":47,"value":1200}," to shape Drizzle-backed queries.",{"type":42,"tag":776,"props":1202,"children":1203},{},[1204,1205,1211,1213,1218,1220,1225],{"type":47,"value":1117},{"type":42,"tag":56,"props":1206,"children":1208},{"className":1207},[],[1209],{"type":47,"value":1210},"params.with",{"type":47,"value":1212}," only as a low-level Drizzle override; when both are provided, ",{"type":42,"tag":56,"props":1214,"children":1216},{"className":1215},[],[1217],{"type":47,"value":1210},{"type":47,"value":1219}," takes precedence over ",{"type":42,"tag":56,"props":1221,"children":1223},{"className":1222},[],[1224],{"type":47,"value":1123},{"type":47,"value":796},{"type":42,"tag":776,"props":1227,"children":1228},{},[1229,1231,1237],{"type":47,"value":1230},"Query params and request bodies are serialized with ",{"type":42,"tag":56,"props":1232,"children":1234},{"className":1233},[],[1235],{"type":47,"value":1236},"SuperJSON",{"type":47,"value":1238},", so keep them serializable.",{"type":42,"tag":776,"props":1240,"children":1241},{},[1242,1244,1250,1252,1258,1260,1266],{"type":47,"value":1243},"The runtime plugin parses ",{"type":42,"tag":56,"props":1245,"children":1247},{"className":1246},[],[1248],{"type":47,"value":1249},"createdAt",{"type":47,"value":1251}," and ",{"type":42,"tag":56,"props":1253,"children":1255},{"className":1254},[],[1256],{"type":47,"value":1257},"updatedAt",{"type":47,"value":1259}," string values into ",{"type":42,"tag":56,"props":1261,"children":1263},{"className":1262},[],[1264],{"type":47,"value":1265},"Date",{"type":47,"value":1267}," objects through collection defaults.",{"type":42,"tag":776,"props":1269,"children":1270},{},[1271,1277],{"type":42,"tag":56,"props":1272,"children":1274},{"className":1273},[],[1275],{"type":47,"value":1276},"fetchRelations",{"type":47,"value":1278}," translates included relations into follow-up equality queries against the generated target collections.",{"type":42,"tag":776,"props":1280,"children":1281},{},[1282,1284,1290,1291,1297,1299,1304,1305,1310],{"type":47,"value":1283},"Cache filtering for ",{"type":42,"tag":56,"props":1285,"children":1287},{"className":1286},[],[1288],{"type":47,"value":1289},"findFirst",{"type":47,"value":1251},{"type":42,"tag":56,"props":1292,"children":1294},{"className":1293},[],[1295],{"type":47,"value":1296},"findMany",{"type":47,"value":1298}," reuses the same ",{"type":42,"tag":56,"props":1300,"children":1302},{"className":1301},[],[1303],{"type":47,"value":1131},{"type":47,"value":1251},{"type":42,"tag":56,"props":1306,"children":1308},{"className":1307},[],[1309],{"type":47,"value":1138},{"type":47,"value":1311}," semantics client-side.",{"type":42,"tag":73,"props":1313,"children":1315},{"id":1314},"realtime-and-offline-behavior",[1316],{"type":47,"value":1317},"Realtime and offline behavior",{"type":42,"tag":962,"props":1319,"children":1320},{},[1321,1332,1344,1364,1374,1386],{"type":42,"tag":776,"props":1322,"children":1323},{},[1324,1330],{"type":42,"tag":56,"props":1325,"children":1327},{"className":1326},[],[1328],{"type":47,"value":1329},"ws: true",{"type":47,"value":1331}," (or object form) enables websocket handler registration and client subscription plugin wiring.",{"type":42,"tag":776,"props":1333,"children":1334},{},[1335,1337,1342],{"type":47,"value":1336},"Realtime subscriptions are keyed by collection, key, and ",{"type":42,"tag":56,"props":1338,"children":1340},{"className":1339},[],[1341],{"type":47,"value":1131},{"type":47,"value":1343},"; exact filter shape impacts topic reuse.",{"type":42,"tag":776,"props":1345,"children":1346},{},[1347,1349,1355,1357,1362],{"type":47,"value":1348},"On websocket reconnect, the runtime re-sends active subscriptions and triggers ",{"type":42,"tag":56,"props":1350,"children":1352},{"className":1351},[],[1353],{"type":47,"value":1354},"realtimeReconnectEventHook",{"type":47,"value":1356},", which makes ",{"type":42,"tag":56,"props":1358,"children":1360},{"className":1359},[],[1361],{"type":47,"value":1072},{"type":47,"value":1363}," refresh.",{"type":42,"tag":776,"props":1365,"children":1366},{},[1367,1372],{"type":42,"tag":56,"props":1368,"children":1370},{"className":1369},[],[1371],{"type":47,"value":408},{"type":47,"value":1373}," enables offline plugin generation and sync config wiring.",{"type":42,"tag":776,"props":1375,"children":1376},{},[1377,1379,1384],{"type":47,"value":1378},"Offline sync expects stable keys and usable ",{"type":42,"tag":56,"props":1380,"children":1382},{"className":1381},[],[1383],{"type":47,"value":1257},{"type":47,"value":1385}," comparison values.",{"type":42,"tag":776,"props":1387,"children":1388},{},[1389,1395],{"type":42,"tag":56,"props":1390,"children":1392},{"className":1391},[],[1393],{"type":47,"value":1394},"offline.serializeDateValue",{"type":47,"value":1396}," exists for non-default date comparison serialization.",{"type":42,"tag":73,"props":1398,"children":1400},{"id":1399},"server-extension-points",[1401],{"type":47,"value":1402},"Server extension points",{"type":42,"tag":962,"props":1404,"children":1405},{},[1406,1418,1430,1447,1458],{"type":42,"tag":776,"props":1407,"children":1408},{},[1409,1410,1416],{"type":47,"value":1117},{"type":42,"tag":56,"props":1411,"children":1413},{"className":1412},[],[1414],{"type":47,"value":1415},"hooksForTable(table, hooks)",{"type":47,"value":1417}," to scope API hooks to a specific Drizzle table.",{"type":42,"tag":776,"props":1419,"children":1420},{},[1421,1422,1428],{"type":47,"value":1117},{"type":42,"tag":56,"props":1423,"children":1425},{"className":1424},[],[1426],{"type":47,"value":1427},"rstoreDrizzleHooks.hook(...)",{"type":47,"value":1429}," when the extension needs to work across multiple tables.",{"type":42,"tag":776,"props":1431,"children":1432},{},[1433,1438,1440,1445],{"type":42,"tag":56,"props":1434,"children":1436},{"className":1435},[],[1437],{"type":47,"value":996},{"type":47,"value":1439}," hooks can call ",{"type":42,"tag":56,"props":1441,"children":1443},{"className":1442},[],[1444],{"type":47,"value":1041},{"type":47,"value":1446}," to add constraints before execution.",{"type":42,"tag":776,"props":1448,"children":1449},{},[1450,1451,1456],{"type":47,"value":1117},{"type":42,"tag":56,"props":1452,"children":1454},{"className":1453},[],[1455],{"type":47,"value":901},{"type":47,"value":1457}," to deny access to unlisted generated collections.",{"type":42,"tag":776,"props":1459,"children":1460},{},[1461,1463,1469],{"type":47,"value":1462},"Use the ",{"type":42,"tag":56,"props":1464,"children":1466},{"className":1465},[],[1467],{"type":47,"value":1468},"realtime.filter",{"type":47,"value":1470}," hook to reject websocket updates for a peer when row-level rules apply.",{"type":42,"tag":73,"props":1472,"children":1474},{"id":1473},"guardrails",[1475],{"type":47,"value":1476},"Guardrails",{"type":42,"tag":772,"props":1478,"children":1479},{},[1480,1485,1497,1502,1507,1520,1536,1560],{"type":42,"tag":776,"props":1481,"children":1482},{},[1483],{"type":47,"value":1484},"If drizzle config is missing, module setup is skipped after warning.",{"type":42,"tag":776,"props":1486,"children":1487},{},[1488,1490,1495],{"type":47,"value":1489},"Non-string ",{"type":42,"tag":56,"props":1491,"children":1493},{"className":1492},[],[1494],{"type":47,"value":794},{"type":47,"value":1496}," in drizzle config throws.",{"type":42,"tag":776,"props":1498,"children":1499},{},[1500],{"type":47,"value":1501},"Multi-field relations\u002Freferences are not supported by current relation inference and throw.",{"type":42,"tag":776,"props":1503,"children":1504},{},[1505],{"type":47,"value":1506},"Renaming schema exports renames generated collection names.",{"type":42,"tag":776,"props":1508,"children":1509},{},[1510,1512,1518],{"type":47,"value":1511},"Composite keys serialize as ",{"type":42,"tag":56,"props":1513,"children":1515},{"className":1514},[],[1516],{"type":47,"value":1517},"value1::value2",{"type":47,"value":1519},"; mismatches here cause lookup\u002Fupdate issues.",{"type":42,"tag":776,"props":1521,"children":1522},{},[1523,1528,1530,1535],{"type":42,"tag":56,"props":1524,"children":1526},{"className":1525},[],[1527],{"type":47,"value":1111},{"type":47,"value":1529}," is deprecated; use ",{"type":42,"tag":56,"props":1531,"children":1533},{"className":1532},[],[1534],{"type":47,"value":837},{"type":47,"value":796},{"type":42,"tag":776,"props":1537,"children":1538},{},[1539,1544,1546,1551,1553,1558],{"type":42,"tag":56,"props":1540,"children":1542},{"className":1541},[],[1543],{"type":47,"value":440},{"type":47,"value":1545}," flips the default from \"all tables exposed\" to \"deny by default\". After the first call, every new Drizzle table you add to the schema must also be added to ",{"type":42,"tag":56,"props":1547,"children":1549},{"className":1548},[],[1550],{"type":47,"value":440},{"type":47,"value":1552}," — otherwise endpoints throw ",{"type":42,"tag":56,"props":1554,"children":1556},{"className":1555},[],[1557],{"type":47,"value":909},{"type":47,"value":1559}," at runtime.",{"type":42,"tag":776,"props":1561,"children":1562},{},[1563,1565,1571,1573,1578,1580,1585,1586,1591,1593,1598],{"type":47,"value":1564},"Do not hand-write ",{"type":42,"tag":56,"props":1566,"children":1568},{"className":1567},[],[1569],{"type":47,"value":1570},"server\u002Fapi\u002F\u003Ctable>\u002F*",{"type":47,"value":1572}," CRUD routes for tables already exposed by the generated ",{"type":42,"tag":56,"props":1574,"children":1576},{"className":1575},[],[1577],{"type":47,"value":374},{"type":47,"value":1579},". Duplicate code paths drift, bypass ",{"type":42,"tag":56,"props":1581,"children":1583},{"className":1582},[],[1584],{"type":47,"value":440},{"type":47,"value":427},{"type":42,"tag":56,"props":1587,"children":1589},{"className":1588},[],[1590],{"type":47,"value":433},{"type":47,"value":1592},", and miss realtime publishing — extend behavior through hooks or use ",{"type":42,"tag":56,"props":1594,"children":1596},{"className":1595},[],[1597],{"type":47,"value":1064},{"type":47,"value":1599}," from a justified custom route.",{"type":42,"tag":73,"props":1601,"children":1603},{"id":1602},"references",[1604],{"type":47,"value":1605},"References",{"type":42,"tag":80,"props":1607,"children":1608},{},[1609,1630],{"type":42,"tag":84,"props":1610,"children":1611},{},[1612],{"type":42,"tag":88,"props":1613,"children":1614},{},[1615,1620,1625],{"type":42,"tag":92,"props":1616,"children":1617},{},[1618],{"type":47,"value":1619},"Topic",{"type":42,"tag":92,"props":1621,"children":1622},{},[1623],{"type":47,"value":1624},"Description",{"type":42,"tag":92,"props":1626,"children":1627},{},[1628],{"type":47,"value":1629},"Reference",{"type":42,"tag":103,"props":1631,"children":1632},{},[1633,1654,1675,1697,1719,1741,1763,1785,1807,1828,1849,1871,1892,1914,1935,1957,1979,2001,2023,2044,2065,2086,2107,2130],{"type":42,"tag":88,"props":1634,"children":1635},{},[1636,1641,1646],{"type":42,"tag":110,"props":1637,"children":1638},{},[1639],{"type":47,"value":1640},"API index",{"type":42,"tag":110,"props":1642,"children":1643},{},[1644],{"type":47,"value":1645},"Full map of Nuxt-Drizzle API\u002Fconfig references",{"type":42,"tag":110,"props":1647,"children":1648},{},[1649],{"type":42,"tag":119,"props":1650,"children":1651},{"href":264},[1652],{"type":47,"value":1653},"api-index",{"type":42,"tag":88,"props":1655,"children":1656},{},[1657,1661,1666],{"type":42,"tag":110,"props":1658,"children":1659},{},[1660],{"type":47,"value":306},{"type":42,"tag":110,"props":1662,"children":1663},{},[1664],{"type":47,"value":1665},"Drizzle config lookup path",{"type":42,"tag":110,"props":1667,"children":1668},{},[1669],{"type":42,"tag":119,"props":1670,"children":1672},{"href":1671},".\u002Freferences\u002Fapi-drizzle-config-path.md",[1673],{"type":47,"value":1674},"api-drizzle-config-path",{"type":42,"tag":88,"props":1676,"children":1677},{},[1678,1683,1688],{"type":42,"tag":110,"props":1679,"children":1680},{},[1681],{"type":47,"value":1682},"rstoreDrizzle.drizzleImport",{"type":42,"tag":110,"props":1684,"children":1685},{},[1686],{"type":47,"value":1687},"Server drizzle getter import contract",{"type":42,"tag":110,"props":1689,"children":1690},{},[1691],{"type":42,"tag":119,"props":1692,"children":1694},{"href":1693},".\u002Freferences\u002Fapi-drizzle-import.md",[1695],{"type":47,"value":1696},"api-drizzle-import",{"type":42,"tag":88,"props":1698,"children":1699},{},[1700,1705,1710],{"type":42,"tag":110,"props":1701,"children":1702},{},[1703],{"type":47,"value":1704},"rstoreDrizzle.apiPath",{"type":42,"tag":110,"props":1706,"children":1707},{},[1708],{"type":47,"value":1709},"Generated REST base path",{"type":42,"tag":110,"props":1711,"children":1712},{},[1713],{"type":42,"tag":119,"props":1714,"children":1716},{"href":1715},".\u002Freferences\u002Fapi-api-path.md",[1717],{"type":47,"value":1718},"api-api-path",{"type":42,"tag":88,"props":1720,"children":1721},{},[1722,1727,1732],{"type":42,"tag":110,"props":1723,"children":1724},{},[1725],{"type":47,"value":1726},"rstoreDrizzle.ws",{"type":42,"tag":110,"props":1728,"children":1729},{},[1730],{"type":47,"value":1731},"Enable websocket realtime integration",{"type":42,"tag":110,"props":1733,"children":1734},{},[1735],{"type":42,"tag":119,"props":1736,"children":1738},{"href":1737},".\u002Freferences\u002Fapi-ws.md",[1739],{"type":47,"value":1740},"api-ws",{"type":42,"tag":88,"props":1742,"children":1743},{},[1744,1749,1754],{"type":42,"tag":110,"props":1745,"children":1746},{},[1747],{"type":47,"value":1748},"rstoreDrizzle.ws.apiPath",{"type":42,"tag":110,"props":1750,"children":1751},{},[1752],{"type":47,"value":1753},"Override websocket endpoint path",{"type":42,"tag":110,"props":1755,"children":1756},{},[1757],{"type":42,"tag":119,"props":1758,"children":1760},{"href":1759},".\u002Freferences\u002Fapi-ws-api-path.md",[1761],{"type":47,"value":1762},"api-ws-api-path",{"type":42,"tag":88,"props":1764,"children":1765},{},[1766,1771,1776],{"type":42,"tag":110,"props":1767,"children":1768},{},[1769],{"type":47,"value":1770},"rstoreDrizzle.offline",{"type":42,"tag":110,"props":1772,"children":1773},{},[1774],{"type":47,"value":1775},"Enable offline sync integration",{"type":42,"tag":110,"props":1777,"children":1778},{},[1779],{"type":42,"tag":119,"props":1780,"children":1782},{"href":1781},".\u002Freferences\u002Fapi-offline.md",[1783],{"type":47,"value":1784},"api-offline",{"type":42,"tag":88,"props":1786,"children":1787},{},[1788,1793,1798],{"type":42,"tag":110,"props":1789,"children":1790},{},[1791],{"type":47,"value":1792},"rstoreDrizzle.offline.serializeDateValue",{"type":42,"tag":110,"props":1794,"children":1795},{},[1796],{"type":47,"value":1797},"Customize offline sync date serialization",{"type":42,"tag":110,"props":1799,"children":1800},{},[1801],{"type":42,"tag":119,"props":1802,"children":1804},{"href":1803},".\u002Freferences\u002Fapi-offline-serialize-date-value.md",[1805],{"type":47,"value":1806},"api-offline-serialize-date-value",{"type":42,"tag":88,"props":1808,"children":1809},{},[1810,1814,1819],{"type":42,"tag":110,"props":1811,"children":1812},{},[1813],{"type":47,"value":1123},{"type":42,"tag":110,"props":1815,"children":1816},{},[1817],{"type":47,"value":1818},"Primary relation include option",{"type":42,"tag":110,"props":1820,"children":1821},{},[1822],{"type":42,"tag":119,"props":1823,"children":1825},{"href":1824},".\u002Freferences\u002Fapi-find-options-include.md",[1826],{"type":47,"value":1827},"api-find-options-include",{"type":42,"tag":88,"props":1829,"children":1830},{},[1831,1835,1840],{"type":42,"tag":110,"props":1832,"children":1833},{},[1834],{"type":47,"value":837},{"type":42,"tag":110,"props":1836,"children":1837},{},[1838],{"type":47,"value":1839},"Primary drizzle filter option",{"type":42,"tag":110,"props":1841,"children":1842},{},[1843],{"type":42,"tag":119,"props":1844,"children":1846},{"href":1845},".\u002Freferences\u002Fapi-find-options-where.md",[1847],{"type":47,"value":1848},"api-find-options-where",{"type":42,"tag":88,"props":1850,"children":1851},{},[1852,1857,1862],{"type":42,"tag":110,"props":1853,"children":1854},{},[1855],{"type":47,"value":1856},"params.where (deprecated)",{"type":42,"tag":110,"props":1858,"children":1859},{},[1860],{"type":47,"value":1861},"Legacy filter location",{"type":42,"tag":110,"props":1863,"children":1864},{},[1865],{"type":42,"tag":119,"props":1866,"children":1868},{"href":1867},".\u002Freferences\u002Fapi-params-where.md",[1869],{"type":47,"value":1870},"api-params-where",{"type":42,"tag":88,"props":1872,"children":1873},{},[1874,1878,1883],{"type":42,"tag":110,"props":1875,"children":1876},{},[1877],{"type":47,"value":1171},{"type":42,"tag":110,"props":1879,"children":1880},{},[1881],{"type":47,"value":1882},"Limit rows in list queries",{"type":42,"tag":110,"props":1884,"children":1885},{},[1886],{"type":42,"tag":119,"props":1887,"children":1889},{"href":1888},".\u002Freferences\u002Fapi-params-limit.md",[1890],{"type":47,"value":1891},"api-params-limit",{"type":42,"tag":88,"props":1893,"children":1894},{},[1895,1900,1905],{"type":42,"tag":110,"props":1896,"children":1897},{},[1898],{"type":47,"value":1899},"params.offset",{"type":42,"tag":110,"props":1901,"children":1902},{},[1903],{"type":47,"value":1904},"Offset rows in list queries",{"type":42,"tag":110,"props":1906,"children":1907},{},[1908],{"type":42,"tag":119,"props":1909,"children":1911},{"href":1910},".\u002Freferences\u002Fapi-params-offset.md",[1912],{"type":47,"value":1913},"api-params-offset",{"type":42,"tag":88,"props":1915,"children":1916},{},[1917,1921,1926],{"type":42,"tag":110,"props":1918,"children":1919},{},[1920],{"type":47,"value":1210},{"type":42,"tag":110,"props":1922,"children":1923},{},[1924],{"type":47,"value":1925},"Low-level Drizzle relation override",{"type":42,"tag":110,"props":1927,"children":1928},{},[1929],{"type":42,"tag":119,"props":1930,"children":1932},{"href":1931},".\u002Freferences\u002Fapi-params-with.md",[1933],{"type":47,"value":1934},"api-params-with",{"type":42,"tag":88,"props":1936,"children":1937},{},[1938,1943,1948],{"type":42,"tag":110,"props":1939,"children":1940},{},[1941],{"type":47,"value":1942},"params.columns",{"type":42,"tag":110,"props":1944,"children":1945},{},[1946],{"type":47,"value":1947},"Selected column projection",{"type":42,"tag":110,"props":1949,"children":1950},{},[1951],{"type":42,"tag":119,"props":1952,"children":1954},{"href":1953},".\u002Freferences\u002Fapi-params-columns.md",[1955],{"type":47,"value":1956},"api-params-columns",{"type":42,"tag":88,"props":1958,"children":1959},{},[1960,1965,1970],{"type":42,"tag":110,"props":1961,"children":1962},{},[1963],{"type":47,"value":1964},"params.orderBy",{"type":42,"tag":110,"props":1966,"children":1967},{},[1968],{"type":47,"value":1969},"Sort order format and behavior",{"type":42,"tag":110,"props":1971,"children":1972},{},[1973],{"type":42,"tag":119,"props":1974,"children":1976},{"href":1975},".\u002Freferences\u002Fapi-params-order-by.md",[1977],{"type":47,"value":1978},"api-params-order-by",{"type":42,"tag":88,"props":1980,"children":1981},{},[1982,1987,1992],{"type":42,"tag":110,"props":1983,"children":1984},{},[1985],{"type":47,"value":1986},"params.keys",{"type":42,"tag":110,"props":1988,"children":1989},{},[1990],{"type":47,"value":1991},"Key-constrained list fetches",{"type":42,"tag":110,"props":1993,"children":1994},{},[1995],{"type":42,"tag":119,"props":1996,"children":1998},{"href":1997},".\u002Freferences\u002Fapi-params-keys.md",[1999],{"type":47,"value":2000},"api-params-keys",{"type":42,"tag":88,"props":2002,"children":2003},{},[2004,2009,2014],{"type":42,"tag":110,"props":2005,"children":2006},{},[2007],{"type":47,"value":2008},"filterWhere",{"type":42,"tag":110,"props":2010,"children":2011},{},[2012],{"type":47,"value":2013},"Local cache condition evaluator",{"type":42,"tag":110,"props":2015,"children":2016},{},[2017],{"type":42,"tag":119,"props":2018,"children":2020},{"href":2019},".\u002Freferences\u002Fapi-filter-where.md",[2021],{"type":47,"value":2022},"api-filter-where",{"type":42,"tag":88,"props":2024,"children":2025},{},[2026,2030,2035],{"type":42,"tag":110,"props":2027,"children":2028},{},[2029],{"type":47,"value":425},{"type":42,"tag":110,"props":2031,"children":2032},{},[2033],{"type":47,"value":2034},"Global server\u002Frealtime hook bus",{"type":42,"tag":110,"props":2036,"children":2037},{},[2038],{"type":42,"tag":119,"props":2039,"children":2041},{"href":2040},".\u002Freferences\u002Fapi-rstore-drizzle-hooks.md",[2042],{"type":47,"value":2043},"api-rstore-drizzle-hooks",{"type":42,"tag":88,"props":2045,"children":2046},{},[2047,2051,2056],{"type":42,"tag":110,"props":2048,"children":2049},{},[2050],{"type":47,"value":433},{"type":42,"tag":110,"props":2052,"children":2053},{},[2054],{"type":47,"value":2055},"Table-scoped hook registration helper",{"type":42,"tag":110,"props":2057,"children":2058},{},[2059],{"type":42,"tag":119,"props":2060,"children":2062},{"href":2061},".\u002Freferences\u002Fapi-hooks-for-table.md",[2063],{"type":47,"value":2064},"api-hooks-for-table",{"type":42,"tag":88,"props":2066,"children":2067},{},[2068,2072,2077],{"type":42,"tag":110,"props":2069,"children":2070},{},[2071],{"type":47,"value":440},{"type":42,"tag":110,"props":2073,"children":2074},{},[2075],{"type":47,"value":2076},"Collection allow-list access control",{"type":42,"tag":110,"props":2078,"children":2079},{},[2080],{"type":42,"tag":119,"props":2081,"children":2083},{"href":2082},".\u002Freferences\u002Fapi-allow-tables.md",[2084],{"type":47,"value":2085},"api-allow-tables",{"type":42,"tag":88,"props":2087,"children":2088},{},[2089,2093,2098],{"type":42,"tag":110,"props":2090,"children":2091},{},[2092],{"type":47,"value":1064},{"type":42,"tag":110,"props":2094,"children":2095},{},[2096],{"type":47,"value":2097},"Publish manual realtime updates for direct Drizzle writes",{"type":42,"tag":110,"props":2099,"children":2100},{},[2101],{"type":42,"tag":119,"props":2102,"children":2104},{"href":2103},".\u002Freferences\u002Fapi-publish-rstore-drizzle-realtime-update.md",[2105],{"type":47,"value":2106},"api-publish-rstore-drizzle-realtime-update",{"type":42,"tag":88,"props":2108,"children":2109},{},[2110,2115,2120],{"type":42,"tag":110,"props":2111,"children":2112},{},[2113],{"type":47,"value":2114},"Base @rstore\u002Fnuxt skill",{"type":42,"tag":110,"props":2116,"children":2117},{},[2118],{"type":47,"value":2119},"Nuxt module\u002Fruntime integration semantics",{"type":42,"tag":110,"props":2121,"children":2122},{},[2123,2128],{"type":42,"tag":56,"props":2124,"children":2126},{"className":2125},[],[2127],{"type":47,"value":227},{"type":47,"value":2129}," skill",{"type":42,"tag":88,"props":2131,"children":2132},{},[2133,2138,2143],{"type":42,"tag":110,"props":2134,"children":2135},{},[2136],{"type":47,"value":2137},"Base @rstore\u002Fvue skill",{"type":42,"tag":110,"props":2139,"children":2140},{},[2141],{"type":47,"value":2142},"Underlying collection\u002Fquery\u002Fform semantics",{"type":42,"tag":110,"props":2144,"children":2145},{},[2146,2151],{"type":42,"tag":56,"props":2147,"children":2149},{"className":2148},[],[2150],{"type":47,"value":242},{"type":47,"value":2129},{"type":42,"tag":73,"props":2153,"children":2155},{"id":2154},"further-reading",[2156],{"type":47,"value":2157},"Further reading",{"type":42,"tag":962,"props":2159,"children":2160},{},[2161,2171,2181,2191,2201,2211],{"type":42,"tag":776,"props":2162,"children":2163},{},[2164,2166],{"type":47,"value":2165},"Nuxt + Drizzle docs: ",{"type":42,"tag":119,"props":2167,"children":2169},{"href":121,"rel":2168},[123],[2170],{"type":47,"value":121},{"type":42,"tag":776,"props":2172,"children":2173},{},[2174,2176],{"type":47,"value":2175},"Query docs: ",{"type":42,"tag":119,"props":2177,"children":2179},{"href":139,"rel":2178},[123],[2180],{"type":47,"value":139},{"type":42,"tag":776,"props":2182,"children":2183},{},[2184,2186],{"type":47,"value":2185},"Live docs: ",{"type":42,"tag":119,"props":2187,"children":2189},{"href":173,"rel":2188},[123],[2190],{"type":47,"value":173},{"type":42,"tag":776,"props":2192,"children":2193},{},[2194,2196],{"type":47,"value":2195},"Offline docs: ",{"type":42,"tag":119,"props":2197,"children":2199},{"href":190,"rel":2198},[123],[2200],{"type":47,"value":190},{"type":42,"tag":776,"props":2202,"children":2203},{},[2204,2206],{"type":47,"value":2205},"@rstore\u002Fnuxt skill: ",{"type":42,"tag":56,"props":2207,"children":2209},{"className":2208},[],[2210],{"type":47,"value":227},{"type":42,"tag":776,"props":2212,"children":2213},{},[2214,2216],{"type":47,"value":2215},"@rstore\u002Fvue skill: ",{"type":42,"tag":56,"props":2217,"children":2219},{"className":2218},[],[2220],{"type":47,"value":242},{"type":42,"tag":2222,"props":2223,"children":2224},"style",{},[2225],{"type":47,"value":2226},"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);}",{"items":2228,"total":680},[2229,2239,2252,2265,2272,2283,2296,2307,2318],{"slug":2230,"name":2230,"fn":2231,"description":2232,"org":2233,"tags":2234,"stars":25,"repoUrl":26,"updatedAt":2238},"rstore-directus","integrate rstore with Directus","Use when integrating rstore with Directus runtime\u002Fschema helpers, generated Directus collections, Directus REST query options, cache-side Directus filtering, singleton handling, primary key stripping, and Directus-backed create\u002Fupdate\u002Fdelete behavior; also use before writing custom Directus fetch or mutation code around rstore collections. Pair with rstore-vue for collection\u002Fquery\u002Fform semantics and with framework-specific Directus skills for Vite or Nuxt wiring.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2235,2236,2237],{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},"2026-07-12T07:51:07.357988",{"slug":2240,"name":2240,"fn":2241,"description":2242,"org":2243,"tags":2244,"stars":25,"repoUrl":26,"updatedAt":2251},"rstore-monospace","integrate rstore with Monospace REST APIs","Use when integrating rstore with Monospace REST and OpenAPI helpers, generated Monospace collections, Monospace REST query options, primary key overrides, createMonospaceRestClient, createMonospaceRstorePlugin, createMonospaceQuery, and schema generation from remote or local OpenAPI documents; also use before writing custom Monospace REST CRUD around rstore collections.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2245,2248],{"name":2246,"slug":2247,"type":15},"OpenAPI","openapi",{"name":2249,"slug":2250,"type":15},"REST API","rest-api","2026-07-12T07:51:08.612664",{"slug":227,"name":227,"fn":2253,"description":2254,"org":2255,"tags":2256,"stars":25,"repoUrl":26,"updatedAt":2264},"integrate rstore into Nuxt applications","Use when wiring rstore into a Nuxt app end-to-end — module setup, auto-registered collections\u002Fplugins, SSR cache hydration, generated template\u002Fauto-import issues, and cross-module extension; also use before adding a custom `server\u002Fapi` route, Nitro handler, or ad hoc `useFetch`\u002F`$fetch` composable for collection data in an rstore-powered Nuxt app — prefer rstore collection APIs (`find*`, `query`, `liveQuery`) and plugin hooks over hand-rolled endpoints or fetch refs; pair with the `rstore-vue` skill for collection\u002Fquery\u002Fform behavior.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2257,2260,2261],{"name":2258,"slug":2259,"type":15},"Frontend","frontend",{"name":13,"slug":14,"type":15},{"name":2262,"slug":2263,"type":15},"Vue","vue","2026-07-12T07:51:06.114663",{"slug":4,"name":4,"fn":5,"description":6,"org":2266,"tags":2267,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2268,2269,2270,2271],{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":13,"slug":14,"type":15},{"slug":2273,"name":2273,"fn":2274,"description":2275,"org":2276,"tags":2277,"stars":25,"repoUrl":26,"updatedAt":2282},"rstore-nuxt-monospace","integrate Monospace into Nuxt applications","Use when wiring Monospace into a Nuxt app with @rstore\u002Fnuxt-monospace, including rstoreMonospace config, remote or local OpenAPI generation, generated #build templates, runtime plugin setup, auto-imported useMonospace, runtimeApiKey handling, primaryKeys, and generated rstore collections. Pair with rstore-monospace for shared REST\u002FOpenAPI behavior, rstore-nuxt for Nuxt store integration, and rstore-vue for query\u002Fform usage.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2278,2279,2280,2281],{"name":20,"slug":21,"type":15},{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":2262,"slug":2263,"type":15},"2026-07-12T07:51:12.752798",{"slug":2284,"name":2284,"fn":2285,"description":2286,"org":2287,"tags":2288,"stars":25,"repoUrl":26,"updatedAt":2295},"rstore-vite-directus","integrate Directus into Vite applications","Use when wiring Directus into a plain Vite\u002FVue app with @rstore\u002Fvite-directus, including rstoreDirectus config, virtual:rstore-directus modules, generated rstore-directus.d.ts declarations, build-time Directus introspection, and store setup with the generated schema and directusPlugin. Pair with rstore-directus for shared Directus adapter behavior and rstore-vue for collection\u002Fquery\u002Fform usage.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2289,2290,2291,2294],{"name":20,"slug":21,"type":15},{"name":9,"slug":8,"type":15},{"name":2292,"slug":2293,"type":15},"Vite","vite",{"name":2262,"slug":2263,"type":15},"2026-07-12T07:51:11.475964",{"slug":2297,"name":2297,"fn":2298,"description":2299,"org":2300,"tags":2301,"stars":25,"repoUrl":26,"updatedAt":2306},"rstore-vite-monospace","integrate Monospace into Vite applications","Use when wiring Monospace into a plain Vite\u002FVue app with @rstore\u002Fvite-monospace, including rstoreMonospace config, remote or local OpenAPI generation, virtual:rstore-monospace modules, generated rstore-monospace.d.ts declarations, runtimeApiKey handling, primaryKeys, and store setup with the generated schema and monospacePlugin.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2302,2303,2304,2305],{"name":20,"slug":21,"type":15},{"name":9,"slug":8,"type":15},{"name":2292,"slug":2293,"type":15},{"name":2262,"slug":2263,"type":15},"2026-07-12T07:51:14.078949",{"slug":242,"name":242,"fn":2308,"description":2309,"org":2310,"tags":2311,"stars":25,"repoUrl":26,"updatedAt":2317},"manage application data with rstore in Vue","Use when handling app data in Vue with `@rstore\u002Fvue` — fetch items\u002Flists, keep queries reactive or live, create\u002Fupdate\u002Fdelete records with forms, manage cache consistency, and debug store\u002Fquery\u002Fsubscription behavior across collections; also use before writing a custom fetch composable, ad hoc fetch ref, or bespoke cache layer for collection data — prefer `find*`, `query`, `liveQuery`, `createForm`, and `definePlugin` hooks over hand-rolled fetching\u002Fcaching.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2312,2315,2316],{"name":2313,"slug":2314,"type":15},"Debugging","debugging",{"name":2258,"slug":2259,"type":15},{"name":2262,"slug":2263,"type":15},"2026-07-12T07:51:04.87426",{"slug":2319,"name":2319,"fn":2320,"description":2321,"org":2322,"tags":2323,"stars":2328,"repoUrl":2329,"updatedAt":2330},"monospace","perform data operations on Monospace instances","Use when doing ANY task against a Monospace instance. Triggers: reading, creating, updating, deleting, querying, filtering, sorting, or paginating data via the Monospace REST API or the @monospace\u002Fsdk (createClient, readMany, createOne, updateOne); generating a typed SDK client (`npx @monospace\u002Fsdk generate`, monospace.config.ts); connecting to or using the Monospace MCP server; minting API keys or authenticating; inspecting collections, fields, relations, or schema. Do NOT use for legacy Directus v9 \u002F @directus\u002Fsdk — Monospace is a different product with a different API and SDK.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2324,2325],{"name":2249,"slug":2250,"type":15},{"name":2326,"slug":2327,"type":15},"SDK","sdk",0,"https:\u002F\u002Fgithub.com\u002Fdirectus\u002Fmonospace-agent-skills","2026-07-12T07:51:15.348897",{"items":2332,"total":650},[2333,2339,2344,2350,2357,2364,2371],{"slug":2230,"name":2230,"fn":2231,"description":2232,"org":2334,"tags":2335,"stars":25,"repoUrl":26,"updatedAt":2238},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2336,2337,2338],{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"slug":2240,"name":2240,"fn":2241,"description":2242,"org":2340,"tags":2341,"stars":25,"repoUrl":26,"updatedAt":2251},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2342,2343],{"name":2246,"slug":2247,"type":15},{"name":2249,"slug":2250,"type":15},{"slug":227,"name":227,"fn":2253,"description":2254,"org":2345,"tags":2346,"stars":25,"repoUrl":26,"updatedAt":2264},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2347,2348,2349],{"name":2258,"slug":2259,"type":15},{"name":13,"slug":14,"type":15},{"name":2262,"slug":2263,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":2351,"tags":2352,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2353,2354,2355,2356],{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":13,"slug":14,"type":15},{"slug":2273,"name":2273,"fn":2274,"description":2275,"org":2358,"tags":2359,"stars":25,"repoUrl":26,"updatedAt":2282},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2360,2361,2362,2363],{"name":20,"slug":21,"type":15},{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":2262,"slug":2263,"type":15},{"slug":2284,"name":2284,"fn":2285,"description":2286,"org":2365,"tags":2366,"stars":25,"repoUrl":26,"updatedAt":2295},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2367,2368,2369,2370],{"name":20,"slug":21,"type":15},{"name":9,"slug":8,"type":15},{"name":2292,"slug":2293,"type":15},{"name":2262,"slug":2263,"type":15},{"slug":2297,"name":2297,"fn":2298,"description":2299,"org":2372,"tags":2373,"stars":25,"repoUrl":26,"updatedAt":2306},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2374,2375,2376,2377],{"name":20,"slug":21,"type":15},{"name":9,"slug":8,"type":15},{"name":2292,"slug":2293,"type":15},{"name":2262,"slug":2263,"type":15}]