[{"data":1,"prerenderedAt":4540},["ShallowReactive",2],{"navigation-landing-en":3,"navigation-nuxt-auto-en":180,"navigation-nuxt-protokit-en":338,"/docs/nuxt-auto/auto-api/testing-en":444,"/docs/nuxt-auto/auto-api/testing-surround-en":4535},[4,8,13,28,41,51,64,77,94,110,134,150,157,172],{"title":5,"path":6,"stem":7},"Overview","/docs/landing","0.docs/1.landing/001.index",{"title":9,"path":10,"stem":11,"badge":12},"Built-in Features","/docs/landing/built-in-features","0.docs/1.landing/002.built-in-features","New",{"title":14,"path":15,"stem":16,"children":17,"icon":27},"Content Foundation","/docs/landing/content","0.docs/1.landing/02.content/1.index",[18,19,23],{"title":5,"path":15,"stem":16},{"title":20,"path":21,"stem":22},"Details","/docs/landing/content/details","0.docs/1.landing/02.content/2.details",{"title":24,"path":25,"stem":26},"Technical","/docs/landing/content/technical","0.docs/1.landing/02.content/4.technical","i-heroicons-document-text",{"title":29,"path":30,"stem":31,"children":32,"icon":40},"Regional Content","/docs/landing/regional","0.docs/1.landing/03.regional/1.index",[33,34,37],{"title":5,"path":30,"stem":31},{"title":20,"path":35,"stem":36},"/docs/landing/regional/details","0.docs/1.landing/03.regional/2.details",{"title":24,"path":38,"stem":39},"/docs/landing/regional/technical","0.docs/1.landing/03.regional/4.technical","i-heroicons-globe-alt",{"title":42,"path":43,"stem":44,"children":45,"icon":50},"Multi-language","/docs/landing/multilang","0.docs/1.landing/04.multilang/1.index",[46,47],{"title":5,"path":43,"stem":44},{"title":20,"path":48,"stem":49},"/docs/landing/multilang/details","0.docs/1.landing/04.multilang/2.details","i-heroicons-language",{"title":52,"path":53,"stem":54,"children":55,"icon":63},"Blog","/docs/landing/blog","0.docs/1.landing/05.blog/1.index",[56,57,60],{"title":5,"path":53,"stem":54},{"title":20,"path":58,"stem":59},"/docs/landing/blog/details","0.docs/1.landing/05.blog/2.details",{"title":24,"path":61,"stem":62},"/docs/landing/blog/technical","0.docs/1.landing/05.blog/4.technical","i-heroicons-pencil-square",{"title":65,"path":66,"stem":67,"children":68,"icon":76},"Documentation","/docs/landing/docs","0.docs/1.landing/06.docs/1.index",[69,70,73],{"title":5,"path":66,"stem":67},{"title":20,"path":71,"stem":72},"/docs/landing/docs/details","0.docs/1.landing/06.docs/2.details",{"title":24,"path":74,"stem":75},"/docs/landing/docs/technical","0.docs/1.landing/06.docs/4.technical","i-heroicons-book-open",{"title":78,"path":79,"stem":80,"children":81,"icon":93},"Forms","/docs/landing/forms","0.docs/1.landing/07.forms/1.index",[82,83,86,90],{"title":5,"path":79,"stem":80},{"title":20,"path":84,"stem":85},"/docs/landing/forms/details","0.docs/1.landing/07.forms/2.details",{"title":87,"path":88,"stem":89},"Admin","/docs/landing/forms/admin","0.docs/1.landing/07.forms/3.admin",{"title":24,"path":91,"stem":92},"/docs/landing/forms/technical","0.docs/1.landing/07.forms/4.technical","i-heroicons-clipboard-document-list",{"title":95,"path":96,"stem":97,"children":98,"icon":109},"Email","/docs/landing/email","0.docs/1.landing/08.email/1.index",[99,100,103,106],{"title":5,"path":96,"stem":97},{"title":20,"path":101,"stem":102},"/docs/landing/email/details","0.docs/1.landing/08.email/2.details",{"title":87,"path":104,"stem":105},"/docs/landing/email/admin","0.docs/1.landing/08.email/3.admin",{"title":24,"path":107,"stem":108},"/docs/landing/email/technical","0.docs/1.landing/08.email/4.technical","i-heroicons-envelope",{"title":111,"path":112,"stem":113,"children":114,"icon":133},"Feedback Platform","/docs/landing/feedback","0.docs/1.landing/09.feedback/1.index",[115,116,119,122,125,129],{"title":5,"path":112,"stem":113},{"title":20,"path":117,"stem":118},"/docs/landing/feedback/details","0.docs/1.landing/09.feedback/2.details",{"title":87,"path":120,"stem":121},"/docs/landing/feedback/admin","0.docs/1.landing/09.feedback/3.admin",{"title":24,"path":123,"stem":124},"/docs/landing/feedback/technical","0.docs/1.landing/09.feedback/4.technical",{"title":126,"path":127,"stem":128},"Compare vs SaaS","/docs/landing/feedback/compare","0.docs/1.landing/09.feedback/5.compare",{"title":130,"path":131,"stem":132},"FAQ","/docs/landing/feedback/faq","0.docs/1.landing/09.feedback/6.faq","i-heroicons-chat-bubble-left-right",{"title":135,"path":136,"stem":137,"children":138,"icon":149},"Storage","/docs/landing/storage","0.docs/1.landing/10.storage/1.index",[139,140,143,146],{"title":5,"path":136,"stem":137},{"title":20,"path":141,"stem":142},"/docs/landing/storage/details","0.docs/1.landing/10.storage/2.details",{"title":87,"path":144,"stem":145},"/docs/landing/storage/admin","0.docs/1.landing/10.storage/3.admin",{"title":24,"path":147,"stem":148},"/docs/landing/storage/technical","0.docs/1.landing/10.storage/4.technical","i-heroicons-circle-stack",{"title":151,"path":152,"stem":153,"children":154,"icon":156},"Offline First","/docs/landing/offline-first","0.docs/1.landing/11.offline-first/1.index",[155],{"title":151,"path":152,"stem":153},"i-heroicons-users",{"title":158,"path":159,"stem":160,"children":161,"icon":156},"Yjs Sync","/docs/landing/yjs-sync","0.docs/1.landing/12.yjs-sync/1.index",[162,163,166,169],{"title":5,"path":159,"stem":160},{"title":20,"path":164,"stem":165},"/docs/landing/yjs-sync/details","0.docs/1.landing/12.yjs-sync/2.details",{"title":87,"path":167,"stem":168},"/docs/landing/yjs-sync/admin","0.docs/1.landing/12.yjs-sync/3.admin",{"title":24,"path":170,"stem":171},"/docs/landing/yjs-sync/technical","0.docs/1.landing/12.yjs-sync/4.technical",{"title":173,"path":174,"stem":175,"children":176,"badge":178,"icon":179},"Newsletter","/docs/landing/newsletter","0.docs/1.landing/13.newsletter/index",[177],{"title":173,"path":174,"stem":175,"badge":178},"Coming Soon","i-lucide-send",[181,184,202,298],{"title":5,"path":182,"stem":183},"/docs/nuxt-auto","0.docs/3.nuxt-auto/index",{"title":185,"path":186,"stem":187,"children":188,"page":201},"Getting Started","/docs/nuxt-auto/getting-started","0.docs/3.nuxt-auto/1.getting-started",[189,193,197],{"title":190,"path":191,"stem":192},"Introduction","/docs/nuxt-auto/getting-started/introduction","0.docs/3.nuxt-auto/1.getting-started/1.introduction",{"title":194,"path":195,"stem":196},"Installation","/docs/nuxt-auto/getting-started/installation","0.docs/3.nuxt-auto/1.getting-started/2.installation",{"title":198,"path":199,"stem":200},"Quick Start","/docs/nuxt-auto/getting-started/quick-start","0.docs/3.nuxt-auto/1.getting-started/3.quick-start",false,{"title":203,"path":204,"stem":205,"children":206,"page":201},"Auto API","/docs/nuxt-auto/auto-api","0.docs/3.nuxt-auto/2.auto-api",[207,210,214,218,222,226,230,234,238,242,246,250,254,258,262,266,270,274,278,282,286,290,294],{"title":185,"path":208,"stem":209},"/docs/nuxt-auto/auto-api/getting-started","0.docs/3.nuxt-auto/2.auto-api/1.getting-started",{"title":211,"path":212,"stem":213},"Aggregations","/docs/nuxt-auto/auto-api/aggregations","0.docs/3.nuxt-auto/2.auto-api/10.aggregations",{"title":215,"path":216,"stem":217},"Lifecycle Hooks","/docs/nuxt-auto/auto-api/lifecycle-hooks","0.docs/3.nuxt-auto/2.auto-api/11.lifecycle-hooks",{"title":219,"path":220,"stem":221},"Many-to-Many (M2M) Relationships","/docs/nuxt-auto/auto-api/m2m-relationships","0.docs/3.nuxt-auto/2.auto-api/12.m2m-relationships",{"title":223,"path":224,"stem":225},"Plugin System","/docs/nuxt-auto/auto-api/plugin-system","0.docs/3.nuxt-auto/2.auto-api/13.plugin-system",{"title":227,"path":228,"stem":229},"Database Adapters","/docs/nuxt-auto/auto-api/database-adapters","0.docs/3.nuxt-auto/2.auto-api/14.database-adapters",{"title":231,"path":232,"stem":233},"Custom Endpoints","/docs/nuxt-auto/auto-api/custom-endpoints","0.docs/3.nuxt-auto/2.auto-api/15.custom-endpoints",{"title":235,"path":236,"stem":237},"Multi-Tenancy","/docs/nuxt-auto/auto-api/multi-tenancy","0.docs/3.nuxt-auto/2.auto-api/16.multi-tenancy",{"title":239,"path":240,"stem":241},"Validation","/docs/nuxt-auto/auto-api/validation","0.docs/3.nuxt-auto/2.auto-api/2.validation",{"title":243,"path":244,"stem":245},"Rate Limiting","/docs/nuxt-auto/auto-api/rate-limiting","0.docs/3.nuxt-auto/2.auto-api/20.rate-limiting",{"title":247,"path":248,"stem":249},"Request Metadata Plugin","/docs/nuxt-auto/auto-api/request-metadata","0.docs/3.nuxt-auto/2.auto-api/21.request-metadata",{"title":251,"path":252,"stem":253},"Plugin Catalog","/docs/nuxt-auto/auto-api/plugin-catalog","0.docs/3.nuxt-auto/2.auto-api/22.plugin-catalog",{"title":255,"path":256,"stem":257},"Handler Overrides","/docs/nuxt-auto/auto-api/handler-overrides","0.docs/3.nuxt-auto/2.auto-api/3.handler-overrides",{"title":259,"path":260,"stem":261},"Cloudflare D1","/docs/nuxt-auto/auto-api/cloudflare-d1","0.docs/3.nuxt-auto/2.auto-api/30.cloudflare-d1",{"title":263,"path":264,"stem":265},"SQLite to D1 Migration","/docs/nuxt-auto/auto-api/migration-sqlite-d1","0.docs/3.nuxt-auto/2.auto-api/31.migration-sqlite-d1",{"title":267,"path":268,"stem":269},"Frontend Composables","/docs/nuxt-auto/auto-api/frontend-composables","0.docs/3.nuxt-auto/2.auto-api/32.frontend-composables",{"title":271,"path":272,"stem":273},"Testing","/docs/nuxt-auto/auto-api/testing","0.docs/3.nuxt-auto/2.auto-api/33.testing",{"title":275,"path":276,"stem":277},"Pagination","/docs/nuxt-auto/auto-api/pagination","0.docs/3.nuxt-auto/2.auto-api/4.pagination",{"title":279,"path":280,"stem":281},"Soft Deletes","/docs/nuxt-auto/auto-api/soft-deletes","0.docs/3.nuxt-auto/2.auto-api/5.soft-deletes",{"title":283,"path":284,"stem":285},"Authentication & Authorization","/docs/nuxt-auto/auto-api/authentication-authorization","0.docs/3.nuxt-auto/2.auto-api/6.authentication-authorization",{"title":287,"path":288,"stem":289},"Better-Auth Integration","/docs/nuxt-auto/auto-api/better-auth","0.docs/3.nuxt-auto/2.auto-api/7.better-auth",{"title":291,"path":292,"stem":293},"Nested Relations","/docs/nuxt-auto/auto-api/nested-relationships","0.docs/3.nuxt-auto/2.auto-api/8.nested-relationships",{"title":295,"path":296,"stem":297},"Bulk Operations","/docs/nuxt-auto/auto-api/bulk-operations","0.docs/3.nuxt-auto/2.auto-api/9.bulk-operations",{"title":299,"path":300,"stem":301,"children":302,"page":201},"Auto Admin","/docs/nuxt-auto/auto-admin","0.docs/3.nuxt-auto/3.auto-admin",[303,306,310,314,318,322,326,330,334],{"title":185,"path":304,"stem":305},"/docs/nuxt-auto/auto-admin/getting-started","0.docs/3.nuxt-auto/3.auto-admin/1.getting-started",{"title":307,"path":308,"stem":309},"Configuration & Theming","/docs/nuxt-auto/auto-admin/configuration-theming","0.docs/3.nuxt-auto/3.auto-admin/2.configuration-theming",{"title":311,"path":312,"stem":313},"Resource Configuration","/docs/nuxt-auto/auto-admin/resource-configuration","0.docs/3.nuxt-auto/3.auto-admin/3.resource-configuration",{"title":315,"path":316,"stem":317},"Form Fields & Widgets","/docs/nuxt-auto/auto-admin/form-fields-widgets","0.docs/3.nuxt-auto/3.auto-admin/4.form-fields-widgets",{"title":319,"path":320,"stem":321},"Permissions","/docs/nuxt-auto/auto-admin/permissions","0.docs/3.nuxt-auto/3.auto-admin/5.permissions",{"title":323,"path":324,"stem":325},"Custom Pages","/docs/nuxt-auto/auto-admin/custom-pages","0.docs/3.nuxt-auto/3.auto-admin/6.custom-pages",{"title":327,"path":328,"stem":329},"M2M Relationships","/docs/nuxt-auto/auto-admin/m2m-relationships","0.docs/3.nuxt-auto/3.auto-admin/7.m2m-relationships",{"title":331,"path":332,"stem":333},"Custom Actions","/docs/nuxt-auto/auto-admin/custom-actions","0.docs/3.nuxt-auto/3.auto-admin/8.custom-actions",{"title":335,"path":336,"stem":337},"Composables","/docs/nuxt-auto/auto-admin/composables","0.docs/3.nuxt-auto/3.auto-admin/9.composables",[339,342,355,382,400,415,425],{"title":5,"path":340,"stem":341},"/docs/nuxt-protokit","0.docs/4.nuxt-protokit/index",{"title":185,"path":343,"stem":344,"children":345,"icon":354},"/docs/nuxt-protokit/getting-started","0.docs/4.nuxt-protokit/1.getting-started/1.index",[346,347,351],{"title":190,"path":343,"stem":344},{"title":348,"path":349,"stem":350},"Core Concepts","/docs/nuxt-protokit/getting-started/concepts","0.docs/4.nuxt-protokit/1.getting-started/2.concepts",{"title":198,"path":352,"stem":353},"/docs/nuxt-protokit/getting-started/quick-start","0.docs/4.nuxt-protokit/1.getting-started/3.quick-start","i-lucide-rocket",{"title":356,"path":357,"stem":358,"children":359,"icon":381},"Schemas","/docs/nuxt-protokit/schemas","0.docs/4.nuxt-protokit/2.schemas/1.index",[360,361,365,369,373,377],{"title":5,"path":357,"stem":358},{"title":362,"path":363,"stem":364},"Field Types","/docs/nuxt-protokit/schemas/fields","0.docs/4.nuxt-protokit/2.schemas/2.fields",{"title":366,"path":367,"stem":368},"Collections","/docs/nuxt-protokit/schemas/collections","0.docs/4.nuxt-protokit/2.schemas/3.collections",{"title":370,"path":371,"stem":372},"Derived & Computed","/docs/nuxt-protokit/schemas/derived-computed","0.docs/4.nuxt-protokit/2.schemas/4.derived-computed",{"title":374,"path":375,"stem":376},"Connections","/docs/nuxt-protokit/schemas/connections","0.docs/4.nuxt-protokit/2.schemas/5.connections",{"title":378,"path":379,"stem":380},"Visualizations & Layouts","/docs/nuxt-protokit/schemas/visualizations","0.docs/4.nuxt-protokit/2.schemas/6.visualizations","i-lucide-file-code",{"title":335,"path":383,"stem":384,"children":385,"icon":399},"/docs/nuxt-protokit/composables","0.docs/4.nuxt-protokit/3.composables/1.index",[386,387,391,395],{"title":5,"path":383,"stem":384},{"title":388,"path":389,"stem":390},"usePrototype","/docs/nuxt-protokit/composables/use-prototype","0.docs/4.nuxt-protokit/3.composables/2.use-prototype",{"title":392,"path":393,"stem":394},"useProtoDoc","/docs/nuxt-protokit/composables/use-proto-doc","0.docs/4.nuxt-protokit/3.composables/3.use-proto-doc",{"title":396,"path":397,"stem":398},"useProtoCollection","/docs/nuxt-protokit/composables/use-proto-collection","0.docs/4.nuxt-protokit/3.composables/4.use-proto-collection","i-lucide-layers",{"title":401,"path":402,"stem":403,"children":404,"icon":414},"Components","/docs/nuxt-protokit/components","0.docs/4.nuxt-protokit/4.components/1.index",[405,406,410],{"title":5,"path":402,"stem":403},{"title":407,"path":408,"stem":409},"ProtoTool","/docs/nuxt-protokit/components/proto-tool","0.docs/4.nuxt-protokit/4.components/2.proto-tool",{"title":411,"path":412,"stem":413},"ProtoCrudModal","/docs/nuxt-protokit/components/proto-crud-modal","0.docs/4.nuxt-protokit/4.components/3.proto-crud-modal","i-lucide-puzzle",{"title":151,"path":416,"stem":417,"children":418,"icon":424},"/docs/nuxt-protokit/offline-first","0.docs/4.nuxt-protokit/5.offline-first/1.index",[419,420],{"title":151,"path":416,"stem":417},{"title":421,"path":422,"stem":423},"Corruption Recovery","/docs/nuxt-protokit/offline-first/corruption-recovery","0.docs/4.nuxt-protokit/5.offline-first/2.corruption-recovery","i-lucide-wifi-off",{"title":426,"icon":427,"path":428,"stem":429,"children":430},"Advanced","i-lucide-graduation-cap","/docs/nuxt-protokit/advanced","0.docs/4.nuxt-protokit/6.advanced/1.index",[431,432,436,440],{"title":5,"path":428,"stem":429},{"title":433,"path":434,"stem":435},"Multi-Tool Apps","/docs/nuxt-protokit/advanced/building-a-toolkit","0.docs/4.nuxt-protokit/6.advanced/1.building-a-toolkit",{"title":437,"path":438,"stem":439},"Schema Patterns","/docs/nuxt-protokit/advanced/custom-schema-patterns","0.docs/4.nuxt-protokit/6.advanced/2.custom-schema-patterns",{"title":441,"path":442,"stem":443},"Custom Fields & Viz","/docs/nuxt-protokit/advanced/extensibility","0.docs/4.nuxt-protokit/6.advanced/3.extensibility",{"page":445,"fallbackPage":4531},{"id":446,"title":271,"body":447,"description":457,"extension":4530,"links":4531,"meta":4532,"navigation":4531,"ogImage":4531,"path":272,"seo":4533,"stem":273,"__hash__":4534},"nuxt_auto/0.docs/3.nuxt-auto/2.auto-api/33.testing.md",{"type":448,"value":449,"toc":4506},"minimark",[450,454,458,463,510,513,617,620,628,631,634,639,1115,1119,1461,1464,1467,1471,1988,1991,1994,2783,2786,2789,2793,2929,2933,3356,3359,3363,3879,3883,4170,4174,4404,4408,4460,4464,4481,4484,4502],[451,452,271],"h1",{"id":453},"testing",[455,456,457],"p",{},"This guide covers how to write and run tests for Nuxt Auto API, including unit tests, integration tests, and E2E tests with both SQLite and Cloudflare D1.",[459,460,462],"h2",{"id":461},"table-of-contents","Table of Contents",[464,465,466,474,480,486,492,498,504],"ul",{},[467,468,469],"li",{},[470,471,473],"a",{"href":472},"#running-tests","Running Tests",[467,475,476],{},[470,477,479],{"href":478},"#test-structure","Test Structure",[467,481,482],{},[470,483,485],{"href":484},"#unit-tests","Unit Tests",[467,487,488],{},[470,489,491],{"href":490},"#integration-tests","Integration Tests",[467,493,494],{},[470,495,497],{"href":496},"#e2e-tests","E2E Tests",[467,499,500],{},[470,501,503],{"href":502},"#testing-with-d1","Testing with D1",[467,505,506],{},[470,507,509],{"href":508},"#test-helpers","Test Helpers",[459,511,473],{"id":512},"running-tests",[514,515,520],"pre",{"className":516,"code":517,"language":518,"meta":519,"style":519},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Run all tests\nnpm run test\n\n# Run tests in watch mode\nnpm run test:watch\n\n# Run specific test file\nnpm run test -- test/unit/utils/buildWhereClause.test.ts\n\n# Run D1 tests\nnpm run test:d1\n","bash","",[521,522,523,532,546,553,559,569,574,580,596,601,607],"code",{"__ignoreMap":519},[524,525,528],"span",{"class":526,"line":527},"line",1,[524,529,531],{"class":530},"sHwdD","# Run all tests\n",[524,533,535,539,543],{"class":526,"line":534},2,[524,536,538],{"class":537},"sBMFI","npm",[524,540,542],{"class":541},"sfazB"," run",[524,544,545],{"class":541}," test\n",[524,547,549],{"class":526,"line":548},3,[524,550,552],{"emptyLinePlaceholder":551},true,"\n",[524,554,556],{"class":526,"line":555},4,[524,557,558],{"class":530},"# Run tests in watch mode\n",[524,560,562,564,566],{"class":526,"line":561},5,[524,563,538],{"class":537},[524,565,542],{"class":541},[524,567,568],{"class":541}," test:watch\n",[524,570,572],{"class":526,"line":571},6,[524,573,552],{"emptyLinePlaceholder":551},[524,575,577],{"class":526,"line":576},7,[524,578,579],{"class":530},"# Run specific test file\n",[524,581,583,585,587,590,593],{"class":526,"line":582},8,[524,584,538],{"class":537},[524,586,542],{"class":541},[524,588,589],{"class":541}," test",[524,591,592],{"class":541}," --",[524,594,595],{"class":541}," test/unit/utils/buildWhereClause.test.ts\n",[524,597,599],{"class":526,"line":598},9,[524,600,552],{"emptyLinePlaceholder":551},[524,602,604],{"class":526,"line":603},10,[524,605,606],{"class":530},"# Run D1 tests\n",[524,608,610,612,614],{"class":526,"line":609},11,[524,611,538],{"class":537},[524,613,542],{"class":541},[524,615,616],{"class":541}," test:d1\n",[459,618,479],{"id":619},"test-structure",[514,621,626],{"className":622,"code":624,"language":625},[623],"language-text","packages/@websideproject/nuxt-auto-api/\n├── test/\n│   ├── fixtures/          # Test apps for E2E\n│   │   ├── basic/         # Basic CRUD test app\n│   │   └── auth/          # With authentication\n│   ├── unit/              # Unit tests\n│   │   ├── utils/         # Utility function tests\n│   │   └── middleware/    # Middleware tests\n│   ├── integration/       # Integration tests\n│   ├── e2e/               # End-to-end tests\n│   └── helpers/           # Test utilities\n│       ├── setup.ts       # SQLite setup\n│       ├── setup-d1.ts    # D1 setup\n│       ├── factories.ts   # Data factories\n│       └── mocks.ts       # Mock utilities\n","text",[521,627,624],{"__ignoreMap":519},[459,629,485],{"id":630},"unit-tests",[455,632,633],{},"Unit tests focus on testing individual functions and utilities in isolation.",[635,636,638],"h3",{"id":637},"example-testing-utility-functions","Example: Testing Utility Functions",[514,640,644],{"className":641,"code":642,"language":643,"meta":519,"style":519},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// test/unit/utils/buildWhereClause.test.ts\nimport { describe, it, expect } from 'vitest'\nimport { sqliteTable, integer, text } from 'drizzle-orm/sqlite-core'\nimport { buildWhereClause } from '../../../src/runtime/server/utils/buildWhereClause'\n\nconst testTable = sqliteTable('test', {\n  id: integer('id').primaryKey(),\n  name: text('name'),\n  age: integer('age')\n})\n\ndescribe('buildWhereClause', () => {\n  it('should build simple equality filter', () => {\n    const filter = { name: 'John' }\n    const result = buildWhereClause(filter, testTable)\n\n    expect(result).toBeDefined()\n  })\n\n  it('should handle $gt operator', () => {\n    const filter = { age: { $gt: 18 } }\n    const result = buildWhereClause(filter, testTable)\n\n    expect(result).toBeDefined()\n  })\n})\n","typescript",[521,645,646,651,691,721,741,745,776,811,833,854,861,865,890,913,942,966,971,992,1000,1005,1027,1058,1079,1084,1101,1108],{"__ignoreMap":519},[524,647,648],{"class":526,"line":527},[524,649,650],{"class":530},"// test/unit/utils/buildWhereClause.test.ts\n",[524,652,653,657,661,665,668,671,673,676,679,682,685,688],{"class":526,"line":534},[524,654,656],{"class":655},"s7zQu","import",[524,658,660],{"class":659},"sMK4o"," {",[524,662,664],{"class":663},"sTEyZ"," describe",[524,666,667],{"class":659},",",[524,669,670],{"class":663}," it",[524,672,667],{"class":659},[524,674,675],{"class":663}," expect",[524,677,678],{"class":659}," }",[524,680,681],{"class":655}," from",[524,683,684],{"class":659}," '",[524,686,687],{"class":541},"vitest",[524,689,690],{"class":659},"'\n",[524,692,693,695,697,700,702,705,707,710,712,714,716,719],{"class":526,"line":548},[524,694,656],{"class":655},[524,696,660],{"class":659},[524,698,699],{"class":663}," sqliteTable",[524,701,667],{"class":659},[524,703,704],{"class":663}," integer",[524,706,667],{"class":659},[524,708,709],{"class":663}," text",[524,711,678],{"class":659},[524,713,681],{"class":655},[524,715,684],{"class":659},[524,717,718],{"class":541},"drizzle-orm/sqlite-core",[524,720,690],{"class":659},[524,722,723,725,727,730,732,734,736,739],{"class":526,"line":555},[524,724,656],{"class":655},[524,726,660],{"class":659},[524,728,729],{"class":663}," buildWhereClause",[524,731,678],{"class":659},[524,733,681],{"class":655},[524,735,684],{"class":659},[524,737,738],{"class":541},"../../../src/runtime/server/utils/buildWhereClause",[524,740,690],{"class":659},[524,742,743],{"class":526,"line":561},[524,744,552],{"emptyLinePlaceholder":551},[524,746,747,751,754,757,760,763,766,769,771,773],{"class":526,"line":571},[524,748,750],{"class":749},"spNyl","const",[524,752,753],{"class":663}," testTable ",[524,755,756],{"class":659},"=",[524,758,699],{"class":759},"s2Zo4",[524,761,762],{"class":663},"(",[524,764,765],{"class":659},"'",[524,767,768],{"class":541},"test",[524,770,765],{"class":659},[524,772,667],{"class":659},[524,774,775],{"class":659}," {\n",[524,777,778,782,785,787,789,791,794,796,799,802,805,808],{"class":526,"line":576},[524,779,781],{"class":780},"swJcz","  id",[524,783,784],{"class":659},":",[524,786,704],{"class":759},[524,788,762],{"class":663},[524,790,765],{"class":659},[524,792,793],{"class":541},"id",[524,795,765],{"class":659},[524,797,798],{"class":663},")",[524,800,801],{"class":659},".",[524,803,804],{"class":759},"primaryKey",[524,806,807],{"class":663},"()",[524,809,810],{"class":659},",\n",[524,812,813,816,818,820,822,824,827,829,831],{"class":526,"line":582},[524,814,815],{"class":780},"  name",[524,817,784],{"class":659},[524,819,709],{"class":759},[524,821,762],{"class":663},[524,823,765],{"class":659},[524,825,826],{"class":541},"name",[524,828,765],{"class":659},[524,830,798],{"class":663},[524,832,810],{"class":659},[524,834,835,838,840,842,844,846,849,851],{"class":526,"line":598},[524,836,837],{"class":780},"  age",[524,839,784],{"class":659},[524,841,704],{"class":759},[524,843,762],{"class":663},[524,845,765],{"class":659},[524,847,848],{"class":541},"age",[524,850,765],{"class":659},[524,852,853],{"class":663},")\n",[524,855,856,859],{"class":526,"line":603},[524,857,858],{"class":659},"}",[524,860,853],{"class":663},[524,862,863],{"class":526,"line":609},[524,864,552],{"emptyLinePlaceholder":551},[524,866,868,871,873,875,878,880,882,885,888],{"class":526,"line":867},12,[524,869,870],{"class":759},"describe",[524,872,762],{"class":663},[524,874,765],{"class":659},[524,876,877],{"class":541},"buildWhereClause",[524,879,765],{"class":659},[524,881,667],{"class":659},[524,883,884],{"class":659}," ()",[524,886,887],{"class":749}," =>",[524,889,775],{"class":659},[524,891,893,896,898,900,903,905,907,909,911],{"class":526,"line":892},13,[524,894,895],{"class":759},"  it",[524,897,762],{"class":780},[524,899,765],{"class":659},[524,901,902],{"class":541},"should build simple equality filter",[524,904,765],{"class":659},[524,906,667],{"class":659},[524,908,884],{"class":659},[524,910,887],{"class":749},[524,912,775],{"class":659},[524,914,916,919,922,925,927,930,932,934,937,939],{"class":526,"line":915},14,[524,917,918],{"class":749},"    const",[524,920,921],{"class":663}," filter",[524,923,924],{"class":659}," =",[524,926,660],{"class":659},[524,928,929],{"class":780}," name",[524,931,784],{"class":659},[524,933,684],{"class":659},[524,935,936],{"class":541},"John",[524,938,765],{"class":659},[524,940,941],{"class":659}," }\n",[524,943,945,947,950,952,954,956,959,961,964],{"class":526,"line":944},15,[524,946,918],{"class":749},[524,948,949],{"class":663}," result",[524,951,924],{"class":659},[524,953,729],{"class":759},[524,955,762],{"class":780},[524,957,958],{"class":663},"filter",[524,960,667],{"class":659},[524,962,963],{"class":663}," testTable",[524,965,853],{"class":780},[524,967,969],{"class":526,"line":968},16,[524,970,552],{"emptyLinePlaceholder":551},[524,972,974,977,979,982,984,986,989],{"class":526,"line":973},17,[524,975,976],{"class":759},"    expect",[524,978,762],{"class":780},[524,980,981],{"class":663},"result",[524,983,798],{"class":780},[524,985,801],{"class":659},[524,987,988],{"class":759},"toBeDefined",[524,990,991],{"class":780},"()\n",[524,993,995,998],{"class":526,"line":994},18,[524,996,997],{"class":659},"  }",[524,999,853],{"class":780},[524,1001,1003],{"class":526,"line":1002},19,[524,1004,552],{"emptyLinePlaceholder":551},[524,1006,1008,1010,1012,1014,1017,1019,1021,1023,1025],{"class":526,"line":1007},20,[524,1009,895],{"class":759},[524,1011,762],{"class":780},[524,1013,765],{"class":659},[524,1015,1016],{"class":541},"should handle $gt operator",[524,1018,765],{"class":659},[524,1020,667],{"class":659},[524,1022,884],{"class":659},[524,1024,887],{"class":749},[524,1026,775],{"class":659},[524,1028,1030,1032,1034,1036,1038,1041,1043,1045,1048,1050,1054,1056],{"class":526,"line":1029},21,[524,1031,918],{"class":749},[524,1033,921],{"class":663},[524,1035,924],{"class":659},[524,1037,660],{"class":659},[524,1039,1040],{"class":780}," age",[524,1042,784],{"class":659},[524,1044,660],{"class":659},[524,1046,1047],{"class":780}," $gt",[524,1049,784],{"class":659},[524,1051,1053],{"class":1052},"sbssI"," 18",[524,1055,678],{"class":659},[524,1057,941],{"class":659},[524,1059,1061,1063,1065,1067,1069,1071,1073,1075,1077],{"class":526,"line":1060},22,[524,1062,918],{"class":749},[524,1064,949],{"class":663},[524,1066,924],{"class":659},[524,1068,729],{"class":759},[524,1070,762],{"class":780},[524,1072,958],{"class":663},[524,1074,667],{"class":659},[524,1076,963],{"class":663},[524,1078,853],{"class":780},[524,1080,1082],{"class":526,"line":1081},23,[524,1083,552],{"emptyLinePlaceholder":551},[524,1085,1087,1089,1091,1093,1095,1097,1099],{"class":526,"line":1086},24,[524,1088,976],{"class":759},[524,1090,762],{"class":780},[524,1092,981],{"class":663},[524,1094,798],{"class":780},[524,1096,801],{"class":659},[524,1098,988],{"class":759},[524,1100,991],{"class":780},[524,1102,1104,1106],{"class":526,"line":1103},25,[524,1105,997],{"class":659},[524,1107,853],{"class":780},[524,1109,1111,1113],{"class":526,"line":1110},26,[524,1112,858],{"class":659},[524,1114,853],{"class":663},[635,1116,1118],{"id":1117},"example-testing-middleware","Example: Testing Middleware",[514,1120,1122],{"className":641,"code":1121,"language":643,"meta":519,"style":519},"// test/unit/middleware/authz.test.ts\nimport { describe, it, expect } from 'vitest'\nimport { createAuthorizationMiddleware } from '../../../src/runtime/server/middleware/authz'\nimport { createMockContext, createMockUser } from '../../helpers/mocks'\n\ndescribe('Authorization Middleware', () => {\n  it('should allow request with valid permissions', async () => {\n    const config = {\n      permissions: {\n        read: ['user', 'admin']\n      }\n    }\n\n    const middleware = createAuthorizationMiddleware(config)\n    const context = createMockContext({\n      user: createMockUser('user'),\n      permissions: ['read'],\n      operation: 'list'\n    })\n\n    await expect(middleware(context)).resolves.not.toThrow()\n  })\n})\n",[521,1123,1124,1129,1155,1175,1200,1204,1225,1249,1260,1269,1298,1303,1308,1312,1330,1346,1367,1387,1401,1408,1412,1449,1455],{"__ignoreMap":519},[524,1125,1126],{"class":526,"line":527},[524,1127,1128],{"class":530},"// test/unit/middleware/authz.test.ts\n",[524,1130,1131,1133,1135,1137,1139,1141,1143,1145,1147,1149,1151,1153],{"class":526,"line":534},[524,1132,656],{"class":655},[524,1134,660],{"class":659},[524,1136,664],{"class":663},[524,1138,667],{"class":659},[524,1140,670],{"class":663},[524,1142,667],{"class":659},[524,1144,675],{"class":663},[524,1146,678],{"class":659},[524,1148,681],{"class":655},[524,1150,684],{"class":659},[524,1152,687],{"class":541},[524,1154,690],{"class":659},[524,1156,1157,1159,1161,1164,1166,1168,1170,1173],{"class":526,"line":548},[524,1158,656],{"class":655},[524,1160,660],{"class":659},[524,1162,1163],{"class":663}," createAuthorizationMiddleware",[524,1165,678],{"class":659},[524,1167,681],{"class":655},[524,1169,684],{"class":659},[524,1171,1172],{"class":541},"../../../src/runtime/server/middleware/authz",[524,1174,690],{"class":659},[524,1176,1177,1179,1181,1184,1186,1189,1191,1193,1195,1198],{"class":526,"line":555},[524,1178,656],{"class":655},[524,1180,660],{"class":659},[524,1182,1183],{"class":663}," createMockContext",[524,1185,667],{"class":659},[524,1187,1188],{"class":663}," createMockUser",[524,1190,678],{"class":659},[524,1192,681],{"class":655},[524,1194,684],{"class":659},[524,1196,1197],{"class":541},"../../helpers/mocks",[524,1199,690],{"class":659},[524,1201,1202],{"class":526,"line":561},[524,1203,552],{"emptyLinePlaceholder":551},[524,1205,1206,1208,1210,1212,1215,1217,1219,1221,1223],{"class":526,"line":571},[524,1207,870],{"class":759},[524,1209,762],{"class":663},[524,1211,765],{"class":659},[524,1213,1214],{"class":541},"Authorization Middleware",[524,1216,765],{"class":659},[524,1218,667],{"class":659},[524,1220,884],{"class":659},[524,1222,887],{"class":749},[524,1224,775],{"class":659},[524,1226,1227,1229,1231,1233,1236,1238,1240,1243,1245,1247],{"class":526,"line":576},[524,1228,895],{"class":759},[524,1230,762],{"class":780},[524,1232,765],{"class":659},[524,1234,1235],{"class":541},"should allow request with valid permissions",[524,1237,765],{"class":659},[524,1239,667],{"class":659},[524,1241,1242],{"class":749}," async",[524,1244,884],{"class":659},[524,1246,887],{"class":749},[524,1248,775],{"class":659},[524,1250,1251,1253,1256,1258],{"class":526,"line":582},[524,1252,918],{"class":749},[524,1254,1255],{"class":663}," config",[524,1257,924],{"class":659},[524,1259,775],{"class":659},[524,1261,1262,1265,1267],{"class":526,"line":598},[524,1263,1264],{"class":780},"      permissions",[524,1266,784],{"class":659},[524,1268,775],{"class":659},[524,1270,1271,1274,1276,1279,1281,1284,1286,1288,1290,1293,1295],{"class":526,"line":603},[524,1272,1273],{"class":780},"        read",[524,1275,784],{"class":659},[524,1277,1278],{"class":780}," [",[524,1280,765],{"class":659},[524,1282,1283],{"class":541},"user",[524,1285,765],{"class":659},[524,1287,667],{"class":659},[524,1289,684],{"class":659},[524,1291,1292],{"class":541},"admin",[524,1294,765],{"class":659},[524,1296,1297],{"class":780},"]\n",[524,1299,1300],{"class":526,"line":609},[524,1301,1302],{"class":659},"      }\n",[524,1304,1305],{"class":526,"line":867},[524,1306,1307],{"class":659},"    }\n",[524,1309,1310],{"class":526,"line":892},[524,1311,552],{"emptyLinePlaceholder":551},[524,1313,1314,1316,1319,1321,1323,1325,1328],{"class":526,"line":915},[524,1315,918],{"class":749},[524,1317,1318],{"class":663}," middleware",[524,1320,924],{"class":659},[524,1322,1163],{"class":759},[524,1324,762],{"class":780},[524,1326,1327],{"class":663},"config",[524,1329,853],{"class":780},[524,1331,1332,1334,1337,1339,1341,1343],{"class":526,"line":944},[524,1333,918],{"class":749},[524,1335,1336],{"class":663}," context",[524,1338,924],{"class":659},[524,1340,1183],{"class":759},[524,1342,762],{"class":780},[524,1344,1345],{"class":659},"{\n",[524,1347,1348,1351,1353,1355,1357,1359,1361,1363,1365],{"class":526,"line":968},[524,1349,1350],{"class":780},"      user",[524,1352,784],{"class":659},[524,1354,1188],{"class":759},[524,1356,762],{"class":780},[524,1358,765],{"class":659},[524,1360,1283],{"class":541},[524,1362,765],{"class":659},[524,1364,798],{"class":780},[524,1366,810],{"class":659},[524,1368,1369,1371,1373,1375,1377,1380,1382,1385],{"class":526,"line":973},[524,1370,1264],{"class":780},[524,1372,784],{"class":659},[524,1374,1278],{"class":780},[524,1376,765],{"class":659},[524,1378,1379],{"class":541},"read",[524,1381,765],{"class":659},[524,1383,1384],{"class":780},"]",[524,1386,810],{"class":659},[524,1388,1389,1392,1394,1396,1399],{"class":526,"line":994},[524,1390,1391],{"class":780},"      operation",[524,1393,784],{"class":659},[524,1395,684],{"class":659},[524,1397,1398],{"class":541},"list",[524,1400,690],{"class":659},[524,1402,1403,1406],{"class":526,"line":1002},[524,1404,1405],{"class":659},"    }",[524,1407,853],{"class":780},[524,1409,1410],{"class":526,"line":1007},[524,1411,552],{"emptyLinePlaceholder":551},[524,1413,1414,1417,1419,1421,1424,1426,1429,1432,1434,1437,1439,1442,1444,1447],{"class":526,"line":1029},[524,1415,1416],{"class":655},"    await",[524,1418,675],{"class":759},[524,1420,762],{"class":780},[524,1422,1423],{"class":759},"middleware",[524,1425,762],{"class":780},[524,1427,1428],{"class":663},"context",[524,1430,1431],{"class":780},"))",[524,1433,801],{"class":659},[524,1435,1436],{"class":663},"resolves",[524,1438,801],{"class":659},[524,1440,1441],{"class":663},"not",[524,1443,801],{"class":659},[524,1445,1446],{"class":759},"toThrow",[524,1448,991],{"class":780},[524,1450,1451,1453],{"class":526,"line":1060},[524,1452,997],{"class":659},[524,1454,853],{"class":780},[524,1456,1457,1459],{"class":526,"line":1081},[524,1458,858],{"class":659},[524,1460,853],{"class":663},[459,1462,491],{"id":1463},"integration-tests",[455,1465,1466],{},"Integration tests verify that multiple components work together correctly, using a real database.",[635,1468,1470],{"id":1469},"setup","Setup",[514,1472,1474],{"className":641,"code":1473,"language":643,"meta":519,"style":519},"// test/integration/crud.test.ts\nimport { describe, it, expect, beforeEach, afterEach } from 'vitest'\nimport { setupTestDatabase, seedDatabase, cleanDatabase } from '../helpers/setup'\nimport * as baseSchema from '../../playground/server/database/schema'\n\ndescribe('CRUD Operations Integration', () => {\n  let db: any\n  let sqlite: any\n  let testData: any\n\n  beforeEach(async () => {\n    const setup = await setupTestDatabase(baseSchema)\n    db = setup.db\n    sqlite = setup.sqlite\n    testData = await seedDatabase(db, baseSchema)\n  })\n\n  afterEach(async () => {\n    await cleanDatabase(db, baseSchema)\n    sqlite.close()\n  })\n\n  it('should return all posts', async () => {\n    const context = createMockContext({\n      db,\n      schema: baseSchema,\n      resource: 'posts',\n      operation: 'list',\n      query: {}\n    })\n\n    const result = await listHandler(context)\n\n    expect(result.data).toBeArray()\n    expect(result.data.length).toBeGreaterThan(0)\n  })\n})\n",[521,1475,1476,1481,1517,1547,1570,1574,1595,1608,1619,1630,1634,1650,1671,1685,1699,1722,1728,1732,1747,1763,1774,1780,1784,1807,1821,1828,1839,1856,1871,1882,1889,1894,1914,1919,1942,1974,1981],{"__ignoreMap":519},[524,1477,1478],{"class":526,"line":527},[524,1479,1480],{"class":530},"// test/integration/crud.test.ts\n",[524,1482,1483,1485,1487,1489,1491,1493,1495,1497,1499,1502,1504,1507,1509,1511,1513,1515],{"class":526,"line":534},[524,1484,656],{"class":655},[524,1486,660],{"class":659},[524,1488,664],{"class":663},[524,1490,667],{"class":659},[524,1492,670],{"class":663},[524,1494,667],{"class":659},[524,1496,675],{"class":663},[524,1498,667],{"class":659},[524,1500,1501],{"class":663}," beforeEach",[524,1503,667],{"class":659},[524,1505,1506],{"class":663}," afterEach",[524,1508,678],{"class":659},[524,1510,681],{"class":655},[524,1512,684],{"class":659},[524,1514,687],{"class":541},[524,1516,690],{"class":659},[524,1518,1519,1521,1523,1526,1528,1531,1533,1536,1538,1540,1542,1545],{"class":526,"line":548},[524,1520,656],{"class":655},[524,1522,660],{"class":659},[524,1524,1525],{"class":663}," setupTestDatabase",[524,1527,667],{"class":659},[524,1529,1530],{"class":663}," seedDatabase",[524,1532,667],{"class":659},[524,1534,1535],{"class":663}," cleanDatabase",[524,1537,678],{"class":659},[524,1539,681],{"class":655},[524,1541,684],{"class":659},[524,1543,1544],{"class":541},"../helpers/setup",[524,1546,690],{"class":659},[524,1548,1549,1551,1554,1557,1560,1563,1565,1568],{"class":526,"line":555},[524,1550,656],{"class":655},[524,1552,1553],{"class":659}," *",[524,1555,1556],{"class":655}," as",[524,1558,1559],{"class":663}," baseSchema ",[524,1561,1562],{"class":655},"from",[524,1564,684],{"class":659},[524,1566,1567],{"class":541},"../../playground/server/database/schema",[524,1569,690],{"class":659},[524,1571,1572],{"class":526,"line":561},[524,1573,552],{"emptyLinePlaceholder":551},[524,1575,1576,1578,1580,1582,1585,1587,1589,1591,1593],{"class":526,"line":571},[524,1577,870],{"class":759},[524,1579,762],{"class":663},[524,1581,765],{"class":659},[524,1583,1584],{"class":541},"CRUD Operations Integration",[524,1586,765],{"class":659},[524,1588,667],{"class":659},[524,1590,884],{"class":659},[524,1592,887],{"class":749},[524,1594,775],{"class":659},[524,1596,1597,1600,1603,1605],{"class":526,"line":576},[524,1598,1599],{"class":749},"  let",[524,1601,1602],{"class":663}," db",[524,1604,784],{"class":659},[524,1606,1607],{"class":537}," any\n",[524,1609,1610,1612,1615,1617],{"class":526,"line":582},[524,1611,1599],{"class":749},[524,1613,1614],{"class":663}," sqlite",[524,1616,784],{"class":659},[524,1618,1607],{"class":537},[524,1620,1621,1623,1626,1628],{"class":526,"line":598},[524,1622,1599],{"class":749},[524,1624,1625],{"class":663}," testData",[524,1627,784],{"class":659},[524,1629,1607],{"class":537},[524,1631,1632],{"class":526,"line":603},[524,1633,552],{"emptyLinePlaceholder":551},[524,1635,1636,1639,1641,1644,1646,1648],{"class":526,"line":609},[524,1637,1638],{"class":759},"  beforeEach",[524,1640,762],{"class":780},[524,1642,1643],{"class":749},"async",[524,1645,884],{"class":659},[524,1647,887],{"class":749},[524,1649,775],{"class":659},[524,1651,1652,1654,1657,1659,1662,1664,1666,1669],{"class":526,"line":867},[524,1653,918],{"class":749},[524,1655,1656],{"class":663}," setup",[524,1658,924],{"class":659},[524,1660,1661],{"class":655}," await",[524,1663,1525],{"class":759},[524,1665,762],{"class":780},[524,1667,1668],{"class":663},"baseSchema",[524,1670,853],{"class":780},[524,1672,1673,1676,1678,1680,1682],{"class":526,"line":892},[524,1674,1675],{"class":663},"    db",[524,1677,924],{"class":659},[524,1679,1656],{"class":663},[524,1681,801],{"class":659},[524,1683,1684],{"class":663},"db\n",[524,1686,1687,1690,1692,1694,1696],{"class":526,"line":915},[524,1688,1689],{"class":663},"    sqlite",[524,1691,924],{"class":659},[524,1693,1656],{"class":663},[524,1695,801],{"class":659},[524,1697,1698],{"class":663},"sqlite\n",[524,1700,1701,1704,1706,1708,1710,1712,1715,1717,1720],{"class":526,"line":944},[524,1702,1703],{"class":663},"    testData",[524,1705,924],{"class":659},[524,1707,1661],{"class":655},[524,1709,1530],{"class":759},[524,1711,762],{"class":780},[524,1713,1714],{"class":663},"db",[524,1716,667],{"class":659},[524,1718,1719],{"class":663}," baseSchema",[524,1721,853],{"class":780},[524,1723,1724,1726],{"class":526,"line":968},[524,1725,997],{"class":659},[524,1727,853],{"class":780},[524,1729,1730],{"class":526,"line":973},[524,1731,552],{"emptyLinePlaceholder":551},[524,1733,1734,1737,1739,1741,1743,1745],{"class":526,"line":994},[524,1735,1736],{"class":759},"  afterEach",[524,1738,762],{"class":780},[524,1740,1643],{"class":749},[524,1742,884],{"class":659},[524,1744,887],{"class":749},[524,1746,775],{"class":659},[524,1748,1749,1751,1753,1755,1757,1759,1761],{"class":526,"line":1002},[524,1750,1416],{"class":655},[524,1752,1535],{"class":759},[524,1754,762],{"class":780},[524,1756,1714],{"class":663},[524,1758,667],{"class":659},[524,1760,1719],{"class":663},[524,1762,853],{"class":780},[524,1764,1765,1767,1769,1772],{"class":526,"line":1007},[524,1766,1689],{"class":663},[524,1768,801],{"class":659},[524,1770,1771],{"class":759},"close",[524,1773,991],{"class":780},[524,1775,1776,1778],{"class":526,"line":1029},[524,1777,997],{"class":659},[524,1779,853],{"class":780},[524,1781,1782],{"class":526,"line":1060},[524,1783,552],{"emptyLinePlaceholder":551},[524,1785,1786,1788,1790,1792,1795,1797,1799,1801,1803,1805],{"class":526,"line":1081},[524,1787,895],{"class":759},[524,1789,762],{"class":780},[524,1791,765],{"class":659},[524,1793,1794],{"class":541},"should return all posts",[524,1796,765],{"class":659},[524,1798,667],{"class":659},[524,1800,1242],{"class":749},[524,1802,884],{"class":659},[524,1804,887],{"class":749},[524,1806,775],{"class":659},[524,1808,1809,1811,1813,1815,1817,1819],{"class":526,"line":1086},[524,1810,918],{"class":749},[524,1812,1336],{"class":663},[524,1814,924],{"class":659},[524,1816,1183],{"class":759},[524,1818,762],{"class":780},[524,1820,1345],{"class":659},[524,1822,1823,1826],{"class":526,"line":1103},[524,1824,1825],{"class":663},"      db",[524,1827,810],{"class":659},[524,1829,1830,1833,1835,1837],{"class":526,"line":1110},[524,1831,1832],{"class":780},"      schema",[524,1834,784],{"class":659},[524,1836,1719],{"class":663},[524,1838,810],{"class":659},[524,1840,1842,1845,1847,1849,1852,1854],{"class":526,"line":1841},27,[524,1843,1844],{"class":780},"      resource",[524,1846,784],{"class":659},[524,1848,684],{"class":659},[524,1850,1851],{"class":541},"posts",[524,1853,765],{"class":659},[524,1855,810],{"class":659},[524,1857,1859,1861,1863,1865,1867,1869],{"class":526,"line":1858},28,[524,1860,1391],{"class":780},[524,1862,784],{"class":659},[524,1864,684],{"class":659},[524,1866,1398],{"class":541},[524,1868,765],{"class":659},[524,1870,810],{"class":659},[524,1872,1874,1877,1879],{"class":526,"line":1873},29,[524,1875,1876],{"class":780},"      query",[524,1878,784],{"class":659},[524,1880,1881],{"class":659}," {}\n",[524,1883,1885,1887],{"class":526,"line":1884},30,[524,1886,1405],{"class":659},[524,1888,853],{"class":780},[524,1890,1892],{"class":526,"line":1891},31,[524,1893,552],{"emptyLinePlaceholder":551},[524,1895,1897,1899,1901,1903,1905,1908,1910,1912],{"class":526,"line":1896},32,[524,1898,918],{"class":749},[524,1900,949],{"class":663},[524,1902,924],{"class":659},[524,1904,1661],{"class":655},[524,1906,1907],{"class":759}," listHandler",[524,1909,762],{"class":780},[524,1911,1428],{"class":663},[524,1913,853],{"class":780},[524,1915,1917],{"class":526,"line":1916},33,[524,1918,552],{"emptyLinePlaceholder":551},[524,1920,1922,1924,1926,1928,1930,1933,1935,1937,1940],{"class":526,"line":1921},34,[524,1923,976],{"class":759},[524,1925,762],{"class":780},[524,1927,981],{"class":663},[524,1929,801],{"class":659},[524,1931,1932],{"class":663},"data",[524,1934,798],{"class":780},[524,1936,801],{"class":659},[524,1938,1939],{"class":759},"toBeArray",[524,1941,991],{"class":780},[524,1943,1945,1947,1949,1951,1953,1955,1957,1960,1962,1964,1967,1969,1972],{"class":526,"line":1944},35,[524,1946,976],{"class":759},[524,1948,762],{"class":780},[524,1950,981],{"class":663},[524,1952,801],{"class":659},[524,1954,1932],{"class":663},[524,1956,801],{"class":659},[524,1958,1959],{"class":663},"length",[524,1961,798],{"class":780},[524,1963,801],{"class":659},[524,1965,1966],{"class":759},"toBeGreaterThan",[524,1968,762],{"class":780},[524,1970,1971],{"class":1052},"0",[524,1973,853],{"class":780},[524,1975,1977,1979],{"class":526,"line":1976},36,[524,1978,997],{"class":659},[524,1980,853],{"class":780},[524,1982,1984,1986],{"class":526,"line":1983},37,[524,1985,858],{"class":659},[524,1987,853],{"class":663},[459,1989,497],{"id":1990},"e2e-tests",[455,1992,1993],{},"E2E tests verify the complete flow from HTTP request to database and back.",[514,1995,1997],{"className":641,"code":1996,"language":643,"meta":519,"style":519},"// test/e2e/full-flow.test.ts\nimport { describe, it, expect, beforeAll } from 'vitest'\nimport { setup, $fetch } from '@nuxt/test-utils/e2e'\nimport { fileURLToPath } from 'node:url'\n\ndescribe('Full CRUD Flow E2E', async () => {\n  await setup({\n    rootDir: fileURLToPath(new URL('../fixtures/basic', import.meta.url))\n  })\n\n  it('should complete full user journey', async () => {\n    // 1. List posts\n    const listResponse = await $fetch('/api/posts')\n    expect(listResponse.data).toBeArray()\n\n    // 2. Create post\n    const createResponse = await $fetch('/api/posts', {\n      method: 'POST',\n      headers: { 'Authorization': 'Bearer admin-token' },\n      body: {\n        title: 'E2E Test Post',\n        content: 'Test content',\n        userId: 1\n      }\n    })\n\n    expect(createResponse.data).toBeDefined()\n    const postId = createResponse.data.id\n\n    // 3. Get created post\n    const getResponse = await $fetch(`/api/posts/${postId}`)\n    expect(getResponse.data.id).toBe(postId)\n\n    // 4. Update post\n    const updateResponse = await $fetch(`/api/posts/${postId}`, {\n      method: 'PATCH',\n      headers: { 'Authorization': 'Bearer admin-token' },\n      body: { title: 'Updated E2E Post' }\n    })\n\n    expect(updateResponse.data.title).toBe('Updated E2E Post')\n\n    // 5. Delete post\n    const deleteResponse = await $fetch(`/api/posts/${postId}`, {\n      method: 'DELETE',\n      headers: { 'Authorization': 'Bearer admin-token' }\n    })\n\n    expect(deleteResponse.success).toBe(true)\n  })\n})\n",[521,1998,1999,2004,2035,2059,2079,2083,2106,2117,2161,2167,2171,2194,2199,2223,2244,2248,2253,2278,2294,2322,2331,2347,2363,2373,2377,2383,2387,2408,2428,2432,2437,2469,2499,2503,2508,2537,2552,2576,2599,2606,2611,2646,2651,2657,2687,2703,2728,2735,2740,2769,2776],{"__ignoreMap":519},[524,2000,2001],{"class":526,"line":527},[524,2002,2003],{"class":530},"// test/e2e/full-flow.test.ts\n",[524,2005,2006,2008,2010,2012,2014,2016,2018,2020,2022,2025,2027,2029,2031,2033],{"class":526,"line":534},[524,2007,656],{"class":655},[524,2009,660],{"class":659},[524,2011,664],{"class":663},[524,2013,667],{"class":659},[524,2015,670],{"class":663},[524,2017,667],{"class":659},[524,2019,675],{"class":663},[524,2021,667],{"class":659},[524,2023,2024],{"class":663}," beforeAll",[524,2026,678],{"class":659},[524,2028,681],{"class":655},[524,2030,684],{"class":659},[524,2032,687],{"class":541},[524,2034,690],{"class":659},[524,2036,2037,2039,2041,2043,2045,2048,2050,2052,2054,2057],{"class":526,"line":548},[524,2038,656],{"class":655},[524,2040,660],{"class":659},[524,2042,1656],{"class":663},[524,2044,667],{"class":659},[524,2046,2047],{"class":663}," $fetch",[524,2049,678],{"class":659},[524,2051,681],{"class":655},[524,2053,684],{"class":659},[524,2055,2056],{"class":541},"@nuxt/test-utils/e2e",[524,2058,690],{"class":659},[524,2060,2061,2063,2065,2068,2070,2072,2074,2077],{"class":526,"line":555},[524,2062,656],{"class":655},[524,2064,660],{"class":659},[524,2066,2067],{"class":663}," fileURLToPath",[524,2069,678],{"class":659},[524,2071,681],{"class":655},[524,2073,684],{"class":659},[524,2075,2076],{"class":541},"node:url",[524,2078,690],{"class":659},[524,2080,2081],{"class":526,"line":561},[524,2082,552],{"emptyLinePlaceholder":551},[524,2084,2085,2087,2089,2091,2094,2096,2098,2100,2102,2104],{"class":526,"line":571},[524,2086,870],{"class":759},[524,2088,762],{"class":663},[524,2090,765],{"class":659},[524,2092,2093],{"class":541},"Full CRUD Flow E2E",[524,2095,765],{"class":659},[524,2097,667],{"class":659},[524,2099,1242],{"class":749},[524,2101,884],{"class":659},[524,2103,887],{"class":749},[524,2105,775],{"class":659},[524,2107,2108,2111,2113,2115],{"class":526,"line":576},[524,2109,2110],{"class":655},"  await",[524,2112,1656],{"class":759},[524,2114,762],{"class":780},[524,2116,1345],{"class":659},[524,2118,2119,2122,2124,2126,2128,2131,2134,2136,2138,2141,2143,2145,2148,2150,2153,2155,2158],{"class":526,"line":582},[524,2120,2121],{"class":780},"    rootDir",[524,2123,784],{"class":659},[524,2125,2067],{"class":759},[524,2127,762],{"class":780},[524,2129,2130],{"class":659},"new",[524,2132,2133],{"class":759}," URL",[524,2135,762],{"class":780},[524,2137,765],{"class":659},[524,2139,2140],{"class":541},"../fixtures/basic",[524,2142,765],{"class":659},[524,2144,667],{"class":659},[524,2146,2147],{"class":655}," import",[524,2149,801],{"class":659},[524,2151,2152],{"class":663},"meta",[524,2154,801],{"class":659},[524,2156,2157],{"class":663},"url",[524,2159,2160],{"class":780},"))\n",[524,2162,2163,2165],{"class":526,"line":598},[524,2164,997],{"class":659},[524,2166,853],{"class":780},[524,2168,2169],{"class":526,"line":603},[524,2170,552],{"emptyLinePlaceholder":551},[524,2172,2173,2175,2177,2179,2182,2184,2186,2188,2190,2192],{"class":526,"line":609},[524,2174,895],{"class":759},[524,2176,762],{"class":780},[524,2178,765],{"class":659},[524,2180,2181],{"class":541},"should complete full user journey",[524,2183,765],{"class":659},[524,2185,667],{"class":659},[524,2187,1242],{"class":749},[524,2189,884],{"class":659},[524,2191,887],{"class":749},[524,2193,775],{"class":659},[524,2195,2196],{"class":526,"line":867},[524,2197,2198],{"class":530},"    // 1. List posts\n",[524,2200,2201,2203,2206,2208,2210,2212,2214,2216,2219,2221],{"class":526,"line":892},[524,2202,918],{"class":749},[524,2204,2205],{"class":663}," listResponse",[524,2207,924],{"class":659},[524,2209,1661],{"class":655},[524,2211,2047],{"class":759},[524,2213,762],{"class":780},[524,2215,765],{"class":659},[524,2217,2218],{"class":541},"/api/posts",[524,2220,765],{"class":659},[524,2222,853],{"class":780},[524,2224,2225,2227,2229,2232,2234,2236,2238,2240,2242],{"class":526,"line":915},[524,2226,976],{"class":759},[524,2228,762],{"class":780},[524,2230,2231],{"class":663},"listResponse",[524,2233,801],{"class":659},[524,2235,1932],{"class":663},[524,2237,798],{"class":780},[524,2239,801],{"class":659},[524,2241,1939],{"class":759},[524,2243,991],{"class":780},[524,2245,2246],{"class":526,"line":944},[524,2247,552],{"emptyLinePlaceholder":551},[524,2249,2250],{"class":526,"line":968},[524,2251,2252],{"class":530},"    // 2. Create post\n",[524,2254,2255,2257,2260,2262,2264,2266,2268,2270,2272,2274,2276],{"class":526,"line":973},[524,2256,918],{"class":749},[524,2258,2259],{"class":663}," createResponse",[524,2261,924],{"class":659},[524,2263,1661],{"class":655},[524,2265,2047],{"class":759},[524,2267,762],{"class":780},[524,2269,765],{"class":659},[524,2271,2218],{"class":541},[524,2273,765],{"class":659},[524,2275,667],{"class":659},[524,2277,775],{"class":659},[524,2279,2280,2283,2285,2287,2290,2292],{"class":526,"line":994},[524,2281,2282],{"class":780},"      method",[524,2284,784],{"class":659},[524,2286,684],{"class":659},[524,2288,2289],{"class":541},"POST",[524,2291,765],{"class":659},[524,2293,810],{"class":659},[524,2295,2296,2299,2301,2303,2305,2308,2310,2312,2314,2317,2319],{"class":526,"line":1002},[524,2297,2298],{"class":780},"      headers",[524,2300,784],{"class":659},[524,2302,660],{"class":659},[524,2304,684],{"class":659},[524,2306,2307],{"class":780},"Authorization",[524,2309,765],{"class":659},[524,2311,784],{"class":659},[524,2313,684],{"class":659},[524,2315,2316],{"class":541},"Bearer admin-token",[524,2318,765],{"class":659},[524,2320,2321],{"class":659}," },\n",[524,2323,2324,2327,2329],{"class":526,"line":1007},[524,2325,2326],{"class":780},"      body",[524,2328,784],{"class":659},[524,2330,775],{"class":659},[524,2332,2333,2336,2338,2340,2343,2345],{"class":526,"line":1029},[524,2334,2335],{"class":780},"        title",[524,2337,784],{"class":659},[524,2339,684],{"class":659},[524,2341,2342],{"class":541},"E2E Test Post",[524,2344,765],{"class":659},[524,2346,810],{"class":659},[524,2348,2349,2352,2354,2356,2359,2361],{"class":526,"line":1060},[524,2350,2351],{"class":780},"        content",[524,2353,784],{"class":659},[524,2355,684],{"class":659},[524,2357,2358],{"class":541},"Test content",[524,2360,765],{"class":659},[524,2362,810],{"class":659},[524,2364,2365,2368,2370],{"class":526,"line":1081},[524,2366,2367],{"class":780},"        userId",[524,2369,784],{"class":659},[524,2371,2372],{"class":1052}," 1\n",[524,2374,2375],{"class":526,"line":1086},[524,2376,1302],{"class":659},[524,2378,2379,2381],{"class":526,"line":1103},[524,2380,1405],{"class":659},[524,2382,853],{"class":780},[524,2384,2385],{"class":526,"line":1110},[524,2386,552],{"emptyLinePlaceholder":551},[524,2388,2389,2391,2393,2396,2398,2400,2402,2404,2406],{"class":526,"line":1841},[524,2390,976],{"class":759},[524,2392,762],{"class":780},[524,2394,2395],{"class":663},"createResponse",[524,2397,801],{"class":659},[524,2399,1932],{"class":663},[524,2401,798],{"class":780},[524,2403,801],{"class":659},[524,2405,988],{"class":759},[524,2407,991],{"class":780},[524,2409,2410,2412,2415,2417,2419,2421,2423,2425],{"class":526,"line":1858},[524,2411,918],{"class":749},[524,2413,2414],{"class":663}," postId",[524,2416,924],{"class":659},[524,2418,2259],{"class":663},[524,2420,801],{"class":659},[524,2422,1932],{"class":663},[524,2424,801],{"class":659},[524,2426,2427],{"class":663},"id\n",[524,2429,2430],{"class":526,"line":1873},[524,2431,552],{"emptyLinePlaceholder":551},[524,2433,2434],{"class":526,"line":1884},[524,2435,2436],{"class":530},"    // 3. Get created post\n",[524,2438,2439,2441,2444,2446,2448,2450,2452,2455,2458,2461,2464,2467],{"class":526,"line":1891},[524,2440,918],{"class":749},[524,2442,2443],{"class":663}," getResponse",[524,2445,924],{"class":659},[524,2447,1661],{"class":655},[524,2449,2047],{"class":759},[524,2451,762],{"class":780},[524,2453,2454],{"class":659},"`",[524,2456,2457],{"class":541},"/api/posts/",[524,2459,2460],{"class":659},"${",[524,2462,2463],{"class":663},"postId",[524,2465,2466],{"class":659},"}`",[524,2468,853],{"class":780},[524,2470,2471,2473,2475,2478,2480,2482,2484,2486,2488,2490,2493,2495,2497],{"class":526,"line":1896},[524,2472,976],{"class":759},[524,2474,762],{"class":780},[524,2476,2477],{"class":663},"getResponse",[524,2479,801],{"class":659},[524,2481,1932],{"class":663},[524,2483,801],{"class":659},[524,2485,793],{"class":663},[524,2487,798],{"class":780},[524,2489,801],{"class":659},[524,2491,2492],{"class":759},"toBe",[524,2494,762],{"class":780},[524,2496,2463],{"class":663},[524,2498,853],{"class":780},[524,2500,2501],{"class":526,"line":1916},[524,2502,552],{"emptyLinePlaceholder":551},[524,2504,2505],{"class":526,"line":1921},[524,2506,2507],{"class":530},"    // 4. Update post\n",[524,2509,2510,2512,2515,2517,2519,2521,2523,2525,2527,2529,2531,2533,2535],{"class":526,"line":1944},[524,2511,918],{"class":749},[524,2513,2514],{"class":663}," updateResponse",[524,2516,924],{"class":659},[524,2518,1661],{"class":655},[524,2520,2047],{"class":759},[524,2522,762],{"class":780},[524,2524,2454],{"class":659},[524,2526,2457],{"class":541},[524,2528,2460],{"class":659},[524,2530,2463],{"class":663},[524,2532,2466],{"class":659},[524,2534,667],{"class":659},[524,2536,775],{"class":659},[524,2538,2539,2541,2543,2545,2548,2550],{"class":526,"line":1976},[524,2540,2282],{"class":780},[524,2542,784],{"class":659},[524,2544,684],{"class":659},[524,2546,2547],{"class":541},"PATCH",[524,2549,765],{"class":659},[524,2551,810],{"class":659},[524,2553,2554,2556,2558,2560,2562,2564,2566,2568,2570,2572,2574],{"class":526,"line":1983},[524,2555,2298],{"class":780},[524,2557,784],{"class":659},[524,2559,660],{"class":659},[524,2561,684],{"class":659},[524,2563,2307],{"class":780},[524,2565,765],{"class":659},[524,2567,784],{"class":659},[524,2569,684],{"class":659},[524,2571,2316],{"class":541},[524,2573,765],{"class":659},[524,2575,2321],{"class":659},[524,2577,2579,2581,2583,2585,2588,2590,2592,2595,2597],{"class":526,"line":2578},38,[524,2580,2326],{"class":780},[524,2582,784],{"class":659},[524,2584,660],{"class":659},[524,2586,2587],{"class":780}," title",[524,2589,784],{"class":659},[524,2591,684],{"class":659},[524,2593,2594],{"class":541},"Updated E2E Post",[524,2596,765],{"class":659},[524,2598,941],{"class":659},[524,2600,2602,2604],{"class":526,"line":2601},39,[524,2603,1405],{"class":659},[524,2605,853],{"class":780},[524,2607,2609],{"class":526,"line":2608},40,[524,2610,552],{"emptyLinePlaceholder":551},[524,2612,2614,2616,2618,2621,2623,2625,2627,2630,2632,2634,2636,2638,2640,2642,2644],{"class":526,"line":2613},41,[524,2615,976],{"class":759},[524,2617,762],{"class":780},[524,2619,2620],{"class":663},"updateResponse",[524,2622,801],{"class":659},[524,2624,1932],{"class":663},[524,2626,801],{"class":659},[524,2628,2629],{"class":663},"title",[524,2631,798],{"class":780},[524,2633,801],{"class":659},[524,2635,2492],{"class":759},[524,2637,762],{"class":780},[524,2639,765],{"class":659},[524,2641,2594],{"class":541},[524,2643,765],{"class":659},[524,2645,853],{"class":780},[524,2647,2649],{"class":526,"line":2648},42,[524,2650,552],{"emptyLinePlaceholder":551},[524,2652,2654],{"class":526,"line":2653},43,[524,2655,2656],{"class":530},"    // 5. Delete post\n",[524,2658,2660,2662,2665,2667,2669,2671,2673,2675,2677,2679,2681,2683,2685],{"class":526,"line":2659},44,[524,2661,918],{"class":749},[524,2663,2664],{"class":663}," deleteResponse",[524,2666,924],{"class":659},[524,2668,1661],{"class":655},[524,2670,2047],{"class":759},[524,2672,762],{"class":780},[524,2674,2454],{"class":659},[524,2676,2457],{"class":541},[524,2678,2460],{"class":659},[524,2680,2463],{"class":663},[524,2682,2466],{"class":659},[524,2684,667],{"class":659},[524,2686,775],{"class":659},[524,2688,2690,2692,2694,2696,2699,2701],{"class":526,"line":2689},45,[524,2691,2282],{"class":780},[524,2693,784],{"class":659},[524,2695,684],{"class":659},[524,2697,2698],{"class":541},"DELETE",[524,2700,765],{"class":659},[524,2702,810],{"class":659},[524,2704,2706,2708,2710,2712,2714,2716,2718,2720,2722,2724,2726],{"class":526,"line":2705},46,[524,2707,2298],{"class":780},[524,2709,784],{"class":659},[524,2711,660],{"class":659},[524,2713,684],{"class":659},[524,2715,2307],{"class":780},[524,2717,765],{"class":659},[524,2719,784],{"class":659},[524,2721,684],{"class":659},[524,2723,2316],{"class":541},[524,2725,765],{"class":659},[524,2727,941],{"class":659},[524,2729,2731,2733],{"class":526,"line":2730},47,[524,2732,1405],{"class":659},[524,2734,853],{"class":780},[524,2736,2738],{"class":526,"line":2737},48,[524,2739,552],{"emptyLinePlaceholder":551},[524,2741,2743,2745,2747,2750,2752,2755,2757,2759,2761,2763,2767],{"class":526,"line":2742},49,[524,2744,976],{"class":759},[524,2746,762],{"class":780},[524,2748,2749],{"class":663},"deleteResponse",[524,2751,801],{"class":659},[524,2753,2754],{"class":663},"success",[524,2756,798],{"class":780},[524,2758,801],{"class":659},[524,2760,2492],{"class":759},[524,2762,762],{"class":780},[524,2764,2766],{"class":2765},"sfNiH","true",[524,2768,853],{"class":780},[524,2770,2772,2774],{"class":526,"line":2771},50,[524,2773,997],{"class":659},[524,2775,853],{"class":780},[524,2777,2779,2781],{"class":526,"line":2778},51,[524,2780,858],{"class":659},[524,2782,853],{"class":663},[459,2784,503],{"id":2785},"testing-with-d1",[455,2787,2788],{},"D1 tests use Cloudflare's Miniflare for local testing.",[635,2790,2792],{"id":2791},"configuration","Configuration",[514,2794,2796],{"className":641,"code":2795,"language":643,"meta":519,"style":519},"// vitest.config.d1.ts\nimport { defineWorkersConfig } from '@cloudflare/vitest-pool-workers/config'\n\nexport default defineWorkersConfig({\n  test: {\n    poolOptions: {\n      workers: {\n        miniflare: {\n          d1Databases: {\n            DB: 'test-db'\n          }\n        }\n      }\n    }\n  }\n})\n",[521,2797,2798,2803,2823,2827,2841,2850,2859,2868,2877,2886,2900,2905,2910,2914,2918,2923],{"__ignoreMap":519},[524,2799,2800],{"class":526,"line":527},[524,2801,2802],{"class":530},"// vitest.config.d1.ts\n",[524,2804,2805,2807,2809,2812,2814,2816,2818,2821],{"class":526,"line":534},[524,2806,656],{"class":655},[524,2808,660],{"class":659},[524,2810,2811],{"class":663}," defineWorkersConfig",[524,2813,678],{"class":659},[524,2815,681],{"class":655},[524,2817,684],{"class":659},[524,2819,2820],{"class":541},"@cloudflare/vitest-pool-workers/config",[524,2822,690],{"class":659},[524,2824,2825],{"class":526,"line":548},[524,2826,552],{"emptyLinePlaceholder":551},[524,2828,2829,2832,2835,2837,2839],{"class":526,"line":555},[524,2830,2831],{"class":655},"export",[524,2833,2834],{"class":655}," default",[524,2836,2811],{"class":759},[524,2838,762],{"class":663},[524,2840,1345],{"class":659},[524,2842,2843,2846,2848],{"class":526,"line":561},[524,2844,2845],{"class":780},"  test",[524,2847,784],{"class":659},[524,2849,775],{"class":659},[524,2851,2852,2855,2857],{"class":526,"line":571},[524,2853,2854],{"class":780},"    poolOptions",[524,2856,784],{"class":659},[524,2858,775],{"class":659},[524,2860,2861,2864,2866],{"class":526,"line":576},[524,2862,2863],{"class":780},"      workers",[524,2865,784],{"class":659},[524,2867,775],{"class":659},[524,2869,2870,2873,2875],{"class":526,"line":582},[524,2871,2872],{"class":780},"        miniflare",[524,2874,784],{"class":659},[524,2876,775],{"class":659},[524,2878,2879,2882,2884],{"class":526,"line":598},[524,2880,2881],{"class":780},"          d1Databases",[524,2883,784],{"class":659},[524,2885,775],{"class":659},[524,2887,2888,2891,2893,2895,2898],{"class":526,"line":603},[524,2889,2890],{"class":780},"            DB",[524,2892,784],{"class":659},[524,2894,684],{"class":659},[524,2896,2897],{"class":541},"test-db",[524,2899,690],{"class":659},[524,2901,2902],{"class":526,"line":609},[524,2903,2904],{"class":659},"          }\n",[524,2906,2907],{"class":526,"line":867},[524,2908,2909],{"class":659},"        }\n",[524,2911,2912],{"class":526,"line":892},[524,2913,1302],{"class":659},[524,2915,2916],{"class":526,"line":915},[524,2917,1307],{"class":659},[524,2919,2920],{"class":526,"line":944},[524,2921,2922],{"class":659},"  }\n",[524,2924,2925,2927],{"class":526,"line":968},[524,2926,858],{"class":659},[524,2928,853],{"class":663},[635,2930,2932],{"id":2931},"d1-integration-test","D1 Integration Test",[514,2934,2936],{"className":641,"code":2935,"language":643,"meta":519,"style":519},"// test/integration/crud-d1.test.ts\nimport { describe, it, expect, beforeEach } from 'vitest'\nimport { env } from 'cloudflare:test'\nimport { setupTestD1Database, seedD1Database } from '../helpers/setup-d1'\nimport * as baseSchema from '../../playground/server/database/schema'\n\ndescribe('CRUD Operations with D1', () => {\n  let db: any\n  let d1: D1Database\n\n  beforeEach(async () => {\n    const setup = await setupTestD1Database(env.DB, baseSchema)\n    db = setup.db\n    d1 = setup.d1\n\n    await seedD1Database(db, baseSchema)\n  })\n\n  it('should list posts from D1', async () => {\n    const context = createMockContext({\n      db,\n      schema: baseSchema,\n      resource: 'posts',\n      operation: 'list'\n    })\n\n    const result = await listHandler(context)\n\n    expect(result.data).toBeArray()\n    expect(result.data.length).toBeGreaterThan(0)\n  })\n})\n",[521,2937,2938,2943,2973,2993,3018,3036,3040,3061,3071,3083,3087,3101,3129,3141,3155,3159,3175,3181,3185,3208,3222,3228,3238,3252,3264,3270,3274,3292,3296,3316,3344,3350],{"__ignoreMap":519},[524,2939,2940],{"class":526,"line":527},[524,2941,2942],{"class":530},"// test/integration/crud-d1.test.ts\n",[524,2944,2945,2947,2949,2951,2953,2955,2957,2959,2961,2963,2965,2967,2969,2971],{"class":526,"line":534},[524,2946,656],{"class":655},[524,2948,660],{"class":659},[524,2950,664],{"class":663},[524,2952,667],{"class":659},[524,2954,670],{"class":663},[524,2956,667],{"class":659},[524,2958,675],{"class":663},[524,2960,667],{"class":659},[524,2962,1501],{"class":663},[524,2964,678],{"class":659},[524,2966,681],{"class":655},[524,2968,684],{"class":659},[524,2970,687],{"class":541},[524,2972,690],{"class":659},[524,2974,2975,2977,2979,2982,2984,2986,2988,2991],{"class":526,"line":548},[524,2976,656],{"class":655},[524,2978,660],{"class":659},[524,2980,2981],{"class":663}," env",[524,2983,678],{"class":659},[524,2985,681],{"class":655},[524,2987,684],{"class":659},[524,2989,2990],{"class":541},"cloudflare:test",[524,2992,690],{"class":659},[524,2994,2995,2997,2999,3002,3004,3007,3009,3011,3013,3016],{"class":526,"line":555},[524,2996,656],{"class":655},[524,2998,660],{"class":659},[524,3000,3001],{"class":663}," setupTestD1Database",[524,3003,667],{"class":659},[524,3005,3006],{"class":663}," seedD1Database",[524,3008,678],{"class":659},[524,3010,681],{"class":655},[524,3012,684],{"class":659},[524,3014,3015],{"class":541},"../helpers/setup-d1",[524,3017,690],{"class":659},[524,3019,3020,3022,3024,3026,3028,3030,3032,3034],{"class":526,"line":561},[524,3021,656],{"class":655},[524,3023,1553],{"class":659},[524,3025,1556],{"class":655},[524,3027,1559],{"class":663},[524,3029,1562],{"class":655},[524,3031,684],{"class":659},[524,3033,1567],{"class":541},[524,3035,690],{"class":659},[524,3037,3038],{"class":526,"line":571},[524,3039,552],{"emptyLinePlaceholder":551},[524,3041,3042,3044,3046,3048,3051,3053,3055,3057,3059],{"class":526,"line":576},[524,3043,870],{"class":759},[524,3045,762],{"class":663},[524,3047,765],{"class":659},[524,3049,3050],{"class":541},"CRUD Operations with D1",[524,3052,765],{"class":659},[524,3054,667],{"class":659},[524,3056,884],{"class":659},[524,3058,887],{"class":749},[524,3060,775],{"class":659},[524,3062,3063,3065,3067,3069],{"class":526,"line":582},[524,3064,1599],{"class":749},[524,3066,1602],{"class":663},[524,3068,784],{"class":659},[524,3070,1607],{"class":537},[524,3072,3073,3075,3078,3080],{"class":526,"line":598},[524,3074,1599],{"class":749},[524,3076,3077],{"class":663}," d1",[524,3079,784],{"class":659},[524,3081,3082],{"class":537}," D1Database\n",[524,3084,3085],{"class":526,"line":603},[524,3086,552],{"emptyLinePlaceholder":551},[524,3088,3089,3091,3093,3095,3097,3099],{"class":526,"line":609},[524,3090,1638],{"class":759},[524,3092,762],{"class":780},[524,3094,1643],{"class":749},[524,3096,884],{"class":659},[524,3098,887],{"class":749},[524,3100,775],{"class":659},[524,3102,3103,3105,3107,3109,3111,3113,3115,3118,3120,3123,3125,3127],{"class":526,"line":867},[524,3104,918],{"class":749},[524,3106,1656],{"class":663},[524,3108,924],{"class":659},[524,3110,1661],{"class":655},[524,3112,3001],{"class":759},[524,3114,762],{"class":780},[524,3116,3117],{"class":663},"env",[524,3119,801],{"class":659},[524,3121,3122],{"class":663},"DB",[524,3124,667],{"class":659},[524,3126,1719],{"class":663},[524,3128,853],{"class":780},[524,3130,3131,3133,3135,3137,3139],{"class":526,"line":892},[524,3132,1675],{"class":663},[524,3134,924],{"class":659},[524,3136,1656],{"class":663},[524,3138,801],{"class":659},[524,3140,1684],{"class":663},[524,3142,3143,3146,3148,3150,3152],{"class":526,"line":915},[524,3144,3145],{"class":663},"    d1",[524,3147,924],{"class":659},[524,3149,1656],{"class":663},[524,3151,801],{"class":659},[524,3153,3154],{"class":663},"d1\n",[524,3156,3157],{"class":526,"line":944},[524,3158,552],{"emptyLinePlaceholder":551},[524,3160,3161,3163,3165,3167,3169,3171,3173],{"class":526,"line":968},[524,3162,1416],{"class":655},[524,3164,3006],{"class":759},[524,3166,762],{"class":780},[524,3168,1714],{"class":663},[524,3170,667],{"class":659},[524,3172,1719],{"class":663},[524,3174,853],{"class":780},[524,3176,3177,3179],{"class":526,"line":973},[524,3178,997],{"class":659},[524,3180,853],{"class":780},[524,3182,3183],{"class":526,"line":994},[524,3184,552],{"emptyLinePlaceholder":551},[524,3186,3187,3189,3191,3193,3196,3198,3200,3202,3204,3206],{"class":526,"line":1002},[524,3188,895],{"class":759},[524,3190,762],{"class":780},[524,3192,765],{"class":659},[524,3194,3195],{"class":541},"should list posts from D1",[524,3197,765],{"class":659},[524,3199,667],{"class":659},[524,3201,1242],{"class":749},[524,3203,884],{"class":659},[524,3205,887],{"class":749},[524,3207,775],{"class":659},[524,3209,3210,3212,3214,3216,3218,3220],{"class":526,"line":1007},[524,3211,918],{"class":749},[524,3213,1336],{"class":663},[524,3215,924],{"class":659},[524,3217,1183],{"class":759},[524,3219,762],{"class":780},[524,3221,1345],{"class":659},[524,3223,3224,3226],{"class":526,"line":1029},[524,3225,1825],{"class":663},[524,3227,810],{"class":659},[524,3229,3230,3232,3234,3236],{"class":526,"line":1060},[524,3231,1832],{"class":780},[524,3233,784],{"class":659},[524,3235,1719],{"class":663},[524,3237,810],{"class":659},[524,3239,3240,3242,3244,3246,3248,3250],{"class":526,"line":1081},[524,3241,1844],{"class":780},[524,3243,784],{"class":659},[524,3245,684],{"class":659},[524,3247,1851],{"class":541},[524,3249,765],{"class":659},[524,3251,810],{"class":659},[524,3253,3254,3256,3258,3260,3262],{"class":526,"line":1086},[524,3255,1391],{"class":780},[524,3257,784],{"class":659},[524,3259,684],{"class":659},[524,3261,1398],{"class":541},[524,3263,690],{"class":659},[524,3265,3266,3268],{"class":526,"line":1103},[524,3267,1405],{"class":659},[524,3269,853],{"class":780},[524,3271,3272],{"class":526,"line":1110},[524,3273,552],{"emptyLinePlaceholder":551},[524,3275,3276,3278,3280,3282,3284,3286,3288,3290],{"class":526,"line":1841},[524,3277,918],{"class":749},[524,3279,949],{"class":663},[524,3281,924],{"class":659},[524,3283,1661],{"class":655},[524,3285,1907],{"class":759},[524,3287,762],{"class":780},[524,3289,1428],{"class":663},[524,3291,853],{"class":780},[524,3293,3294],{"class":526,"line":1858},[524,3295,552],{"emptyLinePlaceholder":551},[524,3297,3298,3300,3302,3304,3306,3308,3310,3312,3314],{"class":526,"line":1873},[524,3299,976],{"class":759},[524,3301,762],{"class":780},[524,3303,981],{"class":663},[524,3305,801],{"class":659},[524,3307,1932],{"class":663},[524,3309,798],{"class":780},[524,3311,801],{"class":659},[524,3313,1939],{"class":759},[524,3315,991],{"class":780},[524,3317,3318,3320,3322,3324,3326,3328,3330,3332,3334,3336,3338,3340,3342],{"class":526,"line":1884},[524,3319,976],{"class":759},[524,3321,762],{"class":780},[524,3323,981],{"class":663},[524,3325,801],{"class":659},[524,3327,1932],{"class":663},[524,3329,801],{"class":659},[524,3331,1959],{"class":663},[524,3333,798],{"class":780},[524,3335,801],{"class":659},[524,3337,1966],{"class":759},[524,3339,762],{"class":780},[524,3341,1971],{"class":1052},[524,3343,853],{"class":780},[524,3345,3346,3348],{"class":526,"line":1891},[524,3347,997],{"class":659},[524,3349,853],{"class":780},[524,3351,3352,3354],{"class":526,"line":1896},[524,3353,858],{"class":659},[524,3355,853],{"class":663},[459,3357,509],{"id":3358},"test-helpers",[635,3360,3362],{"id":3361},"database-setup-sqlite","Database Setup (SQLite)",[514,3364,3366],{"className":641,"code":3365,"language":643,"meta":519,"style":519},"// test/helpers/setup.ts\nimport Database from 'better-sqlite3'\nimport { drizzle } from 'drizzle-orm/better-sqlite3'\n\nexport async function setupTestDatabase(schema: any) {\n  const sqlite = new Database(':memory:')\n  const db = drizzle(sqlite, { schema })\n  return { db, sqlite }\n}\n\nexport async function seedDatabase(db: any, schema: any) {\n  const users = await db.insert(schema.users).values([\n    { email: 'admin@test.com', name: 'Admin', role: 'admin' },\n    { email: 'user@test.com', name: 'User', role: 'user' }\n  ]).returning()\n\n  const posts = await db.insert(schema.posts).values([\n    { title: 'Post 1', content: 'Content 1', userId: users[0].id }\n  ]).returning()\n\n  return { users, posts }\n}\n\nexport async function cleanDatabase(db: any, schema: any) {\n  await db.delete(schema.posts)\n  await db.delete(schema.users)\n}\n",[521,3367,3368,3373,3389,3409,3413,3439,3465,3491,3506,3511,3515,3545,3582,3626,3668,3680,3684,3717,3768,3778,3782,3796,3800,3804,3834,3855,3875],{"__ignoreMap":519},[524,3369,3370],{"class":526,"line":527},[524,3371,3372],{"class":530},"// test/helpers/setup.ts\n",[524,3374,3375,3377,3380,3382,3384,3387],{"class":526,"line":534},[524,3376,656],{"class":655},[524,3378,3379],{"class":663}," Database ",[524,3381,1562],{"class":655},[524,3383,684],{"class":659},[524,3385,3386],{"class":541},"better-sqlite3",[524,3388,690],{"class":659},[524,3390,3391,3393,3395,3398,3400,3402,3404,3407],{"class":526,"line":548},[524,3392,656],{"class":655},[524,3394,660],{"class":659},[524,3396,3397],{"class":663}," drizzle",[524,3399,678],{"class":659},[524,3401,681],{"class":655},[524,3403,684],{"class":659},[524,3405,3406],{"class":541},"drizzle-orm/better-sqlite3",[524,3408,690],{"class":659},[524,3410,3411],{"class":526,"line":555},[524,3412,552],{"emptyLinePlaceholder":551},[524,3414,3415,3417,3419,3422,3424,3426,3430,3432,3435,3437],{"class":526,"line":561},[524,3416,2831],{"class":655},[524,3418,1242],{"class":749},[524,3420,3421],{"class":749}," function",[524,3423,1525],{"class":759},[524,3425,762],{"class":659},[524,3427,3429],{"class":3428},"sHdIc","schema",[524,3431,784],{"class":659},[524,3433,3434],{"class":537}," any",[524,3436,798],{"class":659},[524,3438,775],{"class":659},[524,3440,3441,3444,3446,3448,3451,3454,3456,3458,3461,3463],{"class":526,"line":571},[524,3442,3443],{"class":749},"  const",[524,3445,1614],{"class":663},[524,3447,924],{"class":659},[524,3449,3450],{"class":659}," new",[524,3452,3453],{"class":759}," Database",[524,3455,762],{"class":780},[524,3457,765],{"class":659},[524,3459,3460],{"class":541},":memory:",[524,3462,765],{"class":659},[524,3464,853],{"class":780},[524,3466,3467,3469,3471,3473,3475,3477,3480,3482,3484,3487,3489],{"class":526,"line":576},[524,3468,3443],{"class":749},[524,3470,1602],{"class":663},[524,3472,924],{"class":659},[524,3474,3397],{"class":759},[524,3476,762],{"class":780},[524,3478,3479],{"class":663},"sqlite",[524,3481,667],{"class":659},[524,3483,660],{"class":659},[524,3485,3486],{"class":663}," schema",[524,3488,678],{"class":659},[524,3490,853],{"class":780},[524,3492,3493,3496,3498,3500,3502,3504],{"class":526,"line":582},[524,3494,3495],{"class":655},"  return",[524,3497,660],{"class":659},[524,3499,1602],{"class":663},[524,3501,667],{"class":659},[524,3503,1614],{"class":663},[524,3505,941],{"class":659},[524,3507,3508],{"class":526,"line":598},[524,3509,3510],{"class":659},"}\n",[524,3512,3513],{"class":526,"line":603},[524,3514,552],{"emptyLinePlaceholder":551},[524,3516,3517,3519,3521,3523,3525,3527,3529,3531,3533,3535,3537,3539,3541,3543],{"class":526,"line":609},[524,3518,2831],{"class":655},[524,3520,1242],{"class":749},[524,3522,3421],{"class":749},[524,3524,1530],{"class":759},[524,3526,762],{"class":659},[524,3528,1714],{"class":3428},[524,3530,784],{"class":659},[524,3532,3434],{"class":537},[524,3534,667],{"class":659},[524,3536,3486],{"class":3428},[524,3538,784],{"class":659},[524,3540,3434],{"class":537},[524,3542,798],{"class":659},[524,3544,775],{"class":659},[524,3546,3547,3549,3552,3554,3556,3558,3560,3563,3565,3567,3569,3572,3574,3576,3579],{"class":526,"line":867},[524,3548,3443],{"class":749},[524,3550,3551],{"class":663}," users",[524,3553,924],{"class":659},[524,3555,1661],{"class":655},[524,3557,1602],{"class":663},[524,3559,801],{"class":659},[524,3561,3562],{"class":759},"insert",[524,3564,762],{"class":780},[524,3566,3429],{"class":663},[524,3568,801],{"class":659},[524,3570,3571],{"class":663},"users",[524,3573,798],{"class":780},[524,3575,801],{"class":659},[524,3577,3578],{"class":759},"values",[524,3580,3581],{"class":780},"([\n",[524,3583,3584,3587,3590,3592,3594,3597,3599,3601,3603,3605,3607,3609,3611,3613,3616,3618,3620,3622,3624],{"class":526,"line":892},[524,3585,3586],{"class":659},"    {",[524,3588,3589],{"class":780}," email",[524,3591,784],{"class":659},[524,3593,684],{"class":659},[524,3595,3596],{"class":541},"admin@test.com",[524,3598,765],{"class":659},[524,3600,667],{"class":659},[524,3602,929],{"class":780},[524,3604,784],{"class":659},[524,3606,684],{"class":659},[524,3608,87],{"class":541},[524,3610,765],{"class":659},[524,3612,667],{"class":659},[524,3614,3615],{"class":780}," role",[524,3617,784],{"class":659},[524,3619,684],{"class":659},[524,3621,1292],{"class":541},[524,3623,765],{"class":659},[524,3625,2321],{"class":659},[524,3627,3628,3630,3632,3634,3636,3639,3641,3643,3645,3647,3649,3652,3654,3656,3658,3660,3662,3664,3666],{"class":526,"line":915},[524,3629,3586],{"class":659},[524,3631,3589],{"class":780},[524,3633,784],{"class":659},[524,3635,684],{"class":659},[524,3637,3638],{"class":541},"user@test.com",[524,3640,765],{"class":659},[524,3642,667],{"class":659},[524,3644,929],{"class":780},[524,3646,784],{"class":659},[524,3648,684],{"class":659},[524,3650,3651],{"class":541},"User",[524,3653,765],{"class":659},[524,3655,667],{"class":659},[524,3657,3615],{"class":780},[524,3659,784],{"class":659},[524,3661,684],{"class":659},[524,3663,1283],{"class":541},[524,3665,765],{"class":659},[524,3667,941],{"class":659},[524,3669,3670,3673,3675,3678],{"class":526,"line":944},[524,3671,3672],{"class":780},"  ])",[524,3674,801],{"class":659},[524,3676,3677],{"class":759},"returning",[524,3679,991],{"class":780},[524,3681,3682],{"class":526,"line":968},[524,3683,552],{"emptyLinePlaceholder":551},[524,3685,3686,3688,3691,3693,3695,3697,3699,3701,3703,3705,3707,3709,3711,3713,3715],{"class":526,"line":973},[524,3687,3443],{"class":749},[524,3689,3690],{"class":663}," posts",[524,3692,924],{"class":659},[524,3694,1661],{"class":655},[524,3696,1602],{"class":663},[524,3698,801],{"class":659},[524,3700,3562],{"class":759},[524,3702,762],{"class":780},[524,3704,3429],{"class":663},[524,3706,801],{"class":659},[524,3708,1851],{"class":663},[524,3710,798],{"class":780},[524,3712,801],{"class":659},[524,3714,3578],{"class":759},[524,3716,3581],{"class":780},[524,3718,3719,3721,3723,3725,3727,3730,3732,3734,3737,3739,3741,3744,3746,3748,3751,3753,3755,3758,3760,3762,3764,3766],{"class":526,"line":994},[524,3720,3586],{"class":659},[524,3722,2587],{"class":780},[524,3724,784],{"class":659},[524,3726,684],{"class":659},[524,3728,3729],{"class":541},"Post 1",[524,3731,765],{"class":659},[524,3733,667],{"class":659},[524,3735,3736],{"class":780}," content",[524,3738,784],{"class":659},[524,3740,684],{"class":659},[524,3742,3743],{"class":541},"Content 1",[524,3745,765],{"class":659},[524,3747,667],{"class":659},[524,3749,3750],{"class":780}," userId",[524,3752,784],{"class":659},[524,3754,3551],{"class":663},[524,3756,3757],{"class":780},"[",[524,3759,1971],{"class":1052},[524,3761,1384],{"class":780},[524,3763,801],{"class":659},[524,3765,793],{"class":663},[524,3767,941],{"class":659},[524,3769,3770,3772,3774,3776],{"class":526,"line":1002},[524,3771,3672],{"class":780},[524,3773,801],{"class":659},[524,3775,3677],{"class":759},[524,3777,991],{"class":780},[524,3779,3780],{"class":526,"line":1007},[524,3781,552],{"emptyLinePlaceholder":551},[524,3783,3784,3786,3788,3790,3792,3794],{"class":526,"line":1029},[524,3785,3495],{"class":655},[524,3787,660],{"class":659},[524,3789,3551],{"class":663},[524,3791,667],{"class":659},[524,3793,3690],{"class":663},[524,3795,941],{"class":659},[524,3797,3798],{"class":526,"line":1060},[524,3799,3510],{"class":659},[524,3801,3802],{"class":526,"line":1081},[524,3803,552],{"emptyLinePlaceholder":551},[524,3805,3806,3808,3810,3812,3814,3816,3818,3820,3822,3824,3826,3828,3830,3832],{"class":526,"line":1086},[524,3807,2831],{"class":655},[524,3809,1242],{"class":749},[524,3811,3421],{"class":749},[524,3813,1535],{"class":759},[524,3815,762],{"class":659},[524,3817,1714],{"class":3428},[524,3819,784],{"class":659},[524,3821,3434],{"class":537},[524,3823,667],{"class":659},[524,3825,3486],{"class":3428},[524,3827,784],{"class":659},[524,3829,3434],{"class":537},[524,3831,798],{"class":659},[524,3833,775],{"class":659},[524,3835,3836,3838,3840,3842,3845,3847,3849,3851,3853],{"class":526,"line":1103},[524,3837,2110],{"class":655},[524,3839,1602],{"class":663},[524,3841,801],{"class":659},[524,3843,3844],{"class":759},"delete",[524,3846,762],{"class":780},[524,3848,3429],{"class":663},[524,3850,801],{"class":659},[524,3852,1851],{"class":663},[524,3854,853],{"class":780},[524,3856,3857,3859,3861,3863,3865,3867,3869,3871,3873],{"class":526,"line":1110},[524,3858,2110],{"class":655},[524,3860,1602],{"class":663},[524,3862,801],{"class":659},[524,3864,3844],{"class":759},[524,3866,762],{"class":780},[524,3868,3429],{"class":663},[524,3870,801],{"class":659},[524,3872,3571],{"class":663},[524,3874,853],{"class":780},[524,3876,3877],{"class":526,"line":1841},[524,3878,3510],{"class":659},[635,3880,3882],{"id":3881},"mock-factories","Mock Factories",[514,3884,3886],{"className":641,"code":3885,"language":643,"meta":519,"style":519},"// test/helpers/mocks.ts\nexport function createMockContext(overrides = {}) {\n  return {\n    db: null,\n    schema: {},\n    user: null,\n    permissions: [],\n    params: {},\n    query: {},\n    validated: {},\n    event: createMockH3Event(),\n    resource: 'posts',\n    operation: 'list',\n    ...overrides\n  }\n}\n\nexport function createMockUser(role = 'user', overrides = {}) {\n  return {\n    id: 1,\n    email: 'test@example.com',\n    name: 'Test User',\n    role,\n    permissions: getRolePermissions(role),\n    ...overrides\n  }\n}\n",[521,3887,3888,3893,3913,3919,3928,3938,3947,3959,3968,3977,3986,4000,4015,4030,4038,4042,4046,4050,4082,4088,4100,4116,4132,4139,4156,4162,4166],{"__ignoreMap":519},[524,3889,3890],{"class":526,"line":527},[524,3891,3892],{"class":530},"// test/helpers/mocks.ts\n",[524,3894,3895,3897,3899,3901,3903,3906,3908,3911],{"class":526,"line":534},[524,3896,2831],{"class":655},[524,3898,3421],{"class":749},[524,3900,1183],{"class":759},[524,3902,762],{"class":659},[524,3904,3905],{"class":3428},"overrides",[524,3907,924],{"class":659},[524,3909,3910],{"class":659}," {})",[524,3912,775],{"class":659},[524,3914,3915,3917],{"class":526,"line":548},[524,3916,3495],{"class":655},[524,3918,775],{"class":659},[524,3920,3921,3923,3925],{"class":526,"line":555},[524,3922,1675],{"class":780},[524,3924,784],{"class":659},[524,3926,3927],{"class":659}," null,\n",[524,3929,3930,3933,3935],{"class":526,"line":561},[524,3931,3932],{"class":780},"    schema",[524,3934,784],{"class":659},[524,3936,3937],{"class":659}," {},\n",[524,3939,3940,3943,3945],{"class":526,"line":571},[524,3941,3942],{"class":780},"    user",[524,3944,784],{"class":659},[524,3946,3927],{"class":659},[524,3948,3949,3952,3954,3957],{"class":526,"line":576},[524,3950,3951],{"class":780},"    permissions",[524,3953,784],{"class":659},[524,3955,3956],{"class":780}," []",[524,3958,810],{"class":659},[524,3960,3961,3964,3966],{"class":526,"line":582},[524,3962,3963],{"class":780},"    params",[524,3965,784],{"class":659},[524,3967,3937],{"class":659},[524,3969,3970,3973,3975],{"class":526,"line":598},[524,3971,3972],{"class":780},"    query",[524,3974,784],{"class":659},[524,3976,3937],{"class":659},[524,3978,3979,3982,3984],{"class":526,"line":603},[524,3980,3981],{"class":780},"    validated",[524,3983,784],{"class":659},[524,3985,3937],{"class":659},[524,3987,3988,3991,3993,3996,3998],{"class":526,"line":609},[524,3989,3990],{"class":780},"    event",[524,3992,784],{"class":659},[524,3994,3995],{"class":759}," createMockH3Event",[524,3997,807],{"class":780},[524,3999,810],{"class":659},[524,4001,4002,4005,4007,4009,4011,4013],{"class":526,"line":867},[524,4003,4004],{"class":780},"    resource",[524,4006,784],{"class":659},[524,4008,684],{"class":659},[524,4010,1851],{"class":541},[524,4012,765],{"class":659},[524,4014,810],{"class":659},[524,4016,4017,4020,4022,4024,4026,4028],{"class":526,"line":892},[524,4018,4019],{"class":780},"    operation",[524,4021,784],{"class":659},[524,4023,684],{"class":659},[524,4025,1398],{"class":541},[524,4027,765],{"class":659},[524,4029,810],{"class":659},[524,4031,4032,4035],{"class":526,"line":915},[524,4033,4034],{"class":659},"    ...",[524,4036,4037],{"class":663},"overrides\n",[524,4039,4040],{"class":526,"line":944},[524,4041,2922],{"class":659},[524,4043,4044],{"class":526,"line":968},[524,4045,3510],{"class":659},[524,4047,4048],{"class":526,"line":973},[524,4049,552],{"emptyLinePlaceholder":551},[524,4051,4052,4054,4056,4058,4060,4063,4065,4067,4069,4071,4073,4076,4078,4080],{"class":526,"line":994},[524,4053,2831],{"class":655},[524,4055,3421],{"class":749},[524,4057,1188],{"class":759},[524,4059,762],{"class":659},[524,4061,4062],{"class":3428},"role",[524,4064,924],{"class":659},[524,4066,684],{"class":659},[524,4068,1283],{"class":541},[524,4070,765],{"class":659},[524,4072,667],{"class":659},[524,4074,4075],{"class":3428}," overrides",[524,4077,924],{"class":659},[524,4079,3910],{"class":659},[524,4081,775],{"class":659},[524,4083,4084,4086],{"class":526,"line":1002},[524,4085,3495],{"class":655},[524,4087,775],{"class":659},[524,4089,4090,4093,4095,4098],{"class":526,"line":1007},[524,4091,4092],{"class":780},"    id",[524,4094,784],{"class":659},[524,4096,4097],{"class":1052}," 1",[524,4099,810],{"class":659},[524,4101,4102,4105,4107,4109,4112,4114],{"class":526,"line":1029},[524,4103,4104],{"class":780},"    email",[524,4106,784],{"class":659},[524,4108,684],{"class":659},[524,4110,4111],{"class":541},"test@example.com",[524,4113,765],{"class":659},[524,4115,810],{"class":659},[524,4117,4118,4121,4123,4125,4128,4130],{"class":526,"line":1060},[524,4119,4120],{"class":780},"    name",[524,4122,784],{"class":659},[524,4124,684],{"class":659},[524,4126,4127],{"class":541},"Test User",[524,4129,765],{"class":659},[524,4131,810],{"class":659},[524,4133,4134,4137],{"class":526,"line":1081},[524,4135,4136],{"class":663},"    role",[524,4138,810],{"class":659},[524,4140,4141,4143,4145,4148,4150,4152,4154],{"class":526,"line":1086},[524,4142,3951],{"class":780},[524,4144,784],{"class":659},[524,4146,4147],{"class":759}," getRolePermissions",[524,4149,762],{"class":780},[524,4151,4062],{"class":663},[524,4153,798],{"class":780},[524,4155,810],{"class":659},[524,4157,4158,4160],{"class":526,"line":1103},[524,4159,4034],{"class":659},[524,4161,4037],{"class":663},[524,4163,4164],{"class":526,"line":1110},[524,4165,2922],{"class":659},[524,4167,4168],{"class":526,"line":1841},[524,4169,3510],{"class":659},[635,4171,4173],{"id":4172},"data-factories","Data Factories",[514,4175,4177],{"className":641,"code":4176,"language":643,"meta":519,"style":519},"// test/helpers/factories.ts\nexport const UserFactory = {\n  build: (overrides = {}) => ({\n    email: `test${Date.now()}@example.com`,\n    name: 'Test User',\n    role: 'user',\n    ...overrides\n  }),\n\n  create: async (db, schema, overrides = {}) => {\n    const [user] = await db.insert(schema.users)\n      .values(UserFactory.build(overrides))\n      .returning()\n    return user\n  }\n}\n",[521,4178,4179,4184,4198,4220,4252,4266,4280,4286,4294,4298,4327,4357,4380,4388,4396,4400],{"__ignoreMap":519},[524,4180,4181],{"class":526,"line":527},[524,4182,4183],{"class":530},"// test/helpers/factories.ts\n",[524,4185,4186,4188,4191,4194,4196],{"class":526,"line":534},[524,4187,2831],{"class":655},[524,4189,4190],{"class":749}," const",[524,4192,4193],{"class":663}," UserFactory ",[524,4195,756],{"class":659},[524,4197,775],{"class":659},[524,4199,4200,4203,4205,4208,4210,4212,4214,4216,4218],{"class":526,"line":548},[524,4201,4202],{"class":759},"  build",[524,4204,784],{"class":659},[524,4206,4207],{"class":659}," (",[524,4209,3905],{"class":3428},[524,4211,924],{"class":659},[524,4213,3910],{"class":659},[524,4215,887],{"class":749},[524,4217,4207],{"class":663},[524,4219,1345],{"class":659},[524,4221,4222,4224,4226,4229,4231,4233,4236,4238,4241,4243,4245,4248,4250],{"class":526,"line":555},[524,4223,4104],{"class":780},[524,4225,784],{"class":659},[524,4227,4228],{"class":659}," `",[524,4230,768],{"class":541},[524,4232,2460],{"class":659},[524,4234,4235],{"class":663},"Date",[524,4237,801],{"class":659},[524,4239,4240],{"class":759},"now",[524,4242,807],{"class":663},[524,4244,858],{"class":659},[524,4246,4247],{"class":541},"@example.com",[524,4249,2454],{"class":659},[524,4251,810],{"class":659},[524,4253,4254,4256,4258,4260,4262,4264],{"class":526,"line":561},[524,4255,4120],{"class":780},[524,4257,784],{"class":659},[524,4259,684],{"class":659},[524,4261,4127],{"class":541},[524,4263,765],{"class":659},[524,4265,810],{"class":659},[524,4267,4268,4270,4272,4274,4276,4278],{"class":526,"line":571},[524,4269,4136],{"class":780},[524,4271,784],{"class":659},[524,4273,684],{"class":659},[524,4275,1283],{"class":541},[524,4277,765],{"class":659},[524,4279,810],{"class":659},[524,4281,4282,4284],{"class":526,"line":576},[524,4283,4034],{"class":659},[524,4285,4037],{"class":663},[524,4287,4288,4290,4292],{"class":526,"line":582},[524,4289,997],{"class":659},[524,4291,798],{"class":663},[524,4293,810],{"class":659},[524,4295,4296],{"class":526,"line":598},[524,4297,552],{"emptyLinePlaceholder":551},[524,4299,4300,4303,4305,4307,4309,4311,4313,4315,4317,4319,4321,4323,4325],{"class":526,"line":603},[524,4301,4302],{"class":759},"  create",[524,4304,784],{"class":659},[524,4306,1242],{"class":749},[524,4308,4207],{"class":659},[524,4310,1714],{"class":3428},[524,4312,667],{"class":659},[524,4314,3486],{"class":3428},[524,4316,667],{"class":659},[524,4318,4075],{"class":3428},[524,4320,924],{"class":659},[524,4322,3910],{"class":659},[524,4324,887],{"class":749},[524,4326,775],{"class":659},[524,4328,4329,4331,4333,4335,4337,4339,4341,4343,4345,4347,4349,4351,4353,4355],{"class":526,"line":609},[524,4330,918],{"class":749},[524,4332,1278],{"class":659},[524,4334,1283],{"class":663},[524,4336,1384],{"class":659},[524,4338,924],{"class":659},[524,4340,1661],{"class":655},[524,4342,1602],{"class":663},[524,4344,801],{"class":659},[524,4346,3562],{"class":759},[524,4348,762],{"class":780},[524,4350,3429],{"class":663},[524,4352,801],{"class":659},[524,4354,3571],{"class":663},[524,4356,853],{"class":780},[524,4358,4359,4362,4364,4366,4369,4371,4374,4376,4378],{"class":526,"line":867},[524,4360,4361],{"class":659},"      .",[524,4363,3578],{"class":759},[524,4365,762],{"class":780},[524,4367,4368],{"class":663},"UserFactory",[524,4370,801],{"class":659},[524,4372,4373],{"class":759},"build",[524,4375,762],{"class":780},[524,4377,3905],{"class":663},[524,4379,2160],{"class":780},[524,4381,4382,4384,4386],{"class":526,"line":892},[524,4383,4361],{"class":659},[524,4385,3677],{"class":759},[524,4387,991],{"class":780},[524,4389,4390,4393],{"class":526,"line":915},[524,4391,4392],{"class":655},"    return",[524,4394,4395],{"class":663}," user\n",[524,4397,4398],{"class":526,"line":944},[524,4399,2922],{"class":659},[524,4401,4402],{"class":526,"line":968},[524,4403,3510],{"class":659},[459,4405,4407],{"id":4406},"best-practices","Best Practices",[4409,4410,4411,4418,4424,4430,4436,4442,4448,4454],"ol",{},[467,4412,4413,4417],{},[4414,4415,4416],"strong",{},"Use in-memory database for unit/integration tests"," - Fast and isolated",[467,4419,4420,4423],{},[4414,4421,4422],{},"Clean database between tests"," - Prevents test pollution",[467,4425,4426,4429],{},[4414,4427,4428],{},"Use factories for test data"," - Reduces coupling and duplication",[467,4431,4432,4435],{},[4414,4433,4434],{},"Test happy path and error cases"," - Comprehensive coverage",[467,4437,4438,4441],{},[4414,4439,4440],{},"Mock external dependencies"," - Keep tests fast and deterministic",[467,4443,4444,4447],{},[4414,4445,4446],{},"Use descriptive test names"," - Clear documentation of behavior",[467,4449,4450,4453],{},[4414,4451,4452],{},"Group related tests"," - Organize with describe blocks",[467,4455,4456,4459],{},[4414,4457,4458],{},"Keep tests focused"," - One concept per test",[459,4461,4463],{"id":4462},"coverage-goals","Coverage Goals",[464,4465,4466,4471,4476],{},[467,4467,4468,4470],{},[4414,4469,485],{},": 80%+ coverage",[467,4472,4473,4475],{},[4414,4474,491],{},": All major flows covered",[467,4477,4478,4480],{},[4414,4479,497],{},": Critical user journeys covered",[455,4482,4483],{},"Run coverage report:",[514,4485,4487],{"className":516,"code":4486,"language":518,"meta":519,"style":519},"npm run test -- --coverage\n",[521,4488,4489],{"__ignoreMap":519},[524,4490,4491,4493,4495,4497,4499],{"class":526,"line":527},[524,4492,538],{"class":537},[524,4494,542],{"class":541},[524,4496,589],{"class":541},[524,4498,592],{"class":541},[524,4500,4501],{"class":541}," --coverage\n",[4503,4504,4505],"style",{},"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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":519,"searchDepth":534,"depth":534,"links":4507},[4508,4509,4510,4511,4515,4518,4519,4523,4528,4529],{"id":461,"depth":534,"text":462},{"id":512,"depth":534,"text":473},{"id":619,"depth":534,"text":479},{"id":630,"depth":534,"text":485,"children":4512},[4513,4514],{"id":637,"depth":548,"text":638},{"id":1117,"depth":548,"text":1118},{"id":1463,"depth":534,"text":491,"children":4516},[4517],{"id":1469,"depth":548,"text":1470},{"id":1990,"depth":534,"text":497},{"id":2785,"depth":534,"text":503,"children":4520},[4521,4522],{"id":2791,"depth":548,"text":2792},{"id":2931,"depth":548,"text":2932},{"id":3358,"depth":534,"text":509,"children":4524},[4525,4526,4527],{"id":3361,"depth":548,"text":3362},{"id":3881,"depth":548,"text":3882},{"id":4172,"depth":548,"text":4173},{"id":4406,"depth":534,"text":4407},{"id":4462,"depth":534,"text":4463},"md",null,{},{"title":271,"description":457},"sZMEExrps9GLljSjmK9v8hzlfiS62Jj3AJnNXWJFSTs",[4536,4538],{"title":267,"path":268,"stem":269,"description":4537,"children":-1},"Nuxt Auto API provides TanStack Query-powered composables for seamless data fetching, caching, and mutations on the frontend.",{"title":275,"path":276,"stem":277,"description":4539,"children":-1},"@websideproject/nuxt-auto-api supports both offset-based and cursor-based pagination.",1772977478111]