[{"data":1,"prerenderedAt":7063},["ShallowReactive",2],{"navigation_docs_en":3,"-en-reference-extensions-data-connectors-api":445,"-en-reference-extensions-data-connectors-api-surround":7058},[4,30,72,132,260,436],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fen\u002Fgetting-started","en\u002F1.getting-started",[10,15,20,25],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fen\u002Fgetting-started\u002Fintroduction","en\u002F1.getting-started\u002F2.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Quickstart","\u002Fen\u002Fgetting-started\u002Finstallation","en\u002F1.getting-started\u002F3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Use Cases","\u002Fen\u002Fgetting-started\u002Fuse-cases","en\u002F1.getting-started\u002F4.use-cases","i-lucide-layers",{"title":26,"path":27,"stem":28,"icon":29},"Concepts","\u002Fen\u002Fgetting-started\u002Fconcepts","en\u002F1.getting-started\u002F5.concepts","i-lucide-book",{"title":26,"path":31,"stem":32,"children":33,"page":6},"\u002Fen\u002Fconcepts","en\u002F2.concepts",[34,38,43,48,53,58,63,68],{"title":35,"path":36,"stem":37,"icon":14},"Organization","\u002Fen\u002Fconcepts\u002Forganization","en\u002F2.concepts\u002F1.organization",{"title":39,"path":40,"stem":41,"icon":42},"Data Model","\u002Fen\u002Fconcepts\u002Fdata-model","en\u002F2.concepts\u002F2.data-model","i-lucide-database",{"title":44,"path":45,"stem":46,"icon":47},"Access Control","\u002Fen\u002Fconcepts\u002Faccess-permissions","en\u002F2.concepts\u002F3.access-permissions","i-lucide-user-key",{"title":49,"path":50,"stem":51,"icon":52},"Audit Logs","\u002Fen\u002Fconcepts\u002Faudit-logs","en\u002F2.concepts\u002F4.audit-logs","i-lucide-scroll-text",{"title":54,"path":55,"stem":56,"icon":57},"Introspection","\u002Fen\u002Fconcepts\u002Fintrospection","en\u002F2.concepts\u002F6.introspection","i-lucide-database-search",{"title":59,"path":60,"stem":61,"icon":62},"Query Engine","\u002Fen\u002Fconcepts\u002Fquery-engine","en\u002F2.concepts\u002F7.query-engine","i-lucide-workflow",{"title":64,"path":65,"stem":66,"icon":67},"AI","\u002Fen\u002Fconcepts\u002Fai","en\u002F2.concepts\u002F8.ai","i-lucide-sparkles",{"title":69,"path":70,"stem":71,"icon":42},"Caching","\u002Fen\u002Fconcepts\u002Fcaching","en\u002F2.concepts\u002F9.caching",{"title":73,"path":74,"stem":75,"children":76,"page":6},"Guides","\u002Fen\u002Fguides","en\u002F4.guides",[77,82,87,92,97,102,107,112],{"title":78,"path":79,"stem":80,"icon":81},"REST API Quickstart","\u002Fen\u002Fguides\u002Frest-api","en\u002F4.guides\u002F1.rest-api","i-lucide-plug",{"title":83,"path":84,"stem":85,"icon":86},"SDK Quickstart","\u002Fen\u002Fguides\u002Fsdk","en\u002F4.guides\u002F2.sdk","i-lucide-terminal",{"title":88,"path":89,"stem":90,"icon":91},"Configure SSO","\u002Fen\u002Fguides\u002Fconfigure-sso","en\u002F4.guides\u002F3.configure-sso","i-lucide-key-round",{"title":93,"path":94,"stem":95,"icon":96},"Configure MCP","\u002Fen\u002Fguides\u002Fmcp","en\u002F4.guides\u002F4.mcp","i-lucide-brain-cog",{"title":98,"path":99,"stem":100,"icon":101},"Customize Content Space","\u002Fen\u002Fguides\u002Fcustomize-content-space","en\u002F4.guides\u002F5.customize-content-space","i-lucide-columns-3-cog",{"title":103,"path":104,"stem":105,"icon":106},"Build an Application with AI Assistance","\u002Fen\u002Fguides\u002Fbuild-an-application","en\u002F4.guides\u002F6.build-an-application","i-lucide-route",{"title":108,"path":109,"stem":110,"icon":111},"Horizontal Scaling","\u002Fen\u002Fguides\u002Fhorizontal-scaling","en\u002F4.guides\u002F7.horizontal-scaling","i-lucide-network",{"title":113,"icon":114,"path":115,"stem":116,"children":117,"page":6},"Data Connectors","i-lucide-cable","\u002Fen\u002Fguides\u002Fdata-connectors","en\u002F4.guides\u002F8.data-connectors",[118,122,127],{"title":16,"path":119,"stem":120,"icon":121},"\u002Fen\u002Fguides\u002Fdata-connectors\u002Fquickstart","en\u002F4.guides\u002F8.data-connectors\u002F1.quickstart","i-lucide-rocket",{"title":123,"path":124,"stem":125,"icon":126},"Build a Stripe Connector","\u002Fen\u002Fguides\u002Fdata-connectors\u002Fstripe","en\u002F4.guides\u002F8.data-connectors\u002F2.stripe","i-lucide-hammer",{"title":128,"path":129,"stem":130,"icon":131},"Build with AI Agents","\u002Fen\u002Fguides\u002Fdata-connectors\u002Fai-agents","en\u002F4.guides\u002F8.data-connectors\u002F3.ai-agents","i-lucide-bot",{"title":133,"path":134,"stem":135,"children":136,"page":6},"Developer","\u002Fen\u002Fdeveloper","en\u002F5.developer",[137,191,215,220],{"title":138,"path":139,"stem":140,"children":141,"page":6},"Data Access","\u002Fen\u002Fdeveloper\u002Fapi","en\u002F5.developer\u002F1.api",[142,147,152,157,162,167,172,177,182,186],{"title":143,"path":144,"stem":145,"icon":146},"Overview","\u002Fen\u002Fdeveloper\u002Fapi\u002Foverview","en\u002F5.developer\u002F1.api\u002F1.overview","i-lucide-globe",{"title":148,"path":149,"stem":150,"icon":151},"Errors","\u002Fen\u002Fdeveloper\u002Fapi\u002Ferrors","en\u002F5.developer\u002F1.api\u002F10.errors","i-lucide-alert-triangle",{"title":153,"path":154,"stem":155,"icon":156},"Authentication","\u002Fen\u002Fdeveloper\u002Fapi\u002Fauthentication","en\u002F5.developer\u002F1.api\u002F2.authentication","i-lucide-lock",{"title":158,"path":159,"stem":160,"icon":161},"Reading Data","\u002Fen\u002Fdeveloper\u002Fapi\u002Freading-data","en\u002F5.developer\u002F1.api\u002F3.reading-data","i-lucide-book-open",{"title":163,"path":164,"stem":165,"icon":166},"Writing Data","\u002Fen\u002Fdeveloper\u002Fapi\u002Fwriting-data","en\u002F5.developer\u002F1.api\u002F4.writing-data","i-lucide-pencil",{"title":168,"path":169,"stem":170,"icon":171},"Filtering","\u002Fen\u002Fdeveloper\u002Fapi\u002Ffiltering","en\u002F5.developer\u002F1.api\u002F5.filtering","i-lucide-filter",{"title":173,"path":174,"stem":175,"icon":176},"Field Selection","\u002Fen\u002Fdeveloper\u002Fapi\u002Ffield-selection","en\u002F5.developer\u002F1.api\u002F6.field-selection","i-lucide-list-checks",{"title":178,"path":179,"stem":180,"icon":181},"Sorting & Pagination","\u002Fen\u002Fdeveloper\u002Fapi\u002Fsorting-pagination","en\u002F5.developer\u002F1.api\u002F7.sorting-pagination","i-lucide-arrow-up-down",{"title":183,"path":184,"stem":185,"icon":111},"Relational Data","\u002Fen\u002Fdeveloper\u002Fapi\u002Frelational-data","en\u002F5.developer\u002F1.api\u002F8.relational-data",{"title":187,"path":188,"stem":189,"icon":190},"Files & Assets","\u002Fen\u002Fdeveloper\u002Fapi\u002Ffiles","en\u002F5.developer\u002F1.api\u002F9.files","i-lucide-file-up",{"title":192,"path":193,"stem":194,"children":195,"page":6},"Client SDK","\u002Fen\u002Fdeveloper\u002Fsdk","en\u002F5.developer\u002F2.sdk",[196,200,205,210],{"title":197,"path":198,"stem":199,"icon":19},"Installation","\u002Fen\u002Fdeveloper\u002Fsdk\u002Finstallation","en\u002F5.developer\u002F2.sdk\u002F1.installation",{"title":201,"path":202,"stem":203,"icon":204},"Client Setup","\u002Fen\u002Fdeveloper\u002Fsdk\u002Fclient-setup","en\u002F5.developer\u002F2.sdk\u002F2.client-setup","i-lucide-settings",{"title":206,"path":207,"stem":208,"icon":209},"Type System","\u002Fen\u002Fdeveloper\u002Fsdk\u002Ftype-system","en\u002F5.developer\u002F2.sdk\u002F3.type-system","i-lucide-braces",{"title":211,"path":212,"stem":213,"icon":214},"Advanced","\u002Fen\u002Fdeveloper\u002Fsdk\u002Fadvanced","en\u002F5.developer\u002F2.sdk\u002F5.advanced","i-lucide-puzzle",{"title":216,"path":217,"stem":218,"icon":219},"Application Users","\u002Fen\u002Fdeveloper\u002Fapplication-users","en\u002F5.developer\u002F3.application-users","i-lucide-users",{"title":221,"path":222,"stem":223,"children":224,"icon":214},"Extensions","\u002Fen\u002Fdeveloper\u002Fextensions","en\u002F5.developer\u002F3.extensions\u002Findex",[225,226,231],{"title":143,"path":222,"stem":223,"icon":214},{"title":227,"path":228,"stem":229,"icon":230},"Install and Manage Extensions","\u002Fen\u002Fdeveloper\u002Fextensions\u002Finstall","en\u002F5.developer\u002F3.extensions\u002F1.install","i-lucide-package-plus",{"title":113,"path":232,"stem":233,"children":234,"icon":114},"\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002Findex",[235,236,241,245,250,255],{"title":143,"path":232,"stem":233,"icon":114},{"title":237,"path":238,"stem":239,"icon":240},"How Data Connectors Run","\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fruntime","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002F2.runtime","i-lucide-cpu",{"title":242,"path":243,"stem":244,"icon":42},"Data Sources","\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fdata-sources","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002F3.data-sources",{"title":246,"path":247,"stem":248,"icon":249},"Map an External Data Source","\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fdata-source-mapping","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002F4.data-source-mapping","i-lucide-map",{"title":251,"path":252,"stem":253,"icon":254},"Handle Errors","\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Ferrors","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002F5.errors","i-lucide-shield-alert",{"title":256,"path":257,"stem":258,"icon":259},"Test a Data Connector","\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Ftesting","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002F6.testing","i-lucide-flask-conical",{"title":261,"path":262,"stem":263,"children":264,"page":6},"Reference","\u002Fen\u002Freference","en\u002F6.reference",[265,269,274,279,295,299,304,340,369,374],{"title":266,"path":267,"stem":268,"icon":204},"Configuration","\u002Fen\u002Freference\u002Fenvironment-variables","en\u002F6.reference\u002F1.environment-variables",{"title":270,"path":271,"stem":272,"icon":273},"System Requirements","\u002Fen\u002Freference\u002Fsystem-requirements","en\u002F6.reference\u002F2.system-requirements","i-lucide-server",{"title":275,"path":276,"stem":277,"icon":278},"Licensing","\u002Fen\u002Freference\u002Flicensing","en\u002F6.reference\u002F3.licensing","i-lucide-gem",{"title":280,"path":281,"stem":282,"children":283,"icon":81},"Connectors","\u002Fen\u002Freference\u002Fconnectors","en\u002F6.reference\u002F4.connectors\u002Findex",[284,285,290],{"title":280,"path":281,"stem":282,"icon":81},{"title":286,"path":287,"stem":288,"icon":289},"PostgreSQL and Supabase","\u002Fen\u002Freference\u002Fconnectors\u002Fpostgresql-supabase","en\u002F6.reference\u002F4.connectors\u002F1.postgresql-supabase","i-simple-icons-postgresql",{"title":291,"path":292,"stem":293,"icon":294},"MySQL and MariaDB","\u002Fen\u002Freference\u002Fconnectors\u002Fmysql-mariadb","en\u002F6.reference\u002F4.connectors\u002F2.mysql-mariadb","i-simple-icons-mysql",{"title":296,"path":297,"stem":298,"icon":209},"Data Types Representation","\u002Fen\u002Freference\u002Fdata-types","en\u002F6.reference\u002F5.data-types",{"title":300,"path":301,"stem":302,"icon":303},"Permissions Reference","\u002Fen\u002Freference\u002Fpermissions","en\u002F6.reference\u002F6.permissions","i-lucide-shield",{"title":305,"path":306,"stem":307,"children":308,"page":6},"API Reference","\u002Fen\u002Freference\u002Fapi-reference","en\u002F6.reference\u002F7.api-reference",[309,313,318],{"title":310,"path":311,"stem":312,"icon":273},"System Endpoints","\u002Fen\u002Freference\u002Fapi-reference\u002Fsystem-endpoints","en\u002F6.reference\u002F7.api-reference\u002F1.system-endpoints",{"title":314,"path":315,"stem":316,"icon":317},"OpenAPI Spec","\u002Fen\u002Freference\u002Fapi-reference\u002Fopenapi-spec","en\u002F6.reference\u002F7.api-reference\u002F2.openapi-spec","i-lucide-file-code",{"title":319,"path":320,"stem":321,"children":322,"icon":324},"Schema Migration","\u002Fen\u002Freference\u002Fapi-reference\u002Fschema-migration","en\u002F6.reference\u002F7.api-reference\u002F3.schema-migration\u002Findex",[323,325,330,335],{"title":319,"path":320,"stem":321,"icon":324},"i-lucide-database-zap",{"title":326,"path":327,"stem":328,"icon":329},"Apply Migrations","\u002Fen\u002Freference\u002Fapi-reference\u002Fschema-migration\u002Fapply-migrations","en\u002F6.reference\u002F7.api-reference\u002F3.schema-migration\u002F1.apply-migrations","i-lucide-upload",{"title":331,"path":332,"stem":333,"icon":334},"Import Changes","\u002Fen\u002Freference\u002Fapi-reference\u002Fschema-migration\u002Fimport-changes","en\u002F6.reference\u002F7.api-reference\u002F3.schema-migration\u002F2.import-changes","i-lucide-refresh-cw",{"title":336,"path":337,"stem":338,"icon":339},"Operation Reference","\u002Fen\u002Freference\u002Fapi-reference\u002Fschema-migration\u002Foperation-reference","en\u002F6.reference\u002F7.api-reference\u002F3.schema-migration\u002F3.operation-reference","i-lucide-list-tree",{"title":341,"path":342,"stem":343,"children":344,"page":6},"Design Considerations","\u002Fen\u002Freference\u002Fdesign-considerations","en\u002F6.reference\u002F8.design-considerations",[345,349,354,359,364],{"title":143,"path":346,"stem":347,"icon":348},"\u002Fen\u002Freference\u002Fdesign-considerations\u002Foverview","en\u002F6.reference\u002F8.design-considerations\u002F1.overview","i-lucide-compass",{"title":350,"path":351,"stem":352,"icon":353},"Instance Configuration","\u002Fen\u002Freference\u002Fdesign-considerations\u002Finstance-configuration-related-problems","en\u002F6.reference\u002F8.design-considerations\u002F3.instance-configuration-related-problems","i-lucide-wrench",{"title":355,"path":356,"stem":357,"icon":358},"Overly Permissive Public Access","\u002Fen\u002Freference\u002Fdesign-considerations\u002Foverly-permissive","en\u002F6.reference\u002F8.design-considerations\u002F4.overly-permissive","i-lucide-shield-off",{"title":360,"path":361,"stem":362,"icon":363},"No Aggregates","\u002Fen\u002Freference\u002Fdesign-considerations\u002Fno-aggregates","en\u002F6.reference\u002F8.design-considerations\u002F5.no-aggregates","i-lucide-sigma",{"title":365,"path":366,"stem":367,"icon":368},"Cross-Data-Source Referential Integrity","\u002Fen\u002Freference\u002Fdesign-considerations\u002Fcross-data-source-referential-integrity","en\u002F6.reference\u002F8.design-considerations\u002F6.cross-data-source-referential-integrity","i-lucide-unlink",{"title":370,"path":371,"stem":372,"icon":373},"CLI","\u002Fen\u002Freference\u002Fcli","en\u002F6.reference\u002F9.cli","i-lucide-square-terminal",{"title":221,"path":375,"stem":376,"children":377,"page":6},"\u002Fen\u002Freference\u002Fextensions","en\u002F6.reference\u002F9.extensions",[378,383,386,405],{"title":379,"path":380,"stem":381,"icon":382},"Extension Config and Manifest","\u002Fen\u002Freference\u002Fextensions\u002Fmanifest","en\u002F6.reference\u002F9.extensions\u002F1.manifest","i-lucide-file-json",{"title":370,"path":384,"stem":385,"icon":86},"\u002Fen\u002Freference\u002Fextensions\u002Fcli","en\u002F6.reference\u002F9.extensions\u002F2.cli",{"title":387,"path":388,"stem":389,"children":390,"page":6},"Extension Kit","\u002Fen\u002Freference\u002Fextensions\u002Fextension-kit","en\u002F6.reference\u002F9.extensions\u002F3.extension-kit",[391,395,400],{"title":392,"path":393,"stem":394,"icon":81},"Data Connector","\u002Fen\u002Freference\u002Fextensions\u002Fextension-kit\u002Fdata-connector","en\u002F6.reference\u002F9.extensions\u002F3.extension-kit\u002F1.data-connector",{"title":396,"path":397,"stem":398,"icon":399},"Protocol","\u002Fen\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol","en\u002F6.reference\u002F9.extensions\u002F3.extension-kit\u002F2.protocol","i-lucide-arrow-left-right",{"title":401,"path":402,"stem":403,"icon":404},"Schema Helpers","\u002Fen\u002Freference\u002Fextensions\u002Fextension-kit\u002Fexperimental","en\u002F6.reference\u002F9.extensions\u002F3.extension-kit\u002F3.experimental","i-lucide-blocks",{"title":113,"path":406,"stem":407,"children":408,"page":6},"\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors",[409,413,417,421,426,431],{"title":410,"path":411,"stem":412,"icon":81},"Data Connector API","\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Fapi","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F1.api",{"title":414,"path":415,"stem":416,"icon":176},"Operations and Operators","\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Foperations","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F2.operations",{"title":148,"path":418,"stem":419,"icon":420},"\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Ferrors","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F3.errors","i-lucide-triangle-alert",{"title":422,"path":423,"stem":424,"icon":425},"Runtime Limits","\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Flimits","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F4.limits","i-lucide-gauge",{"title":427,"path":428,"stem":429,"icon":430},"Limitations","\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Flimitations","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F5.limitations","i-lucide-ban",{"title":432,"path":433,"stem":434,"icon":435},"Network Permissions","\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Fpermissions","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F6.permissions","i-lucide-shield-check",{"title":437,"icon":121,"path":438,"stem":439,"children":440,"page":6},"Release Notes","\u002Fen\u002Frelease-notes","en\u002F7.release-notes",[441],{"title":442,"path":443,"stem":444,"icon":121},"Changelog","\u002Fen\u002Frelease-notes\u002Fchangelog","en\u002F7.release-notes\u002F1.changelog",{"id":446,"title":410,"body":447,"description":7051,"extension":7052,"links":7053,"meta":7054,"navigation":7055,"path":411,"seo":7056,"stem":412,"__hash__":7057},"docs_en\u002Fen\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F1.api.md",{"type":448,"value":449,"toc":7015},"minimark",[450,453,458,503,692,698,703,792,798,851,864,867,881,908,915,940,944,975,981,985,1013,1891,1910,1916,1920,1937,1986,1988,2005,2027,2033,2074,2093,2095,2101,2178,2186,2190,2202,2310,2374,2377,2387,2459,2462,2465,2611,2614,2772,2775,2792,2992,3001,3004,3029,3036,3039,3055,3066,3306,3312,3315,3322,3373,3399,3431,3455,3459,3484,4658,4683,4687,4705,4708,4734,4904,4920,4923,5104,5194,5198,5219,5352,5441,5474,5478,5482,5493,5525,5545,5551,5555,5564,5666,5676,5777,5809,5813,5825,5883,5885,5900,5916,5932,5936,5950,5995,6079,6091,6180,6184,6193,6196,6233,6240,6251,6567,6573,6576,6579,6625,6643,6661,6682,6874,6966,6971,6975,7011],[451,452],"preview",{},[454,455,457],"h2",{"id":456},"declare-the-entry","Declare the Entry",[459,460,461,462,466,467,470,471,476,477,481,482,485,486,490,491,498,499,502],"p",{},"A ",[463,464,465],"strong",{},"data connector extension"," exposes an ",[463,468,469],{},"external data source",", the API, service, or database it reads and writes, as ",[472,473,475],"a",{"href":474},"\u002Fconcepts\u002Fdata-model#collections","collections"," in a Monospace ",[472,478,480],{"href":479},"\u002Fconcepts\u002Forganization#glossary","workspace",". A collection holds ",[463,483,484],{},"items",", and each item carries named values called ",[472,487,489],{"href":488},"\u002Fconcepts\u002Fdata-model#fields","fields",". Its entry in ",[472,492,494],{"href":493},"\u002Freference\u002Fextensions\u002Fmanifest",[495,496,497],"code",{},"extension.config.json"," has ",[495,500,501],{},"\"type\": \"dataConnector\""," and these fields:",[504,505,506,525],"table",{},[507,508,509],"thead",{},[510,511,512,516,519,522],"tr",{},[513,514,515],"th",{},"Field",[513,517,518],{},"Type",[513,520,521],{},"Required",[513,523,524],{},"Rules",[526,527,528,547,569,590,604,619,641,657,673],"tbody",{},[510,529,530,536,539,542],{},[531,532,533],"td",{},[495,534,535],{},"type",[531,537,538],{},"string",[531,540,541],{},"Yes",[531,543,544],{},[495,545,546],{},"\"dataConnector\"",[510,548,549,554,556,558],{},[531,550,551],{},[495,552,553],{},"id",[531,555,538],{},[531,557,541],{},[531,559,560,561,565,566],{},"The entry's identifier, in ",[472,562,564],{"href":563},"\u002Freference\u002Fextensions\u002Fmanifest#id-format","id format",". A data source names it as its ",[495,567,568],{},"provider",[510,570,571,576,578,580],{},[531,572,573],{},[495,574,575],{},"version",[531,577,538],{},[531,579,541],{},[531,581,582,583,587,588],{},"The entry's release, in ",[472,584,586],{"href":585},"\u002Freference\u002Fextensions\u002Fmanifest#version-format","version format",". Independent of the extension ",[495,589,575],{},[510,591,592,597,599,601],{},[531,593,594],{},[495,595,596],{},"name",[531,598,538],{},[531,600,541],{},[531,602,603],{},"Display name. Must contain at least one non-whitespace character",[510,605,606,611,613,616],{},[531,607,608],{},[495,609,610],{},"description",[531,612,538],{},[531,614,615],{},"No",[531,617,618],{},"Display description",[510,620,621,626,628,630],{},[531,622,623],{},[495,624,625],{},"icon",[531,627,538],{},[531,629,615],{},[531,631,632,633,636,637],{},"Icon name. Defaults to ",[495,634,635],{},"lucide:cable",". See ",[472,638,640],{"href":639},"\u002Freference\u002Fextensions\u002Fmanifest#icons","Icons",[510,642,643,648,650,652],{},[531,644,645],{},[495,646,647],{},"iconForeground",[531,649,538],{},[531,651,615],{},[531,653,654,655],{},"Glyph color of a one-color icon. Independent of the extension's. See ",[472,656,640],{"href":639},[510,658,659,664,666,668],{},[531,660,661],{},[495,662,663],{},"iconBackground",[531,665,538],{},[531,667,615],{},[531,669,670,671],{},"Tile color behind the icon. Independent of the extension's. See ",[472,672,640],{"href":639},[510,674,675,680,683,685],{},[531,676,677],{},[495,678,679],{},"engine",[531,681,682],{},"object",[531,684,541],{},[531,686,687,688,691],{},"How the ",[463,689,690],{},"instance"," (your Monospace deployment) runs the entry. See below",[459,693,461,694,697],{},[463,695,696],{},"data source"," is a data connector configured in a workspace, with its own configuration and granted network permissions.",[699,700,701],"h3",{"id":679},[495,702,679],{},[504,704,705,717],{},[507,706,707],{},[510,708,709,711,713,715],{},[513,710,515],{},[513,712,518],{},[513,714,521],{},[513,716,524],{},[526,718,719,737,759],{},[510,720,721,726,728,730],{},[531,722,723],{},[495,724,725],{},"entrypoint",[531,727,538],{},[531,729,541],{},[531,731,732,733],{},"Non-empty. In the extension config, the source file to build; a relative path resolves against the project root. In the manifest, the built file, relative to the extension directory. See ",[472,734,736],{"href":735},"#entrypoint-rules","Entrypoint Rules",[510,738,739,744,747,749],{},[531,740,741],{},[495,742,743],{},"permissions",[531,745,746],{},"array",[531,748,615],{},[531,750,751,752,755,756],{},"Hosts the entry needs on every data source. Omitted means none; the connector's ",[495,753,754],{},"preflight"," can still add hosts. See ",[472,757,432],{"href":758},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Fpermissions",[510,760,761,766,768,770],{},[531,762,763],{},[495,764,765],{},"capabilities",[531,767,682],{},[531,769,615],{},[531,771,772,775,776,779,780,783,784,787,788],{},[495,773,774],{},"{ query: [...] }",", the writes that answer with the written items: any of ",[495,777,778],{},"insertReturning",", ",[495,781,782],{},"updateReturning"," and ",[495,785,786],{},"deleteReturning",". Omitted means none. See ",[472,789,791],{"href":790},"\u002Freference\u002Fextensions\u002Fmanifest#capabilities","Capabilities",[459,793,794,795,797],{},"Each ",[495,796,743],{}," item is an object with exactly two fields:",[504,799,800,812],{},[507,801,802],{},[510,803,804,806,808,810],{},[513,805,515],{},[513,807,518],{},[513,809,521],{},[513,811,524],{},[526,813,814,837],{},[510,815,816,821,823,825],{},[531,817,818],{},[495,819,820],{},"permission",[531,822,538],{},[531,824,541],{},[531,826,827,828,831,832,836],{},"Starts with ",[495,829,830],{},"net:"," followed by a target. See ",[472,833,835],{"href":834},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Fpermissions#target-syntax","Target Syntax",". The instance rejects the whole extension if it can't parse the target",[510,838,839,844,846,848],{},[531,840,841],{},[495,842,843],{},"reason",[531,845,538],{},[531,847,541],{},[531,849,850],{},"Must contain at least one non-whitespace character. Shown to whoever approves the grant",[459,852,853,854,856,857,860,861,863],{},"The instance also rejects the whole extension at load time when a ",[495,855,820],{}," target passes the schema but can't be parsed (e.g., ",[495,858,859],{},"net:example.com:notaport","), or when a ",[495,862,843],{}," contains only whitespace.",[699,865,736],{"id":866},"entrypoint-rules",[459,868,869,872,873,876,877,880],{},[495,870,871],{},"monospace extension build"," replaces ",[495,874,875],{},"engine.entrypoint"," with the built file, named ",[495,878,879],{},"\u003Centry id>.js",". The instance checks each entrypoint in the manifest against the extension directory. It rejects:",[882,883,884,892,895,902,905],"ul",{},[885,886,887,888,891],"li",{},"absolute paths and Windows drive paths (e.g., ",[495,889,890],{},"C:\u002Fconnector.js",");",[885,893,894],{},"backslash separators;",[885,896,897,898,901],{},"any ",[495,899,900],{},".."," segment;",[885,903,904],{},"a path that isn't a file;",[885,906,907],{},"a symlink that resolves outside the extension directory.",[459,909,910,911,914],{},"A leading ",[495,912,913],{},".\u002F"," and symlinks that stay inside the directory are accepted. One invalid entrypoint rejects the whole extension.",[459,916,917,918,921,922,924,925,927,928,930,931,934,935,939],{},"The entrypoint file must be one self-contained ES module whose default export has a ",[495,919,920],{},"setup"," function. ",[495,923,871],{}," checks for imports and a default export, but not for ",[495,926,920],{},". A file without ",[495,929,920],{},", or with a static import, fails when a data source starts. A dynamic ",[495,932,933],{},"import()"," inside a handler fails only when it runs. See ",[472,936,938],{"href":937},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Flimits#one-file-no-imports","One File, No Imports",".",[454,941,943],{"id":942},"import-the-kit","Import the Kit",[459,945,946,949,950,956,957,960,961,967,968,974],{},[495,947,948],{},"@monospace\u002Fextension-kit"," has three import paths: ",[472,951,953],{"href":952},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fdata-connector",[495,954,955],{},"\u002Fdata-connector"," for ",[495,958,959],{},"defineDataConnector",", its types and the error classes; ",[472,962,964],{"href":963},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol",[495,965,966],{},"\u002Fdata-connector\u002Fprotocol"," for the schema document and query types; and ",[472,969,971],{"href":970},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fexperimental",[495,972,973],{},"\u002Fdata-connector\u002Fexperimental"," for the schema helpers. The Extension Kit reference lists every export with its declaration.",[459,976,977,978,939],{},"The package has no runtime dependencies. The built entrypoint is a single file with no imports, so everything you use from the kit is bundled into it. See ",[472,979,237],{"href":980},"\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fruntime",[454,982,984],{"id":983},"define-a-data-connector","Define a Data Connector",[459,986,987,988,993,994,998,999,1001,1002,1004,1005,1009,1010,1012],{},"The entrypoint's default export is a descriptor. ",[472,989,991],{"href":990},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fdata-connector#definedataconnector",[495,992,959],{}," builds one from a ",[472,995,997],{"href":996},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fdata-connector#dataconnectordefinition","definition"," with a required ",[495,1000,920],{}," and an optional ",[495,1003,754],{},". The Stripe connector from ",[472,1006,1008],{"href":1007},"\u002Fguides\u002Fdata-connectors\u002Fstripe","Build a Stripe Data Connector"," parses its configuration in ",[495,1011,920],{}," and returns its handlers; its other files hold the client, the schema and the operations:",[1014,1015,1016],"accordion",{},[1017,1018,1020],"accordion-item",{"label":1019},"src\u002Fdata-connectors\u002Fstripe\u002Findex.ts",[1021,1022,1027],"pre",{"className":1023,"code":1024,"filename":1019,"language":1025,"meta":1026,"style":1026},"language-ts shiki shiki-themes monospace-light monospace-light monospace-dark","import { defineDataConnector } from '@monospace\u002Fextension-kit\u002Fdata-connector';\nimport { StripeClient } from '.\u002Fclient';\nimport { schemaDocument } from '.\u002Fcollections';\nimport { parseConfig } from '.\u002Fconfig';\nimport { readMany, readOne } from '.\u002Fread';\nimport { findResource } from '.\u002Fresources';\nimport { create, deleteMany, deleteOne, updateMany, updateOne } from '.\u002Fwrite';\n\nexport default defineDataConnector\u003Cunknown>({\n    setup({ config: rawConfig }) {\n        const config = parseConfig(rawConfig);\n        const context = { client: new StripeClient(config.apiKey), config };\n\n        return {\n            introspect() {\n                return schemaDocument(config.enableWrites);\n            },\n\n            async query({ query }) {\n                \u002F\u002F Engine sends only declared collections, and this connector declares no namespaces.\n                \u002F\u002F For anything else, throw a plain error.\n                const resource = query.namespace === undefined ? findResource(query.collection) : undefined;\n                if (resource === undefined) throw new Error(`Unknown collection \\`${query.collection}\\`.`);\n\n                switch (query.op) {\n                    case 'readMany': return await readMany(context, resource, query);\n                    case 'readOne': return await readOne(context, resource, query);\n                    case 'create': return await create(context, resource, query);\n                    case 'updateMany': return await updateMany(context, resource, query);\n                    case 'updateOne': return await updateOne(context, resource, query);\n                    case 'deleteMany': return await deleteMany(context, resource, query);\n                    case 'deleteOne': return await deleteOne(context, resource, query);\n                    default: {\n                        \u002F\u002F `query` is `never` here, so an operation added to the kit fails to compile until it's handled.\n                        const unhandled: never = query;\n                        throw new Error('The Stripe connector received an operation it doesn\\'t handle.', { cause: unhandled });\n                    }\n                }\n            },\n\n            async testConnection() {\n                await context.client.ping();\n                return { ok: true };\n            },\n        };\n    },\n});\n","ts","",[495,1028,1029,1058,1077,1096,1115,1139,1158,1197,1204,1227,1248,1271,1307,1312,1321,1330,1350,1356,1361,1377,1384,1390,1439,1493,1498,1516,1551,1582,1613,1644,1675,1706,1737,1746,1752,1772,1802,1808,1814,1819,1824,1834,1855,1868,1873,1879,1885],{"__ignoreMap":1026},[1030,1031,1034,1038,1042,1045,1048,1051,1055],"span",{"class":1032,"line":1033},"line",1,[1030,1035,1037],{"class":1036},"sLVBU","import",[1030,1039,1041],{"class":1040},"sTMul"," { ",[1030,1043,959],{"class":1044},"sNJ9c",[1030,1046,1047],{"class":1040}," } ",[1030,1049,1050],{"class":1036},"from",[1030,1052,1054],{"class":1053},"suKVh"," '@monospace\u002Fextension-kit\u002Fdata-connector'",[1030,1056,1057],{"class":1040},";\n",[1030,1059,1061,1063,1065,1068,1070,1072,1075],{"class":1032,"line":1060},2,[1030,1062,1037],{"class":1036},[1030,1064,1041],{"class":1040},[1030,1066,1067],{"class":1044},"StripeClient",[1030,1069,1047],{"class":1040},[1030,1071,1050],{"class":1036},[1030,1073,1074],{"class":1053}," '.\u002Fclient'",[1030,1076,1057],{"class":1040},[1030,1078,1080,1082,1084,1087,1089,1091,1094],{"class":1032,"line":1079},3,[1030,1081,1037],{"class":1036},[1030,1083,1041],{"class":1040},[1030,1085,1086],{"class":1044},"schemaDocument",[1030,1088,1047],{"class":1040},[1030,1090,1050],{"class":1036},[1030,1092,1093],{"class":1053}," '.\u002Fcollections'",[1030,1095,1057],{"class":1040},[1030,1097,1099,1101,1103,1106,1108,1110,1113],{"class":1032,"line":1098},4,[1030,1100,1037],{"class":1036},[1030,1102,1041],{"class":1040},[1030,1104,1105],{"class":1044},"parseConfig",[1030,1107,1047],{"class":1040},[1030,1109,1050],{"class":1036},[1030,1111,1112],{"class":1053}," '.\u002Fconfig'",[1030,1114,1057],{"class":1040},[1030,1116,1118,1120,1122,1125,1127,1130,1132,1134,1137],{"class":1032,"line":1117},5,[1030,1119,1037],{"class":1036},[1030,1121,1041],{"class":1040},[1030,1123,1124],{"class":1044},"readMany",[1030,1126,779],{"class":1040},[1030,1128,1129],{"class":1044},"readOne",[1030,1131,1047],{"class":1040},[1030,1133,1050],{"class":1036},[1030,1135,1136],{"class":1053}," '.\u002Fread'",[1030,1138,1057],{"class":1040},[1030,1140,1142,1144,1146,1149,1151,1153,1156],{"class":1032,"line":1141},6,[1030,1143,1037],{"class":1036},[1030,1145,1041],{"class":1040},[1030,1147,1148],{"class":1044},"findResource",[1030,1150,1047],{"class":1040},[1030,1152,1050],{"class":1036},[1030,1154,1155],{"class":1053}," '.\u002Fresources'",[1030,1157,1057],{"class":1040},[1030,1159,1161,1163,1165,1168,1170,1173,1175,1178,1180,1183,1185,1188,1190,1192,1195],{"class":1032,"line":1160},7,[1030,1162,1037],{"class":1036},[1030,1164,1041],{"class":1040},[1030,1166,1167],{"class":1044},"create",[1030,1169,779],{"class":1040},[1030,1171,1172],{"class":1044},"deleteMany",[1030,1174,779],{"class":1040},[1030,1176,1177],{"class":1044},"deleteOne",[1030,1179,779],{"class":1040},[1030,1181,1182],{"class":1044},"updateMany",[1030,1184,779],{"class":1040},[1030,1186,1187],{"class":1044},"updateOne",[1030,1189,1047],{"class":1040},[1030,1191,1050],{"class":1036},[1030,1193,1194],{"class":1053}," '.\u002Fwrite'",[1030,1196,1057],{"class":1040},[1030,1198,1200],{"class":1032,"line":1199},8,[1030,1201,1203],{"emptyLinePlaceholder":1202},true,"\n",[1030,1205,1207,1210,1213,1217,1220,1224],{"class":1032,"line":1206},9,[1030,1208,1209],{"class":1036},"export",[1030,1211,1212],{"class":1036}," default",[1030,1214,1216],{"class":1215},"ssBNi"," defineDataConnector",[1030,1218,1219],{"class":1040},"\u003C",[1030,1221,1223],{"class":1222},"snHjA","unknown",[1030,1225,1226],{"class":1040},">({\n",[1030,1228,1230,1233,1236,1239,1242,1245],{"class":1032,"line":1229},10,[1030,1231,1232],{"class":1215},"    setup",[1030,1234,1235],{"class":1040},"({ ",[1030,1237,1238],{"class":1036},"config",[1030,1240,1241],{"class":1040},": ",[1030,1243,1244],{"class":1036},"rawConfig",[1030,1246,1247],{"class":1040}," }) {\n",[1030,1249,1251,1254,1257,1260,1263,1266,1268],{"class":1032,"line":1250},11,[1030,1252,1253],{"class":1036},"        const",[1030,1255,1256],{"class":1215}," config",[1030,1258,1259],{"class":1036}," =",[1030,1261,1262],{"class":1215}," parseConfig",[1030,1264,1265],{"class":1040},"(",[1030,1267,1244],{"class":1044},[1030,1269,1270],{"class":1040},");\n",[1030,1272,1274,1276,1279,1281,1284,1287,1290,1292,1294,1296,1299,1302,1304],{"class":1032,"line":1273},12,[1030,1275,1253],{"class":1036},[1030,1277,1278],{"class":1215}," context",[1030,1280,1259],{"class":1036},[1030,1282,1283],{"class":1040}," { client: ",[1030,1285,1286],{"class":1036},"new",[1030,1288,1289],{"class":1215}," StripeClient",[1030,1291,1265],{"class":1040},[1030,1293,1238],{"class":1044},[1030,1295,939],{"class":1040},[1030,1297,1298],{"class":1044},"apiKey",[1030,1300,1301],{"class":1040},"), ",[1030,1303,1238],{"class":1044},[1030,1305,1306],{"class":1040}," };\n",[1030,1308,1310],{"class":1032,"line":1309},13,[1030,1311,1203],{"emptyLinePlaceholder":1202},[1030,1313,1315,1318],{"class":1032,"line":1314},14,[1030,1316,1317],{"class":1036},"        return",[1030,1319,1320],{"class":1040}," {\n",[1030,1322,1324,1327],{"class":1032,"line":1323},15,[1030,1325,1326],{"class":1215},"            introspect",[1030,1328,1329],{"class":1040},"() {\n",[1030,1331,1333,1336,1339,1341,1343,1345,1348],{"class":1032,"line":1332},16,[1030,1334,1335],{"class":1036},"                return",[1030,1337,1338],{"class":1215}," schemaDocument",[1030,1340,1265],{"class":1040},[1030,1342,1238],{"class":1044},[1030,1344,939],{"class":1040},[1030,1346,1347],{"class":1044},"enableWrites",[1030,1349,1270],{"class":1040},[1030,1351,1353],{"class":1032,"line":1352},17,[1030,1354,1355],{"class":1040},"            },\n",[1030,1357,1359],{"class":1032,"line":1358},18,[1030,1360,1203],{"emptyLinePlaceholder":1202},[1030,1362,1364,1367,1370,1372,1375],{"class":1032,"line":1363},19,[1030,1365,1366],{"class":1036},"            async",[1030,1368,1369],{"class":1215}," query",[1030,1371,1235],{"class":1040},[1030,1373,1374],{"class":1036},"query",[1030,1376,1247],{"class":1040},[1030,1378,1380],{"class":1032,"line":1379},20,[1030,1381,1383],{"class":1382},"seNfP","                \u002F\u002F Engine sends only declared collections, and this connector declares no namespaces.\n",[1030,1385,1387],{"class":1032,"line":1386},21,[1030,1388,1389],{"class":1382},"                \u002F\u002F For anything else, throw a plain error.\n",[1030,1391,1393,1396,1399,1401,1403,1405,1408,1411,1414,1417,1420,1422,1424,1426,1429,1432,1435,1437],{"class":1032,"line":1392},22,[1030,1394,1395],{"class":1036},"                const",[1030,1397,1398],{"class":1215}," resource",[1030,1400,1259],{"class":1036},[1030,1402,1369],{"class":1044},[1030,1404,939],{"class":1040},[1030,1406,1407],{"class":1044},"namespace",[1030,1409,1410],{"class":1036}," ===",[1030,1412,1413],{"class":1215}," undefined",[1030,1415,1416],{"class":1036}," ?",[1030,1418,1419],{"class":1215}," findResource",[1030,1421,1265],{"class":1040},[1030,1423,1374],{"class":1044},[1030,1425,939],{"class":1040},[1030,1427,1428],{"class":1044},"collection",[1030,1430,1431],{"class":1040},") ",[1030,1433,1434],{"class":1036},":",[1030,1436,1413],{"class":1215},[1030,1438,1057],{"class":1040},[1030,1440,1442,1445,1448,1451,1453,1455,1457,1460,1463,1466,1468,1471,1474,1477,1479,1481,1483,1486,1488,1491],{"class":1032,"line":1441},23,[1030,1443,1444],{"class":1036},"                if",[1030,1446,1447],{"class":1040}," (",[1030,1449,1450],{"class":1044},"resource",[1030,1452,1410],{"class":1036},[1030,1454,1413],{"class":1215},[1030,1456,1431],{"class":1040},[1030,1458,1459],{"class":1036},"throw",[1030,1461,1462],{"class":1036}," new",[1030,1464,1465],{"class":1215}," Error",[1030,1467,1265],{"class":1040},[1030,1469,1470],{"class":1053},"`Unknown collection ",[1030,1472,1473],{"class":1215},"\\`",[1030,1475,1476],{"class":1053},"${",[1030,1478,1374],{"class":1044},[1030,1480,939],{"class":1053},[1030,1482,1428],{"class":1044},[1030,1484,1485],{"class":1053},"}",[1030,1487,1473],{"class":1215},[1030,1489,1490],{"class":1053},".`",[1030,1492,1270],{"class":1040},[1030,1494,1496],{"class":1032,"line":1495},24,[1030,1497,1203],{"emptyLinePlaceholder":1202},[1030,1499,1501,1504,1506,1508,1510,1513],{"class":1032,"line":1500},25,[1030,1502,1503],{"class":1036},"                switch",[1030,1505,1447],{"class":1040},[1030,1507,1374],{"class":1044},[1030,1509,939],{"class":1040},[1030,1511,1512],{"class":1044},"op",[1030,1514,1515],{"class":1040},") {\n",[1030,1517,1519,1522,1525,1527,1530,1533,1536,1538,1541,1543,1545,1547,1549],{"class":1032,"line":1518},26,[1030,1520,1521],{"class":1036},"                    case",[1030,1523,1524],{"class":1053}," 'readMany'",[1030,1526,1241],{"class":1040},[1030,1528,1529],{"class":1036},"return",[1030,1531,1532],{"class":1036}," await",[1030,1534,1535],{"class":1215}," readMany",[1030,1537,1265],{"class":1040},[1030,1539,1540],{"class":1044},"context",[1030,1542,779],{"class":1040},[1030,1544,1450],{"class":1044},[1030,1546,779],{"class":1040},[1030,1548,1374],{"class":1044},[1030,1550,1270],{"class":1040},[1030,1552,1554,1556,1559,1561,1563,1565,1568,1570,1572,1574,1576,1578,1580],{"class":1032,"line":1553},27,[1030,1555,1521],{"class":1036},[1030,1557,1558],{"class":1053}," 'readOne'",[1030,1560,1241],{"class":1040},[1030,1562,1529],{"class":1036},[1030,1564,1532],{"class":1036},[1030,1566,1567],{"class":1215}," readOne",[1030,1569,1265],{"class":1040},[1030,1571,1540],{"class":1044},[1030,1573,779],{"class":1040},[1030,1575,1450],{"class":1044},[1030,1577,779],{"class":1040},[1030,1579,1374],{"class":1044},[1030,1581,1270],{"class":1040},[1030,1583,1585,1587,1590,1592,1594,1596,1599,1601,1603,1605,1607,1609,1611],{"class":1032,"line":1584},28,[1030,1586,1521],{"class":1036},[1030,1588,1589],{"class":1053}," 'create'",[1030,1591,1241],{"class":1040},[1030,1593,1529],{"class":1036},[1030,1595,1532],{"class":1036},[1030,1597,1598],{"class":1215}," create",[1030,1600,1265],{"class":1040},[1030,1602,1540],{"class":1044},[1030,1604,779],{"class":1040},[1030,1606,1450],{"class":1044},[1030,1608,779],{"class":1040},[1030,1610,1374],{"class":1044},[1030,1612,1270],{"class":1040},[1030,1614,1616,1618,1621,1623,1625,1627,1630,1632,1634,1636,1638,1640,1642],{"class":1032,"line":1615},29,[1030,1617,1521],{"class":1036},[1030,1619,1620],{"class":1053}," 'updateMany'",[1030,1622,1241],{"class":1040},[1030,1624,1529],{"class":1036},[1030,1626,1532],{"class":1036},[1030,1628,1629],{"class":1215}," updateMany",[1030,1631,1265],{"class":1040},[1030,1633,1540],{"class":1044},[1030,1635,779],{"class":1040},[1030,1637,1450],{"class":1044},[1030,1639,779],{"class":1040},[1030,1641,1374],{"class":1044},[1030,1643,1270],{"class":1040},[1030,1645,1647,1649,1652,1654,1656,1658,1661,1663,1665,1667,1669,1671,1673],{"class":1032,"line":1646},30,[1030,1648,1521],{"class":1036},[1030,1650,1651],{"class":1053}," 'updateOne'",[1030,1653,1241],{"class":1040},[1030,1655,1529],{"class":1036},[1030,1657,1532],{"class":1036},[1030,1659,1660],{"class":1215}," updateOne",[1030,1662,1265],{"class":1040},[1030,1664,1540],{"class":1044},[1030,1666,779],{"class":1040},[1030,1668,1450],{"class":1044},[1030,1670,779],{"class":1040},[1030,1672,1374],{"class":1044},[1030,1674,1270],{"class":1040},[1030,1676,1678,1680,1683,1685,1687,1689,1692,1694,1696,1698,1700,1702,1704],{"class":1032,"line":1677},31,[1030,1679,1521],{"class":1036},[1030,1681,1682],{"class":1053}," 'deleteMany'",[1030,1684,1241],{"class":1040},[1030,1686,1529],{"class":1036},[1030,1688,1532],{"class":1036},[1030,1690,1691],{"class":1215}," deleteMany",[1030,1693,1265],{"class":1040},[1030,1695,1540],{"class":1044},[1030,1697,779],{"class":1040},[1030,1699,1450],{"class":1044},[1030,1701,779],{"class":1040},[1030,1703,1374],{"class":1044},[1030,1705,1270],{"class":1040},[1030,1707,1709,1711,1714,1716,1718,1720,1723,1725,1727,1729,1731,1733,1735],{"class":1032,"line":1708},32,[1030,1710,1521],{"class":1036},[1030,1712,1713],{"class":1053}," 'deleteOne'",[1030,1715,1241],{"class":1040},[1030,1717,1529],{"class":1036},[1030,1719,1532],{"class":1036},[1030,1721,1722],{"class":1215}," deleteOne",[1030,1724,1265],{"class":1040},[1030,1726,1540],{"class":1044},[1030,1728,779],{"class":1040},[1030,1730,1450],{"class":1044},[1030,1732,779],{"class":1040},[1030,1734,1374],{"class":1044},[1030,1736,1270],{"class":1040},[1030,1738,1740,1743],{"class":1032,"line":1739},33,[1030,1741,1742],{"class":1036},"                    default",[1030,1744,1745],{"class":1040},": {\n",[1030,1747,1749],{"class":1032,"line":1748},34,[1030,1750,1751],{"class":1382},"                        \u002F\u002F `query` is `never` here, so an operation added to the kit fails to compile until it's handled.\n",[1030,1753,1755,1758,1761,1763,1766,1768,1770],{"class":1032,"line":1754},35,[1030,1756,1757],{"class":1036},"                        const",[1030,1759,1760],{"class":1215}," unhandled",[1030,1762,1434],{"class":1036},[1030,1764,1765],{"class":1222}," never",[1030,1767,1259],{"class":1036},[1030,1769,1369],{"class":1044},[1030,1771,1057],{"class":1040},[1030,1773,1775,1778,1780,1782,1784,1787,1790,1793,1796,1799],{"class":1032,"line":1774},36,[1030,1776,1777],{"class":1036},"                        throw",[1030,1779,1462],{"class":1036},[1030,1781,1465],{"class":1215},[1030,1783,1265],{"class":1040},[1030,1785,1786],{"class":1053},"'The Stripe connector received an operation it doesn",[1030,1788,1789],{"class":1215},"\\'",[1030,1791,1792],{"class":1053},"t handle.'",[1030,1794,1795],{"class":1040},", { cause: ",[1030,1797,1798],{"class":1044},"unhandled",[1030,1800,1801],{"class":1040}," });\n",[1030,1803,1805],{"class":1032,"line":1804},37,[1030,1806,1807],{"class":1040},"                    }\n",[1030,1809,1811],{"class":1032,"line":1810},38,[1030,1812,1813],{"class":1040},"                }\n",[1030,1815,1817],{"class":1032,"line":1816},39,[1030,1818,1355],{"class":1040},[1030,1820,1822],{"class":1032,"line":1821},40,[1030,1823,1203],{"emptyLinePlaceholder":1202},[1030,1825,1827,1829,1832],{"class":1032,"line":1826},41,[1030,1828,1366],{"class":1036},[1030,1830,1831],{"class":1215}," testConnection",[1030,1833,1329],{"class":1040},[1030,1835,1837,1840,1842,1844,1847,1849,1852],{"class":1032,"line":1836},42,[1030,1838,1839],{"class":1036},"                await",[1030,1841,1278],{"class":1044},[1030,1843,939],{"class":1040},[1030,1845,1846],{"class":1044},"client",[1030,1848,939],{"class":1040},[1030,1850,1851],{"class":1215},"ping",[1030,1853,1854],{"class":1040},"();\n",[1030,1856,1858,1860,1863,1866],{"class":1032,"line":1857},43,[1030,1859,1335],{"class":1036},[1030,1861,1862],{"class":1040}," { ok: ",[1030,1864,1865],{"class":1215},"true",[1030,1867,1306],{"class":1040},[1030,1869,1871],{"class":1032,"line":1870},44,[1030,1872,1355],{"class":1040},[1030,1874,1876],{"class":1032,"line":1875},45,[1030,1877,1878],{"class":1040},"        };\n",[1030,1880,1882],{"class":1032,"line":1881},46,[1030,1883,1884],{"class":1040},"    },\n",[1030,1886,1888],{"class":1032,"line":1887},47,[1030,1889,1890],{"class":1040},"});\n",[459,1892,1893,1895,1896,1899,1900,1903,1904,1906,1907,1909],{},[495,1894,959],{}," performs no I\u002FO. It returns the definition plus a ",[495,1897,1898],{},"monospace"," marker, ",[495,1901,1902],{},"{ kind: 'dataConnector', apiVersion: 1 }",". Engine recognizes a descriptor by its ",[495,1905,920],{}," function. A hand-written object with a ",[495,1908,920],{}," function works without the kit.",[459,1911,1912,1913,1915],{},"Because the descriptor is a plain object, you can test a connector by calling ",[495,1914,920],{}," and its handlers directly.",[699,1917,1919],{"id":1918},"receive-the-configuration","Receive the Configuration",[459,1921,1922,783,1924,1926,1927,1933,1934,1936],{},[495,1923,754],{},[495,1925,920],{}," each receive one argument, ",[472,1928,1930],{"href":1929},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fdata-connector#dataconnectorsetupoptions",[495,1931,1932],{},"{ config }",". ",[495,1935,1238],{}," is the data source's stored configuration object, passed through unchanged.",[882,1938,1939,1955,1977],{},[885,1940,1941,1944,1945,1947,1948,1954],{},[463,1942,1943],{},"Nothing validates it before your code runs."," Engine doesn't check the configuration against any schema. Check every value you depend on in ",[495,1946,920],{},", and throw ",[472,1949,1951],{"href":1950},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fdata-connector#invalidconfiguration",[495,1952,1953],{},"InvalidConfiguration"," when one is missing or wrong.",[885,1956,1957,1960,1961,1964,1965,1967,1968,1971,1972,1974,1975,939],{},[463,1958,1959],{},"Type it with the generic."," ",[495,1962,1963],{},"defineDataConnector\u003CConfig>"," types ",[495,1966,1238],{},". The type is a compile-time assertion only. The default is ",[495,1969,1970],{},"Record\u003Cstring, unknown>",". The Stripe connector passes ",[495,1973,1223],{}," and checks every value in ",[495,1976,1105],{},[885,1978,1979,1982,1983,1985],{},[463,1980,1981],{},"It's a bag on purpose."," New keys can be added beside ",[495,1984,1238],{}," later without breaking your connector.",[699,1987,754],{"id":754},[459,1989,1990,1993,1994,2000,2001,2004],{},[495,1991,1992],{},"preflight({ config })"," is optional. It returns ",[472,1995,1997],{"href":1996},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fdata-connector#dataconnectorpreflight",[495,1998,1999],{},"{ permissions }",": the network permissions this data source needs beyond the manifest's, derived from the configuration (e.g., a host taken from a ",[495,2002,2003],{},"baseUrl"," setting).",[459,2006,2007,2008,2014,2015,2017,2018,2020,2021,2023,2024,2026],{},"Each permission is ",[472,2009,2011],{"href":2010},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fdata-connector#dataconnectorpermission",[495,2012,2013],{},"{ permission, reason }",", where ",[495,2016,820],{}," is ",[495,2019,830],{}," followed by a target (see ",[472,2022,835],{"href":834},"), and ",[495,2025,843],{}," is the text shown to whoever approves the grant.",[459,2028,2029,2030,2032],{},"Neither example connector uses ",[495,2031,754],{},": their hosts are fixed, so they declare them in the manifest.",[882,2034,2035,2044,2056],{},[885,2036,2037,2040,2041,2043],{},[463,2038,2039],{},"Synchronous only."," A ",[495,2042,754],{}," that returns a promise fails with \"preflight must answer synchronously\".",[885,2045,2046,2049,2050,2052,2053,2055],{},[463,2047,2048],{},"No side effects."," Don't make requests, open connections, or build caches in ",[495,2051,754],{},". It runs before ",[495,2054,920],{},", every time the connector starts.",[885,2057,2058,2063,2064,2066,2067,2071,2072,939],{},[463,2059,2060,2061,939],{},"Full validation belongs in ",[495,2062,920],{}," When a value ",[495,2065,754],{}," reads is invalid, throw ",[472,2068,2069],{"href":1950},[495,2070,1953],{}," there. It deactivates the data source as it does from ",[495,2073,920],{},[459,2075,2076,2077,2079,2080,2083,2084,2087,2088,2090,2091,939],{},"A permission is ",[495,2078,830],{}," followed by a host, ",[495,2081,2082],{},"host:port",", or ",[495,2085,2086],{},"*.host",", never a URL. Each carries a ",[495,2089,843],{},", shown to whoever approves the grant. See ",[472,2092,432],{"href":758},[699,2094,920],{"id":920},[459,2096,2097,2100],{},[495,2098,2099],{},"setup({ config })"," runs once each time Engine starts the connector for a data source. It returns the handlers, or a promise of them.",[882,2102,2103,2112,2124,2141,2154,2169],{},[885,2104,2105,2108,2109,2111],{},[463,2106,2107],{},"Keep client state in the closure."," No handler receives the configuration, so build your client for the external data source in ",[495,2110,920],{}," and close over it.",[885,2113,2114,1960,2117,2119,2120,939],{},[463,2115,2116],{},"It has a time limit.",[495,2118,920],{}," must settle within 30 seconds. See ",[472,2121,2123],{"href":2122},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Flimits","Data Connector Runtime Limits",[885,2125,2126,2136,2137,2140],{},[463,2127,2128,2129,2131,2132,2135],{},"Throw ",[495,2130,1953],{}," for bad configuration, and ",[495,2133,2134],{},"AccessDenied"," for credentials the external data source refuses."," Engine deactivates the data source until the extension is reloaded, because retrying can't fix either. Requests that reach it fail with ",[495,2138,2139],{},"422"," \"Invalid extension configuration\", with your message nested inside.",[885,2142,2143,2146,2147,2149,2150,2153],{},[463,2144,2145],{},"A permission denial also deactivates it."," A request in ",[495,2148,920],{}," to a host outside the grant deactivates the data source when the denial reaches Engine, uncaught or kept as the ",[495,2151,2152],{},"cause"," of the error you throw.",[885,2155,2156,2040,2159,2161,2162,2165,2166,2168],{},[463,2157,2158],{},"Missing handlers also deactivate it.",[495,2160,920],{}," that returns no object, or an object without ",[495,2163,2164],{},"introspect"," or ",[495,2167,1374],{},", deactivates the data source the same way.",[885,2170,2171,2174,2175,2177],{},[463,2172,2173],{},"Other throws don't deactivate the data source."," Any other kit error class, or an error without one, fails the request that started the connector with ",[495,2176,2139],{}," \"Invalid extension configuration\", and the next request starts it again.",[459,2179,2180,2181,2185],{},"See ",[472,2182,2184],{"href":2183},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Ferrors","Data Connector Errors"," for the classes.",[699,2187,2189],{"id":2188},"handlers","Handlers",[459,2191,2192,2194,2195,2201],{},[495,2193,920],{}," returns an object of type ",[472,2196,2198],{"href":2197},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fdata-connector#dataconnectorhandlers",[495,2199,2200],{},"DataConnectorHandlers",", which lists each handler's signature:",[504,2203,2204,2216],{},[507,2205,2206],{},[510,2207,2208,2211,2213],{},[513,2209,2210],{},"Handler",[513,2212,521],{},[513,2214,2215],{},"Purpose",[526,2217,2218,2239,2279,2298],{},[510,2219,2220,2224,2226],{},[531,2221,2222],{},[495,2223,2164],{},[531,2225,541],{},[531,2227,2228,2229,636,2235],{},"Describe the collections, fields and relations the data source exposes. Answers a ",[472,2230,2232],{"href":2231},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol#schemadocument",[495,2233,2234],{},"SchemaDocument",[472,2236,2238],{"href":2237},"#describe-the-schema","Describe the Schema",[510,2240,2241,2245,2247],{},[531,2242,2243],{},[495,2244,1374],{},[531,2246,541],{},[531,2248,2249,2250,2256,2257,2263,2264,2267,2268,2274,2275],{},"Run one operation against the external data source. A ",[472,2251,2253],{"href":2252},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fdata-connector#queryhandler",[495,2254,2255],{},"QueryHandler",": receives the operation in a ",[472,2258,2260],{"href":2259},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol#queryrequest",[495,2261,2262],{},"QueryRequest"," envelope, and answers ",[495,2265,2266],{},"{ record }"," for a keyed operation and a ",[472,2269,2271],{"href":2270},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol#queryresultserialized",[495,2272,2273],{},"QueryResultSerialized"," for the others. See ",[472,2276,2278],{"href":2277},"#read-a-query-request","Read a Query Request",[510,2280,2281,2286,2288],{},[531,2282,2283],{},[495,2284,2285],{},"testConnection",[531,2287,615],{},[531,2289,2290,2291,2297],{},"Check that the external data source is reachable with this configuration. Answer ",[472,2292,2294],{"href":2293},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fdata-connector#testconnectionresult",[495,2295,2296],{},"{ ok: true }",", or throw to report a failure. Engine runs it on a connection test, and before it creates a data source or previews a schema",[510,2299,2300,2305,2307],{},[531,2301,2302],{},[495,2303,2304],{},"explainQuery",[531,2306,615],{},[531,2308,2309],{},"Reserved. Engine doesn't call it",[882,2311,2312,2326,2332,2351,2357],{},[885,2313,2314,2317,2318,2320,2321,2165,2323,2325],{},[463,2315,2316],{},"Missing required handlers deactivate the data source."," If ",[495,2319,920],{}," returns something that isn't an object, or lacks ",[495,2322,2164],{},[495,2324,1374],{},", the connector doesn't start until the extension is reloaded.",[885,2327,2328,2331],{},[463,2329,2330],{},"Unknown handlers are ignored."," Engine logs \"ignoring unrecognised handler(s)\" with their names. Methods on a class prototype count.",[885,2333,2334,2339,2340,2342,2343,2346,2347,2350],{},[463,2335,2336,2338],{},[495,2337,2285],{}," is optional."," Leave it out when every call to the external data source costs quota. A connection test against a connector without it answers ",[495,2341,2139],{}," with code ",[495,2344,2345],{},"7002",", \"The connector does not offer a connection test\". Creating a data source and previewing a schema skip the test. ",[495,2348,2349],{},"{ ok: false }"," is reported as a failed connection, and stops a create or a preview like a thrown error.",[885,2352,2353,2356],{},[463,2354,2355],{},"Handlers run concurrently."," Engine doesn't wait for one request to finish before sending the next. Don't keep per-request state in the closure.",[885,2358,2359,2362,2363,2165,2366,2369,2370,2373],{},[463,2360,2361],{},"Every handler must return a value."," A handler that returns ",[495,2364,2365],{},"undefined",[495,2367,2368],{},"null"," fails with \"",[495,2371,2372],{},"\u003Chandler>"," returned no value\".",[454,2375,2238],{"id":2376},"describe-the-schema",[459,2378,2379,2381,2382,2386],{},[495,2380,2164],{}," answers with a ",[472,2383,2384],{"href":2231},[495,2385,2234],{},". Engine calls it when a data source is created or reintrospected, and stores the result. It also runs, without storing anything, when a configuration is previewed before a data source exists. Every section defaults to empty.",[504,2388,2389,2401],{},[507,2390,2391],{},[510,2392,2393,2396,2398],{},[513,2394,2395],{},"Property",[513,2397,518],{},[513,2399,2400],{},"Description",[526,2402,2403,2424,2441],{},[510,2404,2405,2410,2418],{},[531,2406,2407],{},[495,2408,2409],{},"namespaces",[531,2411,2412],{},[472,2413,2415],{"href":2414},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol#canonicalnamespace",[495,2416,2417],{},"CanonicalNamespace[]",[531,2419,2420,2421],{},"Named groups of collections. Each is ",[495,2422,2423],{},"{ name, collections? }",[510,2425,2426,2430,2438],{},[531,2427,2428],{},[495,2429,475],{},[531,2431,2432],{},[472,2433,2435],{"href":2434},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol#canonicalcollection",[495,2436,2437],{},"CanonicalCollection[]",[531,2439,2440],{},"Collections outside any namespace",[510,2442,2443,2448,2456],{},[531,2444,2445],{},[495,2446,2447],{},"relations",[531,2449,2450],{},[472,2451,2453],{"href":2452},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol#canonicalrelation",[495,2454,2455],{},"CanonicalRelation[]",[531,2457,2458],{},"Links between collections",[459,2460,2461],{},"A collection's identity is its namespace (or none) plus its name, so the same collection name can appear in different namespaces.",[699,2463,2464],{"id":475},"Collections",[504,2466,2467,2479],{},[507,2468,2469],{},[510,2470,2471,2473,2475,2477],{},[513,2472,2395],{},[513,2474,518],{},[513,2476,521],{},[513,2478,2400],{},[526,2480,2481,2496,2515,2534,2554,2585],{},[510,2482,2483,2487,2491,2493],{},[531,2484,2485],{},[495,2486,596],{},[531,2488,2489],{},[495,2490,538],{},[531,2492,541],{},[531,2494,2495],{},"The name your connector uses. Every request you receive names the collection by it",[510,2497,2498,2503,2507,2509],{},[531,2499,2500],{},[495,2501,2502],{},"apiName",[531,2504,2505],{},[495,2506,538],{},[531,2508,615],{},[531,2510,2511,2512],{},"The name callers use. Engine derives one when absent. See ",[472,2513,414],{"href":2514},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Foperations#name-collections-and-fields",[510,2516,2517,2521,2529,2531],{},[531,2518,2519],{},[495,2520,489],{},[531,2522,2523],{},[472,2524,2526],{"href":2525},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol#canonicalfield",[495,2527,2528],{},"CanonicalField[]",[531,2530,615],{},[531,2532,2533],{},"The collection's fields",[510,2535,2536,2541,2549,2551],{},[531,2537,2538],{},[495,2539,2540],{},"indexes",[531,2542,2543],{},[472,2544,2546],{"href":2545},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol#canonicalindex",[495,2547,2548],{},"CanonicalIndex[]",[531,2550,615],{},[531,2552,2553],{},"Primary, unique and normal indexes",[510,2555,2556,2561,2566,2568],{},[531,2557,2558],{},[495,2559,2560],{},"isReadonly",[531,2562,2563],{},[495,2564,2565],{},"boolean",[531,2567,541],{},[531,2569,2570,2572,2573,2577,2578,2580,2581,2584],{},[495,2571,1865],{}," blocks every create, update and delete. The ",[472,2574,2576],{"href":2575},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fexperimental#definecollection","helpers"," derive it: ",[495,2579,1865],{}," exactly when ",[495,2582,2583],{},"operations"," declares no member that writes",[510,2586,2587,2591,2599,2601],{},[531,2588,2589],{},[495,2590,2583],{},[531,2592,2593],{},[472,2594,2596],{"href":2595},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol#supportedoperations",[495,2597,2598],{},"SupportedOperations",[531,2600,541],{},[531,2602,2603,2604,2607,2608],{},"What the collection serves. ",[495,2605,2606],{},"{}"," serves nothing. See ",[472,2609,414],{"href":2610},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Foperations",[699,2612,2613],{"id":489},"Fields",[504,2615,2616,2628],{},[507,2617,2618],{},[510,2619,2620,2622,2624,2626],{},[513,2621,2395],{},[513,2623,518],{},[513,2625,521],{},[513,2627,2400],{},[526,2629,2630,2645,2660,2682,2700,2718,2741],{},[510,2631,2632,2636,2640,2642],{},[531,2633,2634],{},[495,2635,596],{},[531,2637,2638],{},[495,2639,538],{},[531,2641,541],{},[531,2643,2644],{},"The key your connector reads and writes on items",[510,2646,2647,2651,2655,2657],{},[531,2648,2649],{},[495,2650,2502],{},[531,2652,2653],{},[495,2654,538],{},[531,2656,615],{},[531,2658,2659],{},"The name callers use",[510,2661,2662,2666,2674,2676],{},[531,2663,2664],{},[495,2665,535],{},[531,2667,2668],{},[472,2669,2671],{"href":2670},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol#primitivefieldtype",[495,2672,2673],{},"PrimitiveFieldType",[531,2675,541],{},[531,2677,2180,2678],{},[472,2679,2681],{"href":2680},"#field-types","Field Types",[510,2683,2684,2689,2693,2695],{},[531,2685,2686],{},[495,2687,2688],{},"isNullable",[531,2690,2691],{},[495,2692,2565],{},[531,2694,541],{},[531,2696,2697,2698],{},"Whether the value can be ",[495,2699,2368],{},[510,2701,2702,2707,2711,2713],{},[531,2703,2704],{},[495,2705,2706],{},"isList",[531,2708,2709],{},[495,2710,2565],{},[531,2712,541],{},[531,2714,2715,2716],{},"Whether the value is an array of ",[495,2717,535],{},[510,2719,2720,2725,2733,2735],{},[531,2721,2722],{},[495,2723,2724],{},"defaultValue",[531,2726,2727],{},[472,2728,2730],{"href":2729},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol#defaultvalue",[495,2731,2732],{},"DefaultValue",[531,2734,615],{},[531,2736,2180,2737],{},[472,2738,2740],{"href":2739},"#defaults","Defaults",[510,2742,2743,2747,2751,2753],{},[531,2744,2745],{},[495,2746,2560],{},[531,2748,2749],{},[495,2750,2565],{},[531,2752,541],{},[531,2754,2755,2757,2758,2761,2762,2765,2766,2768,2769,2771],{},[495,2756,1865],{}," keeps the field out of create and update ",[495,2759,2760],{},"data",". The helpers derive it: ",[495,2763,2764],{},"false"," exactly when a ",[495,2767,2760],{}," list in ",[495,2770,2583],{}," names the field",[699,2773,2681],{"id":2774},"field-types",[459,2776,2777,2779,2780,2782,2783,783,2786,2788,2789,939],{},[495,2778,2673],{}," is a closed set. An unrecognized ",[495,2781,596],{}," rejects the schema. Only ",[495,2784,2785],{},"decimal",[495,2787,538],{}," take ",[495,2790,2791],{},"params",[504,2793,2794,2805],{},[507,2795,2796],{},[510,2797,2798,2802],{},[513,2799,2800],{},[495,2801,535],{},[513,2803,2804],{},"Value on the wire",[526,2806,2807,2817,2842,2863,2875,2889,2899,2908,2917,2941,2951,2961,2977],{},[510,2808,2809,2814],{},[531,2810,2811],{},[495,2812,2813],{},"{ name: 'boolean' }",[531,2815,2816],{},"JSON boolean",[510,2818,2819,2839],{},[531,2820,2821,779,2824,779,2827,779,2830,779,2833,779,2836],{},[495,2822,2823],{},"{ name: 'int8' }",[495,2825,2826],{},"int16",[495,2828,2829],{},"int32",[495,2831,2832],{},"uint8",[495,2834,2835],{},"uint16",[495,2837,2838],{},"uint32",[531,2840,2841],{},"JSON number",[510,2843,2844,2852],{},[531,2845,2846,779,2849],{},[495,2847,2848],{},"{ name: 'int64' }",[495,2850,2851],{},"uint64",[531,2853,2854,2855,2858,2859],{},"Decimal string (e.g., ",[495,2856,2857],{},"\"9007199254740993\"","), in requests and in REST responses. In an answer, Engine accepts a decimal string or a JSON number. See ",[472,2860,2862],{"href":2861},"#values","Values",[510,2864,2865,2873],{},[531,2866,2867,779,2870],{},[495,2868,2869],{},"{ name: 'float32' }",[495,2871,2872],{},"float64",[531,2874,2841],{},[510,2876,2877,2886],{},[531,2878,2879,2083,2882,2885],{},[495,2880,2881],{},"{ name: 'decimal', params: { kind: 'unconstrained' } }",[495,2883,2884],{},"{ kind: 'constrained', precision, scale }"," for a declared precision and scale",[531,2887,2888],{},"String, to keep precision",[510,2890,2891,2896],{},[531,2892,2893],{},[495,2894,2895],{},"{ name: 'string', params: { length: 'unlimited' } }",[531,2897,2898],{},"String",[510,2900,2901,2906],{},[531,2902,2903],{},[495,2904,2905],{},"{ name: 'string', params: { length: 'fixed', value } }",[531,2907,2898],{},[510,2909,2910,2915],{},[531,2911,2912],{},[495,2913,2914],{},"{ name: 'uuid' }",[531,2916,2898],{},[510,2918,2919,2933],{},[531,2920,2921,779,2924,779,2927,779,2930],{},[495,2922,2923],{},"{ name: 'date' }",[495,2925,2926],{},"time",[495,2928,2929],{},"dateTime",[495,2931,2932],{},"dateTimeWithTimezone",[531,2934,2935,2936,2940],{},"String. See ",[472,2937,2939],{"href":2938},"\u002Freference\u002Fdata-types","Data Types"," for the formats",[510,2942,2943,2948],{},[531,2944,2945],{},[495,2946,2947],{},"{ name: 'bytes' }",[531,2949,2950],{},"Base64 string",[510,2952,2953,2958],{},[531,2954,2955],{},[495,2956,2957],{},"{ name: 'json' }",[531,2959,2960],{},"Any JSON value",[510,2962,2963,2968],{},[531,2964,2965],{},[495,2966,2967],{},"{ name: 'geometry' }",[531,2969,2970,2971,2974,2975],{},"Engine can't convert a non-null ",[495,2972,2973],{},"geometry"," value from a connector yet. Return ",[495,2976,2368],{},[510,2978,2979,2984],{},[531,2980,2981],{},[495,2982,2983],{},"{ name: 'unsupported' }",[531,2985,2986,2987,2991],{},"Callers can't filter, write or read the field. Engine can still filter on it in ",[472,2988,2990],{"href":2989},"#handle-requests-you-didnt-declare","its own requests",", and passes a value you return for it through unconverted",[459,2993,2994,2995,2998,2999,939],{},"A field with ",[495,2996,2997],{},"isList: true"," takes an array of values of its type, or ",[495,3000,2368],{},[699,3002,3003],{"id":2540},"Indexes",[459,3005,3006,2017,3011,2014,3014,2017,3017,779,3020,2165,3023,783,3026,3028],{},[472,3007,3008],{"href":2545},[495,3009,3010],{},"CanonicalIndex",[495,3012,3013],{},"{ name, fields, kind }",[495,3015,3016],{},"kind",[495,3018,3019],{},"'primary'",[495,3021,3022],{},"'unique'",[495,3024,3025],{},"'normal'",[495,3027,489],{}," lists field names in order.",[459,3030,3031,3032,939],{},"The primary index decides which keyed operations a collection can offer. See ",[472,3033,3035],{"href":3034},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Foperations#use-keys-and-the-stable-id","Keys and the Stable ID",[699,3037,3038],{"id":2447},"Relations",[459,3040,3041,3046,3047,3050,3051,3054],{},[472,3042,3043],{"href":2452},[495,3044,3045],{},"CanonicalRelation"," links a ",[463,3048,3049],{},"constrained"," collection, which holds the fields that point at the other side, to a ",[463,3052,3053],{},"referenced"," collection.",[459,3056,3057,3058,3061,3062,3065],{},"Relation fields expose a relation to callers. A ",[463,3059,3060],{},"to-one"," relation field returns a single related item. A ",[463,3063,3064],{},"to-many"," relation field returns several. The field on the constrained collection is always to-one. The field on the referenced collection is to-one only when every constrained field has its own single-field primary or unique index; a composite unique index doesn't count.",[504,3067,3068,3080],{},[507,3069,3070],{},[510,3071,3072,3074,3076,3078],{},[513,3073,2395],{},[513,3075,518],{},[513,3077,521],{},[513,3079,2400],{},[526,3081,3082,3097,3113,3133,3153,3176,3192,3210,3229,3254,3288],{},[510,3083,3084,3088,3092,3094],{},[531,3085,3086],{},[495,3087,596],{},[531,3089,3090],{},[495,3091,538],{},[531,3093,541],{},[531,3095,3096],{},"The relation's name",[510,3098,3099,3104,3108,3110],{},[531,3100,3101],{},[495,3102,3103],{},"constrainedNamespace",[531,3105,3106],{},[495,3107,538],{},[531,3109,615],{},[531,3111,3112],{},"Namespace of the constrained collection",[510,3114,3115,3120,3124,3126],{},[531,3116,3117],{},[495,3118,3119],{},"constrainedCollection",[531,3121,3122],{},[495,3123,538],{},[531,3125,541],{},[531,3127,3128,3129,3132],{},"The collection holding the pointing fields (e.g., ",[495,3130,3131],{},"articles",")",[510,3134,3135,3140,3145,3147],{},[531,3136,3137],{},[495,3138,3139],{},"constrainedFields",[531,3141,3142],{},[495,3143,3144],{},"string[]",[531,3146,541],{},[531,3148,3149,3150,3132],{},"The pointing fields (e.g., ",[495,3151,3152],{},"['authorId']",[510,3154,3155,3160,3164,3166],{},[531,3156,3157],{},[495,3158,3159],{},"constrainedRelationFieldName",[531,3161,3162],{},[495,3163,538],{},[531,3165,615],{},[531,3167,3168,3169,3172,3173],{},"Name of the to-one relation field on the constrained collection (e.g., ",[495,3170,3171],{},"author","). When absent, Engine derives it from ",[495,3174,3175],{},"referencedCollection",[510,3177,3178,3183,3187,3189],{},[531,3179,3180],{},[495,3181,3182],{},"referencedNamespace",[531,3184,3185],{},[495,3186,538],{},[531,3188,615],{},[531,3190,3191],{},"Namespace of the referenced collection",[510,3193,3194,3198,3202,3204],{},[531,3195,3196],{},[495,3197,3175],{},[531,3199,3200],{},[495,3201,538],{},[531,3203,541],{},[531,3205,3206,3207,3132],{},"The collection pointed at (e.g., ",[495,3208,3209],{},"authors",[510,3211,3212,3217,3221,3223],{},[531,3213,3214],{},[495,3215,3216],{},"referencedFields",[531,3218,3219],{},[495,3220,3144],{},[531,3222,541],{},[531,3224,3225,3226,3132],{},"The fields pointed at, paired by position (e.g., ",[495,3227,3228],{},"['id']",[510,3230,3231,3236,3240,3242],{},[531,3232,3233],{},[495,3234,3235],{},"referencedRelationFieldName",[531,3237,3238],{},[495,3239,538],{},[531,3241,615],{},[531,3243,3244,3245,3172,3247,3249,3250,3253],{},"Name of the relation field on the referenced collection (e.g., ",[495,3246,3131],{},[495,3248,3119],{},", and appends an ",[495,3251,3252],{},"s"," when a referenced field lacks its own single-field primary or unique index. That check differs from the one that makes the field to-many, so set the name explicitly",[510,3255,3256,3261,3269,3271],{},[531,3257,3258],{},[495,3259,3260],{},"onDelete",[531,3262,3263],{},[472,3264,3266],{"href":3265},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol#referentialaction",[495,3267,3268],{},"ReferentialAction",[531,3270,541],{},[531,3272,3273,779,3276,779,3279,779,3282,2165,3285],{},[495,3274,3275],{},"'noAction'",[495,3277,3278],{},"'restrict'",[495,3280,3281],{},"'cascade'",[495,3283,3284],{},"'setNull'",[495,3286,3287],{},"'setDefault'",[510,3289,3290,3295,3299,3301],{},[531,3291,3292],{},[495,3293,3294],{},"onUpdate",[531,3296,3297],{},[495,3298,3268],{},[531,3300,541],{},[531,3302,3303,3304],{},"Same values as ",[495,3305,3260],{},[459,3307,3308,3309,939],{},"Each relation field is only offered when the collections' operations can serve it. See ",[472,3310,3038],{"href":3311},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Foperations#resolve-relations",[699,3313,2740],{"id":3314},"defaults",[459,3316,3317,3321],{},[472,3318,3319],{"href":2729},[495,3320,2732],{}," describes a field's default. The kit never evaluates it.",[504,3323,3324,3334],{},[507,3325,3326],{},[510,3327,3328,3331],{},[513,3329,3330],{},"Shape",[513,3332,3333],{},"Meaning",[526,3335,3336,3346],{},[510,3337,3338,3343],{},[531,3339,3340],{},[495,3341,3342],{},"{ source: 'connectorManaged', isAutoincrement?: boolean }",[531,3344,3345],{},"Your connector or the external data source supplies the value",[510,3347,3348,3353],{},[531,3349,3350],{},[495,3351,3352],{},"{ source: 'engineManaged', onCreate?, onUpdate? }",[531,3354,3355,3356,783,3359,2017,3361,779,3364,779,3367,2165,3370],{},"Each of ",[495,3357,3358],{},"onCreate",[495,3360,3294],{},[495,3362,3363],{},"{ kind: 'currentTimestamp' }",[495,3365,3366],{},"{ kind: 'currentUser' }",[495,3368,3369],{},"{ kind: 'randomUuid', version: 'v4' | 'v7' }",[495,3371,3372],{},"{ kind: 'static', valueEncoded }",[459,3374,3375,3376,3379,3380,3382,3383,3385,3386,3388,3389,1933,3393,2017,3396,3398],{},"Engine evaluates ",[495,3377,3378],{},"engineManaged"," defaults before calling your connector. When a caller omits a field that the operation's input offers, Engine fills in a value. A create uses ",[495,3381,3358],{},", and an update uses ",[495,3384,3294],{},". A field outside the member's ",[495,3387,2760],{}," gets no engine-managed value, and neither does a foreign key whose relation input isn't offered; see ",[472,3390,3392],{"href":3391},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Flimitations#foreign-keys-are-set-through-the-relation-on-create","Foreign Keys Are Set Through the Relation on Create",[495,3394,3395],{},"currentUser",[495,3397,2368],{}," when the request has no current user.",[459,3400,3401,3402,3404,3405,2165,3407,3409,3410,1933,3413,783,3415,3418,3419,3422,3423,3426,3427,3430],{},"Engine checks each default when the data source is created or reintrospected. A list field can't have one. An ",[495,3403,3378],{}," default needs ",[495,3406,3358],{},[495,3408,3294],{},", and a field type other than ",[495,3411,3412],{},"unsupported",[495,3414,3395],{},[495,3416,3417],{},"randomUuid"," need a ",[495,3420,3421],{},"uuid"," field, ",[495,3424,3425],{},"currentTimestamp"," a date or time field, and a ",[495,3428,3429],{},"static"," value must fit the field's type.",[459,3432,3433,3434,3436,3437,3441,3442,3444,3445,3448,3449,3451,3452,3454],{},"A read-only, non-nullable field without a default blocks ",[495,3435,1167],{}," on its collection. See ",[472,3438,3440],{"href":3439},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Foperations#follow-the-declaration-rules","Declaration Rules",". With the helpers, a field is read-only unless a ",[495,3443,2760],{}," list names it, so ",[495,3446,3447],{},"defineCollection"," rejects a ",[495,3450,1167],{}," that leaves such a field out of every ",[495,3453,2760],{}," list.",[699,3456,3458],{"id":3457},"example-schema-document","Example Schema Document",[459,3460,3461,3462,3465,3466,3468,3469,3472,3473,3476,3477,3480,3481,3483],{},"The full Art Institute connector, which ",[472,3463,246],{"href":3464},"\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fdata-source-mapping"," walks through, returns this document from ",[495,3467,2164],{},". It's shown for the ",[495,3470,3471],{},"artists"," collection and the relation; the ",[495,3474,3475],{},"artworks"," collection is left out. The connector builds it with the ",[472,3478,2576],{"href":3479},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fexperimental#build-a-schema",", and a hand-written ",[495,3482,2234],{}," has the same shape:",[1014,3485,3486],{},[1017,3487,3489],{"label":3488},"Introspected schema document (artists)",[1021,3490,3495],{"className":3491,"code":3492,"filename":3493,"language":3494,"meta":1026,"style":1026},"language-json shiki shiki-themes monospace-light monospace-light monospace-dark","{\n  \"collections\": [\n    {\n      \"name\": \"artists\",\n      \"isReadonly\": true,\n      \"fields\": [\n        {\n          \"name\": \"id\",\n          \"type\": {\n            \"name\": \"int32\"\n          },\n          \"isNullable\": false,\n          \"isList\": false,\n          \"isReadonly\": true\n        },\n        {\n          \"name\": \"title\",\n          \"type\": {\n            \"name\": \"string\",\n            \"params\": {\n              \"length\": \"unlimited\"\n            }\n          },\n          \"isNullable\": false,\n          \"isList\": false,\n          \"isReadonly\": true\n        },\n        {\n          \"name\": \"birthDate\",\n          \"type\": {\n            \"name\": \"int32\"\n          },\n          \"isNullable\": true,\n          \"isList\": false,\n          \"isReadonly\": true\n        },\n        {\n          \"name\": \"deathDate\",\n          \"type\": {\n            \"name\": \"int32\"\n          },\n          \"isNullable\": true,\n          \"isList\": false,\n          \"isReadonly\": true\n        }\n      ],\n      \"indexes\": [\n        {\n          \"name\": \"artists_pkey\",\n          \"kind\": \"primary\",\n          \"fields\": [\n            \"id\"\n          ]\n        }\n      ],\n      \"operations\": {\n        \"readMany\": {\n          \"filter\": {\n            \"fields\": {\n              \"id\": {\n                \"operators\": {\n                  \"equals\": {},\n                  \"in\": {}\n                }\n              },\n              \"birthDate\": {\n                \"operators\": {\n                  \"equals\": {},\n                  \"in\": {},\n                  \"lessThan\": {},\n                  \"lessThanOrEquals\": {},\n                  \"greaterThan\": {},\n                  \"greaterThanOrEquals\": {}\n                }\n              }\n            },\n            \"logicalOperators\": {\n              \"and\": {},\n              \"or\": {}\n            }\n          },\n          \"sort\": {\n            \"id\": {\n              \"directions\": [\n                \"ascending\",\n                \"descending\"\n              ]\n            },\n            \"birthDate\": {\n              \"directions\": [\n                \"ascending\",\n                \"descending\"\n              ]\n            }\n          },\n          \"limit\": {},\n          \"offset\": {},\n          \"output\": [\n            \"id\",\n            \"title\",\n            \"birthDate\",\n            \"deathDate\"\n          ],\n          \"meta\": {\n            \"totalCount\": true\n          }\n        },\n        \"readOne\": {\n          \"filter\": {\n            \"fields\": {\n              \"id\": {\n                \"operators\": {\n                  \"equals\": {},\n                  \"in\": {}\n                }\n              },\n              \"birthDate\": {\n                \"operators\": {\n                  \"equals\": {},\n                  \"in\": {},\n                  \"lessThan\": {},\n                  \"lessThanOrEquals\": {},\n                  \"greaterThan\": {},\n                  \"greaterThanOrEquals\": {}\n                }\n              }\n            },\n            \"logicalOperators\": {\n              \"and\": {},\n              \"or\": {}\n            }\n          },\n          \"output\": [\n            \"id\",\n            \"title\",\n            \"birthDate\",\n            \"deathDate\"\n          ]\n        }\n      }\n    }\n  ],\n  \"relations\": [\n    {\n      \"name\": \"artworks_artist\",\n      \"constrainedCollection\": \"artworks\",\n      \"constrainedFields\": [\n        \"artistId\"\n      ],\n      \"constrainedRelationFieldName\": \"artist\",\n      \"referencedCollection\": \"artists\",\n      \"referencedFields\": [\n        \"id\"\n      ],\n      \"referencedRelationFieldName\": \"artworks\",\n      \"onDelete\": \"noAction\",\n      \"onUpdate\": \"noAction\"\n    }\n  ]\n}\n","schema.json","json",[495,3496,3497,3502,3510,3515,3528,3539,3546,3551,3563,3570,3580,3585,3596,3607,3617,3622,3626,3637,3643,3654,3661,3671,3676,3680,3690,3700,3708,3712,3716,3727,3733,3741,3745,3755,3765,3773,3777,3781,3792,3798,3806,3810,3820,3830,3838,3843,3848,3855,3860,3872,3885,3893,3899,3905,3910,3915,3923,3931,3939,3947,3955,3963,3972,3981,3986,3992,4000,4007,4014,4021,4029,4037,4045,4053,4058,4064,4069,4077,4085,4093,4098,4103,4111,4119,4127,4135,4141,4147,4152,4160,4167,4174,4179,4184,4189,4194,4202,4210,4218,4225,4233,4240,4246,4252,4260,4270,4276,4281,4289,4296,4303,4310,4317,4324,4331,4336,4341,4348,4355,4362,4369,4376,4383,4390,4397,4402,4407,4412,4419,4426,4433,4438,4443,4450,4457,4464,4471,4476,4481,4486,4492,4498,4504,4512,4517,4529,4542,4550,4556,4561,4574,4586,4594,4600,4605,4617,4630,4641,4646,4652],{"__ignoreMap":1026},[1030,3498,3499],{"class":1032,"line":1033},[1030,3500,3501],{"class":1040},"{\n",[1030,3503,3504,3507],{"class":1032,"line":1060},[1030,3505,3506],{"class":1222},"  \"collections\"",[1030,3508,3509],{"class":1040},": [\n",[1030,3511,3512],{"class":1032,"line":1079},[1030,3513,3514],{"class":1040},"    {\n",[1030,3516,3517,3520,3522,3525],{"class":1032,"line":1098},[1030,3518,3519],{"class":1222},"      \"name\"",[1030,3521,1241],{"class":1040},[1030,3523,3524],{"class":1053},"\"artists\"",[1030,3526,3527],{"class":1040},",\n",[1030,3529,3530,3533,3535,3537],{"class":1032,"line":1117},[1030,3531,3532],{"class":1222},"      \"isReadonly\"",[1030,3534,1241],{"class":1040},[1030,3536,1865],{"class":1215},[1030,3538,3527],{"class":1040},[1030,3540,3541,3544],{"class":1032,"line":1141},[1030,3542,3543],{"class":1222},"      \"fields\"",[1030,3545,3509],{"class":1040},[1030,3547,3548],{"class":1032,"line":1160},[1030,3549,3550],{"class":1040},"        {\n",[1030,3552,3553,3556,3558,3561],{"class":1032,"line":1199},[1030,3554,3555],{"class":1222},"          \"name\"",[1030,3557,1241],{"class":1040},[1030,3559,3560],{"class":1053},"\"id\"",[1030,3562,3527],{"class":1040},[1030,3564,3565,3568],{"class":1032,"line":1206},[1030,3566,3567],{"class":1222},"          \"type\"",[1030,3569,1745],{"class":1040},[1030,3571,3572,3575,3577],{"class":1032,"line":1229},[1030,3573,3574],{"class":1222},"            \"name\"",[1030,3576,1241],{"class":1040},[1030,3578,3579],{"class":1053},"\"int32\"\n",[1030,3581,3582],{"class":1032,"line":1250},[1030,3583,3584],{"class":1040},"          },\n",[1030,3586,3587,3590,3592,3594],{"class":1032,"line":1273},[1030,3588,3589],{"class":1222},"          \"isNullable\"",[1030,3591,1241],{"class":1040},[1030,3593,2764],{"class":1215},[1030,3595,3527],{"class":1040},[1030,3597,3598,3601,3603,3605],{"class":1032,"line":1309},[1030,3599,3600],{"class":1222},"          \"isList\"",[1030,3602,1241],{"class":1040},[1030,3604,2764],{"class":1215},[1030,3606,3527],{"class":1040},[1030,3608,3609,3612,3614],{"class":1032,"line":1314},[1030,3610,3611],{"class":1222},"          \"isReadonly\"",[1030,3613,1241],{"class":1040},[1030,3615,3616],{"class":1215},"true\n",[1030,3618,3619],{"class":1032,"line":1323},[1030,3620,3621],{"class":1040},"        },\n",[1030,3623,3624],{"class":1032,"line":1332},[1030,3625,3550],{"class":1040},[1030,3627,3628,3630,3632,3635],{"class":1032,"line":1352},[1030,3629,3555],{"class":1222},[1030,3631,1241],{"class":1040},[1030,3633,3634],{"class":1053},"\"title\"",[1030,3636,3527],{"class":1040},[1030,3638,3639,3641],{"class":1032,"line":1358},[1030,3640,3567],{"class":1222},[1030,3642,1745],{"class":1040},[1030,3644,3645,3647,3649,3652],{"class":1032,"line":1363},[1030,3646,3574],{"class":1222},[1030,3648,1241],{"class":1040},[1030,3650,3651],{"class":1053},"\"string\"",[1030,3653,3527],{"class":1040},[1030,3655,3656,3659],{"class":1032,"line":1379},[1030,3657,3658],{"class":1222},"            \"params\"",[1030,3660,1745],{"class":1040},[1030,3662,3663,3666,3668],{"class":1032,"line":1386},[1030,3664,3665],{"class":1222},"              \"length\"",[1030,3667,1241],{"class":1040},[1030,3669,3670],{"class":1053},"\"unlimited\"\n",[1030,3672,3673],{"class":1032,"line":1392},[1030,3674,3675],{"class":1040},"            }\n",[1030,3677,3678],{"class":1032,"line":1441},[1030,3679,3584],{"class":1040},[1030,3681,3682,3684,3686,3688],{"class":1032,"line":1495},[1030,3683,3589],{"class":1222},[1030,3685,1241],{"class":1040},[1030,3687,2764],{"class":1215},[1030,3689,3527],{"class":1040},[1030,3691,3692,3694,3696,3698],{"class":1032,"line":1500},[1030,3693,3600],{"class":1222},[1030,3695,1241],{"class":1040},[1030,3697,2764],{"class":1215},[1030,3699,3527],{"class":1040},[1030,3701,3702,3704,3706],{"class":1032,"line":1518},[1030,3703,3611],{"class":1222},[1030,3705,1241],{"class":1040},[1030,3707,3616],{"class":1215},[1030,3709,3710],{"class":1032,"line":1553},[1030,3711,3621],{"class":1040},[1030,3713,3714],{"class":1032,"line":1584},[1030,3715,3550],{"class":1040},[1030,3717,3718,3720,3722,3725],{"class":1032,"line":1615},[1030,3719,3555],{"class":1222},[1030,3721,1241],{"class":1040},[1030,3723,3724],{"class":1053},"\"birthDate\"",[1030,3726,3527],{"class":1040},[1030,3728,3729,3731],{"class":1032,"line":1646},[1030,3730,3567],{"class":1222},[1030,3732,1745],{"class":1040},[1030,3734,3735,3737,3739],{"class":1032,"line":1677},[1030,3736,3574],{"class":1222},[1030,3738,1241],{"class":1040},[1030,3740,3579],{"class":1053},[1030,3742,3743],{"class":1032,"line":1708},[1030,3744,3584],{"class":1040},[1030,3746,3747,3749,3751,3753],{"class":1032,"line":1739},[1030,3748,3589],{"class":1222},[1030,3750,1241],{"class":1040},[1030,3752,1865],{"class":1215},[1030,3754,3527],{"class":1040},[1030,3756,3757,3759,3761,3763],{"class":1032,"line":1748},[1030,3758,3600],{"class":1222},[1030,3760,1241],{"class":1040},[1030,3762,2764],{"class":1215},[1030,3764,3527],{"class":1040},[1030,3766,3767,3769,3771],{"class":1032,"line":1754},[1030,3768,3611],{"class":1222},[1030,3770,1241],{"class":1040},[1030,3772,3616],{"class":1215},[1030,3774,3775],{"class":1032,"line":1774},[1030,3776,3621],{"class":1040},[1030,3778,3779],{"class":1032,"line":1804},[1030,3780,3550],{"class":1040},[1030,3782,3783,3785,3787,3790],{"class":1032,"line":1810},[1030,3784,3555],{"class":1222},[1030,3786,1241],{"class":1040},[1030,3788,3789],{"class":1053},"\"deathDate\"",[1030,3791,3527],{"class":1040},[1030,3793,3794,3796],{"class":1032,"line":1816},[1030,3795,3567],{"class":1222},[1030,3797,1745],{"class":1040},[1030,3799,3800,3802,3804],{"class":1032,"line":1821},[1030,3801,3574],{"class":1222},[1030,3803,1241],{"class":1040},[1030,3805,3579],{"class":1053},[1030,3807,3808],{"class":1032,"line":1826},[1030,3809,3584],{"class":1040},[1030,3811,3812,3814,3816,3818],{"class":1032,"line":1836},[1030,3813,3589],{"class":1222},[1030,3815,1241],{"class":1040},[1030,3817,1865],{"class":1215},[1030,3819,3527],{"class":1040},[1030,3821,3822,3824,3826,3828],{"class":1032,"line":1857},[1030,3823,3600],{"class":1222},[1030,3825,1241],{"class":1040},[1030,3827,2764],{"class":1215},[1030,3829,3527],{"class":1040},[1030,3831,3832,3834,3836],{"class":1032,"line":1870},[1030,3833,3611],{"class":1222},[1030,3835,1241],{"class":1040},[1030,3837,3616],{"class":1215},[1030,3839,3840],{"class":1032,"line":1875},[1030,3841,3842],{"class":1040},"        }\n",[1030,3844,3845],{"class":1032,"line":1881},[1030,3846,3847],{"class":1040},"      ],\n",[1030,3849,3850,3853],{"class":1032,"line":1887},[1030,3851,3852],{"class":1222},"      \"indexes\"",[1030,3854,3509],{"class":1040},[1030,3856,3858],{"class":1032,"line":3857},48,[1030,3859,3550],{"class":1040},[1030,3861,3863,3865,3867,3870],{"class":1032,"line":3862},49,[1030,3864,3555],{"class":1222},[1030,3866,1241],{"class":1040},[1030,3868,3869],{"class":1053},"\"artists_pkey\"",[1030,3871,3527],{"class":1040},[1030,3873,3875,3878,3880,3883],{"class":1032,"line":3874},50,[1030,3876,3877],{"class":1222},"          \"kind\"",[1030,3879,1241],{"class":1040},[1030,3881,3882],{"class":1053},"\"primary\"",[1030,3884,3527],{"class":1040},[1030,3886,3888,3891],{"class":1032,"line":3887},51,[1030,3889,3890],{"class":1222},"          \"fields\"",[1030,3892,3509],{"class":1040},[1030,3894,3896],{"class":1032,"line":3895},52,[1030,3897,3898],{"class":1053},"            \"id\"\n",[1030,3900,3902],{"class":1032,"line":3901},53,[1030,3903,3904],{"class":1040},"          ]\n",[1030,3906,3908],{"class":1032,"line":3907},54,[1030,3909,3842],{"class":1040},[1030,3911,3913],{"class":1032,"line":3912},55,[1030,3914,3847],{"class":1040},[1030,3916,3918,3921],{"class":1032,"line":3917},56,[1030,3919,3920],{"class":1222},"      \"operations\"",[1030,3922,1745],{"class":1040},[1030,3924,3926,3929],{"class":1032,"line":3925},57,[1030,3927,3928],{"class":1222},"        \"readMany\"",[1030,3930,1745],{"class":1040},[1030,3932,3934,3937],{"class":1032,"line":3933},58,[1030,3935,3936],{"class":1222},"          \"filter\"",[1030,3938,1745],{"class":1040},[1030,3940,3942,3945],{"class":1032,"line":3941},59,[1030,3943,3944],{"class":1222},"            \"fields\"",[1030,3946,1745],{"class":1040},[1030,3948,3950,3953],{"class":1032,"line":3949},60,[1030,3951,3952],{"class":1222},"              \"id\"",[1030,3954,1745],{"class":1040},[1030,3956,3958,3961],{"class":1032,"line":3957},61,[1030,3959,3960],{"class":1222},"                \"operators\"",[1030,3962,1745],{"class":1040},[1030,3964,3966,3969],{"class":1032,"line":3965},62,[1030,3967,3968],{"class":1222},"                  \"equals\"",[1030,3970,3971],{"class":1040},": {},\n",[1030,3973,3975,3978],{"class":1032,"line":3974},63,[1030,3976,3977],{"class":1222},"                  \"in\"",[1030,3979,3980],{"class":1040},": {}\n",[1030,3982,3984],{"class":1032,"line":3983},64,[1030,3985,1813],{"class":1040},[1030,3987,3989],{"class":1032,"line":3988},65,[1030,3990,3991],{"class":1040},"              },\n",[1030,3993,3995,3998],{"class":1032,"line":3994},66,[1030,3996,3997],{"class":1222},"              \"birthDate\"",[1030,3999,1745],{"class":1040},[1030,4001,4003,4005],{"class":1032,"line":4002},67,[1030,4004,3960],{"class":1222},[1030,4006,1745],{"class":1040},[1030,4008,4010,4012],{"class":1032,"line":4009},68,[1030,4011,3968],{"class":1222},[1030,4013,3971],{"class":1040},[1030,4015,4017,4019],{"class":1032,"line":4016},69,[1030,4018,3977],{"class":1222},[1030,4020,3971],{"class":1040},[1030,4022,4024,4027],{"class":1032,"line":4023},70,[1030,4025,4026],{"class":1222},"                  \"lessThan\"",[1030,4028,3971],{"class":1040},[1030,4030,4032,4035],{"class":1032,"line":4031},71,[1030,4033,4034],{"class":1222},"                  \"lessThanOrEquals\"",[1030,4036,3971],{"class":1040},[1030,4038,4040,4043],{"class":1032,"line":4039},72,[1030,4041,4042],{"class":1222},"                  \"greaterThan\"",[1030,4044,3971],{"class":1040},[1030,4046,4048,4051],{"class":1032,"line":4047},73,[1030,4049,4050],{"class":1222},"                  \"greaterThanOrEquals\"",[1030,4052,3980],{"class":1040},[1030,4054,4056],{"class":1032,"line":4055},74,[1030,4057,1813],{"class":1040},[1030,4059,4061],{"class":1032,"line":4060},75,[1030,4062,4063],{"class":1040},"              }\n",[1030,4065,4067],{"class":1032,"line":4066},76,[1030,4068,1355],{"class":1040},[1030,4070,4072,4075],{"class":1032,"line":4071},77,[1030,4073,4074],{"class":1222},"            \"logicalOperators\"",[1030,4076,1745],{"class":1040},[1030,4078,4080,4083],{"class":1032,"line":4079},78,[1030,4081,4082],{"class":1222},"              \"and\"",[1030,4084,3971],{"class":1040},[1030,4086,4088,4091],{"class":1032,"line":4087},79,[1030,4089,4090],{"class":1222},"              \"or\"",[1030,4092,3980],{"class":1040},[1030,4094,4096],{"class":1032,"line":4095},80,[1030,4097,3675],{"class":1040},[1030,4099,4101],{"class":1032,"line":4100},81,[1030,4102,3584],{"class":1040},[1030,4104,4106,4109],{"class":1032,"line":4105},82,[1030,4107,4108],{"class":1222},"          \"sort\"",[1030,4110,1745],{"class":1040},[1030,4112,4114,4117],{"class":1032,"line":4113},83,[1030,4115,4116],{"class":1222},"            \"id\"",[1030,4118,1745],{"class":1040},[1030,4120,4122,4125],{"class":1032,"line":4121},84,[1030,4123,4124],{"class":1222},"              \"directions\"",[1030,4126,3509],{"class":1040},[1030,4128,4130,4133],{"class":1032,"line":4129},85,[1030,4131,4132],{"class":1053},"                \"ascending\"",[1030,4134,3527],{"class":1040},[1030,4136,4138],{"class":1032,"line":4137},86,[1030,4139,4140],{"class":1053},"                \"descending\"\n",[1030,4142,4144],{"class":1032,"line":4143},87,[1030,4145,4146],{"class":1040},"              ]\n",[1030,4148,4150],{"class":1032,"line":4149},88,[1030,4151,1355],{"class":1040},[1030,4153,4155,4158],{"class":1032,"line":4154},89,[1030,4156,4157],{"class":1222},"            \"birthDate\"",[1030,4159,1745],{"class":1040},[1030,4161,4163,4165],{"class":1032,"line":4162},90,[1030,4164,4124],{"class":1222},[1030,4166,3509],{"class":1040},[1030,4168,4170,4172],{"class":1032,"line":4169},91,[1030,4171,4132],{"class":1053},[1030,4173,3527],{"class":1040},[1030,4175,4177],{"class":1032,"line":4176},92,[1030,4178,4140],{"class":1053},[1030,4180,4182],{"class":1032,"line":4181},93,[1030,4183,4146],{"class":1040},[1030,4185,4187],{"class":1032,"line":4186},94,[1030,4188,3675],{"class":1040},[1030,4190,4192],{"class":1032,"line":4191},95,[1030,4193,3584],{"class":1040},[1030,4195,4197,4200],{"class":1032,"line":4196},96,[1030,4198,4199],{"class":1222},"          \"limit\"",[1030,4201,3971],{"class":1040},[1030,4203,4205,4208],{"class":1032,"line":4204},97,[1030,4206,4207],{"class":1222},"          \"offset\"",[1030,4209,3971],{"class":1040},[1030,4211,4213,4216],{"class":1032,"line":4212},98,[1030,4214,4215],{"class":1222},"          \"output\"",[1030,4217,3509],{"class":1040},[1030,4219,4221,4223],{"class":1032,"line":4220},99,[1030,4222,4116],{"class":1053},[1030,4224,3527],{"class":1040},[1030,4226,4228,4231],{"class":1032,"line":4227},100,[1030,4229,4230],{"class":1053},"            \"title\"",[1030,4232,3527],{"class":1040},[1030,4234,4236,4238],{"class":1032,"line":4235},101,[1030,4237,4157],{"class":1053},[1030,4239,3527],{"class":1040},[1030,4241,4243],{"class":1032,"line":4242},102,[1030,4244,4245],{"class":1053},"            \"deathDate\"\n",[1030,4247,4249],{"class":1032,"line":4248},103,[1030,4250,4251],{"class":1040},"          ],\n",[1030,4253,4255,4258],{"class":1032,"line":4254},104,[1030,4256,4257],{"class":1222},"          \"meta\"",[1030,4259,1745],{"class":1040},[1030,4261,4263,4266,4268],{"class":1032,"line":4262},105,[1030,4264,4265],{"class":1222},"            \"totalCount\"",[1030,4267,1241],{"class":1040},[1030,4269,3616],{"class":1215},[1030,4271,4273],{"class":1032,"line":4272},106,[1030,4274,4275],{"class":1040},"          }\n",[1030,4277,4279],{"class":1032,"line":4278},107,[1030,4280,3621],{"class":1040},[1030,4282,4284,4287],{"class":1032,"line":4283},108,[1030,4285,4286],{"class":1222},"        \"readOne\"",[1030,4288,1745],{"class":1040},[1030,4290,4292,4294],{"class":1032,"line":4291},109,[1030,4293,3936],{"class":1222},[1030,4295,1745],{"class":1040},[1030,4297,4299,4301],{"class":1032,"line":4298},110,[1030,4300,3944],{"class":1222},[1030,4302,1745],{"class":1040},[1030,4304,4306,4308],{"class":1032,"line":4305},111,[1030,4307,3952],{"class":1222},[1030,4309,1745],{"class":1040},[1030,4311,4313,4315],{"class":1032,"line":4312},112,[1030,4314,3960],{"class":1222},[1030,4316,1745],{"class":1040},[1030,4318,4320,4322],{"class":1032,"line":4319},113,[1030,4321,3968],{"class":1222},[1030,4323,3971],{"class":1040},[1030,4325,4327,4329],{"class":1032,"line":4326},114,[1030,4328,3977],{"class":1222},[1030,4330,3980],{"class":1040},[1030,4332,4334],{"class":1032,"line":4333},115,[1030,4335,1813],{"class":1040},[1030,4337,4339],{"class":1032,"line":4338},116,[1030,4340,3991],{"class":1040},[1030,4342,4344,4346],{"class":1032,"line":4343},117,[1030,4345,3997],{"class":1222},[1030,4347,1745],{"class":1040},[1030,4349,4351,4353],{"class":1032,"line":4350},118,[1030,4352,3960],{"class":1222},[1030,4354,1745],{"class":1040},[1030,4356,4358,4360],{"class":1032,"line":4357},119,[1030,4359,3968],{"class":1222},[1030,4361,3971],{"class":1040},[1030,4363,4365,4367],{"class":1032,"line":4364},120,[1030,4366,3977],{"class":1222},[1030,4368,3971],{"class":1040},[1030,4370,4372,4374],{"class":1032,"line":4371},121,[1030,4373,4026],{"class":1222},[1030,4375,3971],{"class":1040},[1030,4377,4379,4381],{"class":1032,"line":4378},122,[1030,4380,4034],{"class":1222},[1030,4382,3971],{"class":1040},[1030,4384,4386,4388],{"class":1032,"line":4385},123,[1030,4387,4042],{"class":1222},[1030,4389,3971],{"class":1040},[1030,4391,4393,4395],{"class":1032,"line":4392},124,[1030,4394,4050],{"class":1222},[1030,4396,3980],{"class":1040},[1030,4398,4400],{"class":1032,"line":4399},125,[1030,4401,1813],{"class":1040},[1030,4403,4405],{"class":1032,"line":4404},126,[1030,4406,4063],{"class":1040},[1030,4408,4410],{"class":1032,"line":4409},127,[1030,4411,1355],{"class":1040},[1030,4413,4415,4417],{"class":1032,"line":4414},128,[1030,4416,4074],{"class":1222},[1030,4418,1745],{"class":1040},[1030,4420,4422,4424],{"class":1032,"line":4421},129,[1030,4423,4082],{"class":1222},[1030,4425,3971],{"class":1040},[1030,4427,4429,4431],{"class":1032,"line":4428},130,[1030,4430,4090],{"class":1222},[1030,4432,3980],{"class":1040},[1030,4434,4436],{"class":1032,"line":4435},131,[1030,4437,3675],{"class":1040},[1030,4439,4441],{"class":1032,"line":4440},132,[1030,4442,3584],{"class":1040},[1030,4444,4446,4448],{"class":1032,"line":4445},133,[1030,4447,4215],{"class":1222},[1030,4449,3509],{"class":1040},[1030,4451,4453,4455],{"class":1032,"line":4452},134,[1030,4454,4116],{"class":1053},[1030,4456,3527],{"class":1040},[1030,4458,4460,4462],{"class":1032,"line":4459},135,[1030,4461,4230],{"class":1053},[1030,4463,3527],{"class":1040},[1030,4465,4467,4469],{"class":1032,"line":4466},136,[1030,4468,4157],{"class":1053},[1030,4470,3527],{"class":1040},[1030,4472,4474],{"class":1032,"line":4473},137,[1030,4475,4245],{"class":1053},[1030,4477,4479],{"class":1032,"line":4478},138,[1030,4480,3904],{"class":1040},[1030,4482,4484],{"class":1032,"line":4483},139,[1030,4485,3842],{"class":1040},[1030,4487,4489],{"class":1032,"line":4488},140,[1030,4490,4491],{"class":1040},"      }\n",[1030,4493,4495],{"class":1032,"line":4494},141,[1030,4496,4497],{"class":1040},"    }\n",[1030,4499,4501],{"class":1032,"line":4500},142,[1030,4502,4503],{"class":1040},"  ],\n",[1030,4505,4507,4510],{"class":1032,"line":4506},143,[1030,4508,4509],{"class":1222},"  \"relations\"",[1030,4511,3509],{"class":1040},[1030,4513,4515],{"class":1032,"line":4514},144,[1030,4516,3514],{"class":1040},[1030,4518,4520,4522,4524,4527],{"class":1032,"line":4519},145,[1030,4521,3519],{"class":1222},[1030,4523,1241],{"class":1040},[1030,4525,4526],{"class":1053},"\"artworks_artist\"",[1030,4528,3527],{"class":1040},[1030,4530,4532,4535,4537,4540],{"class":1032,"line":4531},146,[1030,4533,4534],{"class":1222},"      \"constrainedCollection\"",[1030,4536,1241],{"class":1040},[1030,4538,4539],{"class":1053},"\"artworks\"",[1030,4541,3527],{"class":1040},[1030,4543,4545,4548],{"class":1032,"line":4544},147,[1030,4546,4547],{"class":1222},"      \"constrainedFields\"",[1030,4549,3509],{"class":1040},[1030,4551,4553],{"class":1032,"line":4552},148,[1030,4554,4555],{"class":1053},"        \"artistId\"\n",[1030,4557,4559],{"class":1032,"line":4558},149,[1030,4560,3847],{"class":1040},[1030,4562,4564,4567,4569,4572],{"class":1032,"line":4563},150,[1030,4565,4566],{"class":1222},"      \"constrainedRelationFieldName\"",[1030,4568,1241],{"class":1040},[1030,4570,4571],{"class":1053},"\"artist\"",[1030,4573,3527],{"class":1040},[1030,4575,4577,4580,4582,4584],{"class":1032,"line":4576},151,[1030,4578,4579],{"class":1222},"      \"referencedCollection\"",[1030,4581,1241],{"class":1040},[1030,4583,3524],{"class":1053},[1030,4585,3527],{"class":1040},[1030,4587,4589,4592],{"class":1032,"line":4588},152,[1030,4590,4591],{"class":1222},"      \"referencedFields\"",[1030,4593,3509],{"class":1040},[1030,4595,4597],{"class":1032,"line":4596},153,[1030,4598,4599],{"class":1053},"        \"id\"\n",[1030,4601,4603],{"class":1032,"line":4602},154,[1030,4604,3847],{"class":1040},[1030,4606,4608,4611,4613,4615],{"class":1032,"line":4607},155,[1030,4609,4610],{"class":1222},"      \"referencedRelationFieldName\"",[1030,4612,1241],{"class":1040},[1030,4614,4539],{"class":1053},[1030,4616,3527],{"class":1040},[1030,4618,4620,4623,4625,4628],{"class":1032,"line":4619},156,[1030,4621,4622],{"class":1222},"      \"onDelete\"",[1030,4624,1241],{"class":1040},[1030,4626,4627],{"class":1053},"\"noAction\"",[1030,4629,3527],{"class":1040},[1030,4631,4633,4636,4638],{"class":1032,"line":4632},157,[1030,4634,4635],{"class":1222},"      \"onUpdate\"",[1030,4637,1241],{"class":1040},[1030,4639,4640],{"class":1053},"\"noAction\"\n",[1030,4642,4644],{"class":1032,"line":4643},158,[1030,4645,4497],{"class":1040},[1030,4647,4649],{"class":1032,"line":4648},159,[1030,4650,4651],{"class":1040},"  ]\n",[1030,4653,4655],{"class":1032,"line":4654},160,[1030,4656,4657],{"class":1040},"}\n",[459,4659,4660,783,4663,4666,4667,4669,4670,783,4676,4682],{},[495,4661,4662],{},"operators",[495,4664,4665],{},"logicalOperators"," are maps from each operator to its options. No operator has options yet, so each value is ",[495,4668,2606],{},". The helpers ",[472,4671,4673],{"href":4672},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fexperimental#filterfield",[495,4674,4675],{},"filter.field",[472,4677,4679],{"href":4678},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fexperimental#filterlogical",[495,4680,4681],{},"filter.logical"," build these maps for you.",[454,4684,4686],{"id":4685},"build-a-schema-with-the-helpers","Build a Schema with the Helpers",[459,4688,4689,4692,4693,4695,4696,4698,4699,4701,4702,4704],{},[495,4690,4691],{},"@monospace\u002Fextension-kit\u002Fdata-connector\u002Fexperimental"," builds the same ",[495,4694,2234],{}," from typed definitions, checks them, and derives the ",[495,4697,2560],{}," flags from ",[495,4700,2583],{},". The helpers are optional, and experimental within the experimental kit. ",[472,4703,401],{"href":970}," documents each helper, the checks it runs, and the Art Institute and Stripe schemas built with them.",[454,4706,2278],{"id":4707},"read-a-query-request",[459,4709,4710,4711,4713,4714,1447,4718,4724,4725,4729,4730,4733],{},"Engine calls ",[495,4712,1374],{}," with an envelope that holds one ",[472,4715,4717],{"href":4716},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol#operationserialized","operation",[472,4719,4721],{"href":4720},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol#queryserialized",[495,4722,4723],{},"QuerySerialized","). The handler receives it as a ",[472,4726,4727],{"href":2259},[495,4728,2262],{},", and a function typed with ",[495,4731,4732],{},"QueryRequest\u003C'readOne'>"," receives only that operation:",[1021,4735,4738],{"className":3491,"code":4736,"filename":4737,"language":3494,"meta":1026,"style":1026},"{\n  \"query\": {\n    \"op\": \"readMany\",\n    \"collection\": \"articles\",\n    \"select\": [\"id\", \"title\", \"wordCount\"],\n    \"filter\": { \"cmp\": \"greaterThan\", \"left\": { \"field\": \"wordCount\" }, \"right\": { \"value\": 1000 } },\n    \"sort\": [{ \"field\": \"title\", \"direction\": \"ascending\" }],\n    \"limit\": 100,\n    \"offset\": 0\n  }\n}\n","request.json",[495,4739,4740,4744,4751,4763,4775,4797,4846,4873,4885,4895,4900],{"__ignoreMap":1026},[1030,4741,4742],{"class":1032,"line":1033},[1030,4743,3501],{"class":1040},[1030,4745,4746,4749],{"class":1032,"line":1060},[1030,4747,4748],{"class":1222},"  \"query\"",[1030,4750,1745],{"class":1040},[1030,4752,4753,4756,4758,4761],{"class":1032,"line":1079},[1030,4754,4755],{"class":1222},"    \"op\"",[1030,4757,1241],{"class":1040},[1030,4759,4760],{"class":1053},"\"readMany\"",[1030,4762,3527],{"class":1040},[1030,4764,4765,4768,4770,4773],{"class":1032,"line":1098},[1030,4766,4767],{"class":1222},"    \"collection\"",[1030,4769,1241],{"class":1040},[1030,4771,4772],{"class":1053},"\"articles\"",[1030,4774,3527],{"class":1040},[1030,4776,4777,4780,4783,4785,4787,4789,4791,4794],{"class":1032,"line":1117},[1030,4778,4779],{"class":1222},"    \"select\"",[1030,4781,4782],{"class":1040},": [",[1030,4784,3560],{"class":1053},[1030,4786,779],{"class":1040},[1030,4788,3634],{"class":1053},[1030,4790,779],{"class":1040},[1030,4792,4793],{"class":1053},"\"wordCount\"",[1030,4795,4796],{"class":1040},"],\n",[1030,4798,4799,4802,4805,4808,4810,4813,4815,4818,4820,4823,4825,4827,4830,4833,4835,4838,4840,4843],{"class":1032,"line":1141},[1030,4800,4801],{"class":1222},"    \"filter\"",[1030,4803,4804],{"class":1040},": { ",[1030,4806,4807],{"class":1222},"\"cmp\"",[1030,4809,1241],{"class":1040},[1030,4811,4812],{"class":1053},"\"greaterThan\"",[1030,4814,779],{"class":1040},[1030,4816,4817],{"class":1222},"\"left\"",[1030,4819,4804],{"class":1040},[1030,4821,4822],{"class":1222},"\"field\"",[1030,4824,1241],{"class":1040},[1030,4826,4793],{"class":1053},[1030,4828,4829],{"class":1040}," }, ",[1030,4831,4832],{"class":1222},"\"right\"",[1030,4834,4804],{"class":1040},[1030,4836,4837],{"class":1222},"\"value\"",[1030,4839,1241],{"class":1040},[1030,4841,4842],{"class":1215},"1000",[1030,4844,4845],{"class":1040}," } },\n",[1030,4847,4848,4851,4854,4856,4858,4860,4862,4865,4867,4870],{"class":1032,"line":1160},[1030,4849,4850],{"class":1222},"    \"sort\"",[1030,4852,4853],{"class":1040},": [{ ",[1030,4855,4822],{"class":1222},[1030,4857,1241],{"class":1040},[1030,4859,3634],{"class":1053},[1030,4861,779],{"class":1040},[1030,4863,4864],{"class":1222},"\"direction\"",[1030,4866,1241],{"class":1040},[1030,4868,4869],{"class":1053},"\"ascending\"",[1030,4871,4872],{"class":1040}," }],\n",[1030,4874,4875,4878,4880,4883],{"class":1032,"line":1199},[1030,4876,4877],{"class":1222},"    \"limit\"",[1030,4879,1241],{"class":1040},[1030,4881,4882],{"class":1215},"100",[1030,4884,3527],{"class":1040},[1030,4886,4887,4890,4892],{"class":1032,"line":1206},[1030,4888,4889],{"class":1222},"    \"offset\"",[1030,4891,1241],{"class":1040},[1030,4893,4894],{"class":1215},"0\n",[1030,4896,4897],{"class":1032,"line":1229},[1030,4898,4899],{"class":1040},"  }\n",[1030,4901,4902],{"class":1032,"line":1250},[1030,4903,4657],{"class":1040},[459,4905,4906,4907,779,4909,4911,4912,4914,4915,4917,4918,939],{},"Every operation carries ",[495,4908,1512],{},[495,4910,1428],{},", and ",[495,4913,1407],{}," when the collection is in one. Collections and fields are named by their ",[495,4916,596],{},", never their ",[495,4919,2502],{},[699,4921,4922],{"id":2583},"Operations",[504,4924,4925,4939],{},[507,4926,4927],{},[510,4928,4929,4933,4936],{},[513,4930,4931],{},[495,4932,1512],{},[513,4934,4935],{},"Other properties",[513,4937,4938],{},"Answer with",[526,4940,4941,4981,5005,5023,5043,5066,5083],{},[510,4942,4943,4947,4967],{},[531,4944,4945],{},[495,4946,1124],{},[531,4948,4949,779,4952,779,4955,779,4958,779,4961,779,4964],{},[495,4950,4951],{},"select?",[495,4953,4954],{},"filter?",[495,4956,4957],{},"sort?",[495,4959,4960],{},"limit?",[495,4962,4963],{},"offset?",[495,4965,4966],{},"count?",[531,4968,4969,4972,4973,4976,4977],{},[495,4970,4971],{},"records",": the matching items, or ",[495,4974,4975],{},"totalCount"," on a ",[472,4978,4980],{"href":4979},"#count-reads","count read",[510,4982,4983,4987,4997],{},[531,4984,4985],{},[495,4986,1129],{},[531,4988,4989,779,4992,779,4995],{},[495,4990,4991],{},"select",[495,4993,4994],{},"key",[495,4996,4954],{},[531,4998,4999,5002,5003],{},[495,5000,5001],{},"record",": the item, or ",[495,5004,2368],{},[510,5006,5007,5011,5018],{},[531,5008,5009],{},[495,5010,1167],{},[531,5012,5013,779,5015,5017],{},[495,5014,4991],{},[495,5016,2760],{}," (an array, one object per item to create)",[531,5019,5020,5022],{},[495,5021,4971],{},": the created items",[510,5024,5025,5029,5038],{},[531,5026,5027],{},[495,5028,1182],{},[531,5030,5031,779,5033,779,5035,5037],{},[495,5032,4991],{},[495,5034,4954],{},[495,5036,2760],{}," (one object applied to every match)",[531,5039,5040,5042],{},[495,5041,4971],{},": the updated items",[510,5044,5045,5049,5059],{},[531,5046,5047],{},[495,5048,1187],{},[531,5050,5051,779,5053,779,5055,779,5057],{},[495,5052,4991],{},[495,5054,4994],{},[495,5056,4954],{},[495,5058,2760],{},[531,5060,5061,5063,5064],{},[495,5062,5001],{},": the updated item, or ",[495,5065,2368],{},[510,5067,5068,5072,5078],{},[531,5069,5070],{},[495,5071,1172],{},[531,5073,5074,779,5076],{},[495,5075,4991],{},[495,5077,4954],{},[531,5079,5080,5082],{},[495,5081,4971],{},": the deleted items",[510,5084,5085,5089,5097],{},[531,5086,5087],{},[495,5088,1177],{},[531,5090,5091,779,5093,779,5095],{},[495,5092,4991],{},[495,5094,4994],{},[495,5096,4954],{},[531,5098,5099,5101,5102],{},[495,5100,5001],{},": the deleted item, or ",[495,5103,2368],{},[882,5105,5106,5113,5145,5156,5166,5178],{},[885,5107,5108,5112],{},[463,5109,5110],{},[495,5111,4991],{}," lists the fields each returned item must carry.",[885,5114,5115,5118,5119,779,5121,5123,5124,5126,5127,2165,5129,5131,5132,783,5134,5136,5137,5140,5141,939],{},[463,5116,5117],{},"The query capabilities decide what a write selects."," Without ",[495,5120,778],{},[495,5122,1167],{}," arrives with ",[495,5125,4991],{}," set to the stable-ID fields only, whatever the caller selected; answer each created item with them. Without ",[495,5128,782],{},[495,5130,786],{},", updates and deletes arrive as ",[495,5133,1182],{},[495,5135,1172],{}," with ",[495,5138,5139],{},"select: []",", filtered by the stable IDs Engine read first. See ",[472,5142,5144],{"href":5143},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Foperations#declare-query-capabilities","Declare Query Capabilities",[885,5146,5147,1960,5153,5155],{},[463,5148,5149,5150,5152],{},"Engine sends one ",[495,5151,1167],{}," per item.",[495,5154,2760],{}," holds one object.",[885,5157,5158,5162,5163,5165],{},[463,5159,5160],{},[495,5161,2760],{}," objects are keyed by field name and hold only fields the member's ",[495,5164,2760],{}," declares.",[885,5167,5168,5175,5176,939],{},[463,5169,5170,5171,5174],{},"An absent ",[495,5172,5173],{},"filter"," adds no condition."," A keyed operation still targets only its ",[495,5177,4994],{},[885,5179,5180,5186,5187,5190,5191,939],{},[463,5181,5170,5182,5185],{},[495,5183,5184],{},"limit"," means no limit."," An absent ",[495,5188,5189],{},"offset"," means ",[495,5192,5193],{},"0",[699,5195,5197],{"id":5196},"keyed-operations","Keyed Operations",[459,5199,5200,779,5202,783,5204,1447,5206,5212,5213,5215,5216,5218],{},[495,5201,1129],{},[495,5203,1187],{},[495,5205,1177],{},[472,5207,5209],{"href":5208},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol#keyedoperation",[495,5210,5211],{},"KeyedOperation",") address one item by ",[495,5214,4994],{},", an object keyed by the collection's primary-key field. Engine offers keyed operations only on a single-field primary key, so ",[495,5217,4994],{}," has one entry.",[1021,5220,5222],{"className":3491,"code":5221,"filename":4737,"language":3494,"meta":1026,"style":1026},"{\n  \"query\": {\n    \"op\": \"updateOne\",\n    \"collection\": \"articles\",\n    \"key\": { \"id\": \"art_42\" },\n    \"filter\": { \"cmp\": \"equals\", \"left\": { \"field\": \"status\" }, \"right\": { \"value\": \"draft\" } },\n    \"data\": { \"status\": \"published\" },\n    \"select\": [\"id\", \"status\"]\n  }\n}\n",[495,5223,5224,5228,5234,5245,5255,5272,5313,5329,5344,5348],{"__ignoreMap":1026},[1030,5225,5226],{"class":1032,"line":1033},[1030,5227,3501],{"class":1040},[1030,5229,5230,5232],{"class":1032,"line":1060},[1030,5231,4748],{"class":1222},[1030,5233,1745],{"class":1040},[1030,5235,5236,5238,5240,5243],{"class":1032,"line":1079},[1030,5237,4755],{"class":1222},[1030,5239,1241],{"class":1040},[1030,5241,5242],{"class":1053},"\"updateOne\"",[1030,5244,3527],{"class":1040},[1030,5246,5247,5249,5251,5253],{"class":1032,"line":1098},[1030,5248,4767],{"class":1222},[1030,5250,1241],{"class":1040},[1030,5252,4772],{"class":1053},[1030,5254,3527],{"class":1040},[1030,5256,5257,5260,5262,5264,5266,5269],{"class":1032,"line":1117},[1030,5258,5259],{"class":1222},"    \"key\"",[1030,5261,4804],{"class":1040},[1030,5263,3560],{"class":1222},[1030,5265,1241],{"class":1040},[1030,5267,5268],{"class":1053},"\"art_42\"",[1030,5270,5271],{"class":1040}," },\n",[1030,5273,5274,5276,5278,5280,5282,5285,5287,5289,5291,5293,5295,5298,5300,5302,5304,5306,5308,5311],{"class":1032,"line":1141},[1030,5275,4801],{"class":1222},[1030,5277,4804],{"class":1040},[1030,5279,4807],{"class":1222},[1030,5281,1241],{"class":1040},[1030,5283,5284],{"class":1053},"\"equals\"",[1030,5286,779],{"class":1040},[1030,5288,4817],{"class":1222},[1030,5290,4804],{"class":1040},[1030,5292,4822],{"class":1222},[1030,5294,1241],{"class":1040},[1030,5296,5297],{"class":1053},"\"status\"",[1030,5299,4829],{"class":1040},[1030,5301,4832],{"class":1222},[1030,5303,4804],{"class":1040},[1030,5305,4837],{"class":1222},[1030,5307,1241],{"class":1040},[1030,5309,5310],{"class":1053},"\"draft\"",[1030,5312,4845],{"class":1040},[1030,5314,5315,5318,5320,5322,5324,5327],{"class":1032,"line":1160},[1030,5316,5317],{"class":1222},"    \"data\"",[1030,5319,4804],{"class":1040},[1030,5321,5297],{"class":1222},[1030,5323,1241],{"class":1040},[1030,5325,5326],{"class":1053},"\"published\"",[1030,5328,5271],{"class":1040},[1030,5330,5331,5333,5335,5337,5339,5341],{"class":1032,"line":1199},[1030,5332,4779],{"class":1222},[1030,5334,4782],{"class":1040},[1030,5336,3560],{"class":1053},[1030,5338,779],{"class":1040},[1030,5340,5297],{"class":1053},[1030,5342,5343],{"class":1040},"]\n",[1030,5345,5346],{"class":1032,"line":1206},[1030,5347,4899],{"class":1040},[1030,5349,5350],{"class":1032,"line":1229},[1030,5351,4657],{"class":1040},[882,5353,5354,5362,5377,5394,5419],{},[885,5355,5356,5361],{},[463,5357,5358,5360],{},[495,5359,5173],{}," is a guard."," The item must match both the key and the guard. Otherwise change nothing.",[885,5363,5364,5369,5370,5373,5374,5376],{},[463,5365,5366,5367,939],{},"Answer ",[495,5368,5001],{}," Answer ",[495,5371,5372],{},"{ \"record\": \u003Citem> }"," with the item the operation read, updated or deleted, carrying every field in ",[495,5375,4991],{},". The answer takes no other key.",[885,5378,5379,5385,5386,5389,5390,5393],{},[463,5380,5366,5381,5384],{},[495,5382,5383],{},"record: null"," on a miss."," When the key matches no item, or the item fails the guard, answer ",[495,5387,5388],{},"{ \"record\": null }"," and change nothing. A miss isn't an error, so don't throw. Callers see ",[495,5391,5392],{},"404"," \"No record found\".",[885,5395,5396,5401,5402,5405,5406,5409,5410,5412,5413,5415,5416,5418],{},[463,5397,5398,5399,939],{},"Never answer ",[495,5400,4971],{}," Engine fails a keyed operation that answers ",[495,5403,5404],{},"{ \"records\": [...] }",", whatever it holds, with ",[495,5407,5408],{},"500"," \"Invalid extension response\" and the reason \"",[495,5411,1374],{}," answered with something this protocol does not define: unknown field ",[495,5414,4971],{},", expected ",[495,5417,5001],{},"\". A write your connector made stays applied.",[885,5420,5421,5424,5425,5427,5428,4911,5430,5432,5433,5435,5436,2165,5438,5440],{},[463,5422,5423],{},"Keyed writes need their capability."," Engine sends ",[495,5426,1187],{}," only to a connector that declares ",[495,5429,782],{},[495,5431,1177],{}," only with ",[495,5434,786],{},". Without it, the caller's keyed write reaches your connector as ",[495,5437,1182],{},[495,5439,1172],{}," by stable ID.",[1021,5442,5445],{"className":3491,"code":5443,"filename":5444,"language":3494,"meta":1026,"style":1026},"{ \"record\": { \"id\": \"art_42\", \"status\": \"published\" } }\n","response.json",[495,5446,5447],{"__ignoreMap":1026},[1030,5448,5449,5452,5455,5457,5459,5461,5463,5465,5467,5469,5471],{"class":1032,"line":1033},[1030,5450,5451],{"class":1040},"{ ",[1030,5453,5454],{"class":1222},"\"record\"",[1030,5456,4804],{"class":1040},[1030,5458,3560],{"class":1222},[1030,5460,1241],{"class":1040},[1030,5462,5268],{"class":1053},[1030,5464,779],{"class":1040},[1030,5466,5297],{"class":1222},[1030,5468,1241],{"class":1040},[1030,5470,5326],{"class":1053},[1030,5472,5473],{"class":1040}," } }\n",[459,5475,2180,5476,939],{},[472,5477,3035],{"href":3034},[699,5479,5481],{"id":5480},"count-reads","Count Reads",[459,5483,5484,5485,5487,5488,5490,5491,939],{},"When a caller asks for the total count, Engine first derives it from the page it read. A page shorter than ",[495,5486,5184],{},", or a read without ",[495,5489,5184],{},", establishes the total, unless it's empty at a non-zero ",[495,5492,5189],{},[459,5494,5495,5496,5136,5498,779,5501,5504,5505,5507,5508,5510,5511,5513,5514,5516,5517,5519,5520,783,5522,5524],{},"Otherwise Engine sends a separate ",[495,5497,1124],{},[495,5499,5500],{},"count: true",[495,5502,5503],{},"limit: 0"," and no ",[495,5506,4991],{},". Recognize it by ",[495,5509,5500],{},": an ordinary read with an empty selection also arrives without ",[495,5512,4991],{},". Answer with ",[495,5515,4975],{},", the number of items matching ",[495,5518,5173],{},", ignoring ",[495,5521,5184],{},[495,5523,5189],{},". Return no items.",[1021,5526,5528],{"className":3491,"code":5527,"filename":5444,"language":3494,"meta":1026,"style":1026},"{ \"totalCount\": 1284 }\n",[495,5529,5530],{"__ignoreMap":1026},[1030,5531,5532,5534,5537,5539,5542],{"class":1032,"line":1033},[1030,5533,5451],{"class":1040},[1030,5535,5536],{"class":1222},"\"totalCount\"",[1030,5538,1241],{"class":1040},[1030,5540,5541],{"class":1215},"1284",[1030,5543,5544],{"class":1040}," }\n",[459,5546,5547,5548,5550],{},"If you omit ",[495,5549,4975],{},", the caller's response carries no total.",[699,5552,5554],{"id":5553},"filters","Filters",[459,5556,5557,5563],{},[472,5558,5560],{"href":5559},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol#filterserialized",[495,5561,5562],{},"FilterSerialized"," is an untagged union. Each node has exactly one of these shapes:",[504,5565,5566,5574],{},[507,5567,5568],{},[510,5569,5570,5572],{},[513,5571,3330],{},[513,5573,3333],{},[526,5575,5576,5586,5596,5606,5646],{},[510,5577,5578,5583],{},[531,5579,5580],{},[495,5581,5582],{},"{ and: FilterSerialized[] }",[531,5584,5585],{},"Every child matches",[510,5587,5588,5593],{},[531,5589,5590],{},[495,5591,5592],{},"{ or: FilterSerialized[] }",[531,5594,5595],{},"At least one child matches",[510,5597,5598,5603],{},[531,5599,5600],{},[495,5601,5602],{},"{ not: FilterSerialized }",[531,5604,5605],{},"The child doesn't match",[510,5607,5608,5613],{},[531,5609,5610],{},[495,5611,5612],{},"{ cmp: FilterOperator, left, right }",[531,5614,5615,5616,2017,5619,779,5622,779,5625,779,5628,779,5631,779,5634,779,5637,779,5640,2165,5643],{},"A comparison. ",[495,5617,5618],{},"cmp",[495,5620,5621],{},"equals",[495,5623,5624],{},"greaterThan",[495,5626,5627],{},"greaterThanOrEquals",[495,5629,5630],{},"lessThan",[495,5632,5633],{},"lessThanOrEquals",[495,5635,5636],{},"contains",[495,5638,5639],{},"icontains",[495,5641,5642],{},"startsWith",[495,5644,5645],{},"endsWith",[510,5647,5648,5653],{},[531,5649,5650],{},[495,5651,5652],{},"{ in: operand, values }",[531,5654,5655,5656,1933,5659,5661,5662,5665],{},"The operand is one of ",[495,5657,5658],{},"values",[495,5660,5658],{}," is an array of literals, or ",[495,5663,5664],{},"{ field }"," naming a list field",[459,5667,5668,5669,2165,5672,5675],{},"Each operand is ",[495,5670,5671],{},"{ field: name }",[495,5673,5674],{},"{ value: Value }",". Read both sides of a comparison; don't assume the field is on the left.",[1021,5677,5680],{"className":3491,"code":5678,"filename":5679,"language":3494,"meta":1026,"style":1026},"{\n  \"and\": [\n    { \"in\": { \"field\": \"status\" }, \"values\": [\"published\", \"featured\"] },\n    { \"not\": { \"cmp\": \"equals\", \"left\": { \"field\": \"publishedAt\" }, \"right\": { \"value\": null } } }\n  ]\n}\n","filter.json",[495,5681,5682,5686,5693,5726,5769,5773],{"__ignoreMap":1026},[1030,5683,5684],{"class":1032,"line":1033},[1030,5685,3501],{"class":1040},[1030,5687,5688,5691],{"class":1032,"line":1060},[1030,5689,5690],{"class":1222},"  \"and\"",[1030,5692,3509],{"class":1040},[1030,5694,5695,5698,5701,5703,5705,5707,5709,5711,5714,5716,5718,5720,5723],{"class":1032,"line":1079},[1030,5696,5697],{"class":1040},"    { ",[1030,5699,5700],{"class":1222},"\"in\"",[1030,5702,4804],{"class":1040},[1030,5704,4822],{"class":1222},[1030,5706,1241],{"class":1040},[1030,5708,5297],{"class":1053},[1030,5710,4829],{"class":1040},[1030,5712,5713],{"class":1222},"\"values\"",[1030,5715,4782],{"class":1040},[1030,5717,5326],{"class":1053},[1030,5719,779],{"class":1040},[1030,5721,5722],{"class":1053},"\"featured\"",[1030,5724,5725],{"class":1040},"] },\n",[1030,5727,5728,5730,5733,5735,5737,5739,5741,5743,5745,5747,5749,5751,5754,5756,5758,5760,5762,5764,5766],{"class":1032,"line":1098},[1030,5729,5697],{"class":1040},[1030,5731,5732],{"class":1222},"\"not\"",[1030,5734,4804],{"class":1040},[1030,5736,4807],{"class":1222},[1030,5738,1241],{"class":1040},[1030,5740,5284],{"class":1053},[1030,5742,779],{"class":1040},[1030,5744,4817],{"class":1222},[1030,5746,4804],{"class":1040},[1030,5748,4822],{"class":1222},[1030,5750,1241],{"class":1040},[1030,5752,5753],{"class":1053},"\"publishedAt\"",[1030,5755,4829],{"class":1040},[1030,5757,4832],{"class":1222},[1030,5759,4804],{"class":1040},[1030,5761,4837],{"class":1222},[1030,5763,1241],{"class":1040},[1030,5765,2368],{"class":1215},[1030,5767,5768],{"class":1040}," } } }\n",[1030,5770,5771],{"class":1032,"line":1117},[1030,5772,4651],{"class":1040},[1030,5774,5775],{"class":1032,"line":1141},[1030,5776,4657],{"class":1040},[459,5778,5779,5780,5783,5784,5787,5788,5790,5791,5793,5794,5797,5798,5801,5802,783,5804,636,5806,939],{},"Negated caller operators arrive as ",[495,5781,5782],{},"not"," around the positive form (e.g., ",[495,5785,5786],{},"_neq"," as ",[495,5789,5782],{}," around ",[495,5792,5621],{},"). ",[495,5795,5796],{},"_between"," arrives as ",[495,5799,5800],{},"and"," of ",[495,5803,5627],{},[495,5805,5633],{},[472,5807,414],{"href":5808},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Foperations#map-caller-operators-to-the-wire",[699,5810,5812],{"id":5811},"sort","Sort",[459,5814,5815,5817,5818,5824],{},[495,5816,5811],{}," is an array of ",[472,5819,5821],{"href":5820},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol#sortitemserialized",[495,5822,5823],{},"SortItemSerialized",", applied in order:",[504,5826,5827,5837],{},[507,5828,5829],{},[510,5830,5831,5833,5835],{},[513,5832,2395],{},[513,5834,518],{},[513,5836,2400],{},[526,5838,5839,5853,5868],{},[510,5840,5841,5846,5850],{},[531,5842,5843],{},[495,5844,5845],{},"field",[531,5847,5848],{},[495,5849,538],{},[531,5851,5852],{},"The field to sort by",[510,5854,5855,5860,5865],{},[531,5856,5857],{},[495,5858,5859],{},"direction",[531,5861,5862],{},[495,5863,5864],{},"'ascending' | 'descending'",[531,5866,5867],{},"The direction",[510,5869,5870,5875,5880],{},[531,5871,5872],{},[495,5873,5874],{},"nulls",[531,5876,5877],{},[495,5878,5879],{},"'first' | 'last'",[531,5881,5882],{},"Optional. Places nulls before or after every value, whatever the direction. Engine sends it only when the caller sets it. Absent, your connector places nulls by its own default",[699,5884,2862],{"id":5658},[459,5886,5887,5893,5894,5896,5897,5899],{},[472,5888,5890],{"href":5889},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol#value",[495,5891,5892],{},"Value"," is untagged JSON: ",[495,5895,2368],{},", string, number, boolean, array, or object. Types without a JSON form of their own travel as strings: decimals, base64 bytes, UUIDs, dates and times. The table in ",[472,5898,2681],{"href":2680}," lists each encoding.",[459,5901,5902,783,5905,5907,5908,5910,5911,2165,5913,5915],{},[495,5903,5904],{},"int64",[495,5906,2851],{}," values arrive as decimal strings, in ",[495,5909,2760],{},", in filter literals and in keys, so values beyond JavaScript's safe-integer range stay exact. In an answer, return a decimal string or a number. REST responses carry them as strings too. Narrower integers arrive as JSON numbers, and so do the elements of a list field: only single values become strings. An ",[495,5912,5904],{},[495,5914,2851],{}," list element beyond JavaScript's safe-integer range loses precision when your connector receives it.",[5917,5918,5919,5920,2165,5922,5924,5925,5928,5929,5931],"warning",{},"An ",[495,5921,5904],{},[495,5923,2851],{}," key arrives as a string. A check such as ",[495,5926,5927],{},"typeof id === 'number'"," on it misses every item. Declare ",[495,5930,2829],{}," for ids that fit in 32 bits, or read the key as a string.",[454,5933,5935],{"id":5934},"answer-a-query","Answer a Query",[459,5937,5938,5939,5941,5942,5945,5946,1434],{},"A keyed operation answers ",[495,5940,2266],{}," (see ",[472,5943,5197],{"href":5944},"#keyed-operations","). Every other operation answers with a ",[472,5947,5948],{"href":2270},[495,5949,2273],{},[504,5951,5952,5962],{},[507,5953,5954],{},[510,5955,5956,5958,5960],{},[513,5957,2395],{},[513,5959,518],{},[513,5961,2400],{},[526,5963,5964,5981],{},[510,5965,5966,5970,5978],{},[531,5967,5968],{},[495,5969,4971],{},[531,5971,5972],{},[472,5973,5975],{"href":5974},"\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol#monospaceobject",[495,5976,5977],{},"MonospaceObject[]",[531,5979,5980],{},"The items, keyed by field name. Absent means none",[510,5982,5983,5987,5992],{},[531,5984,5985],{},[495,5986,4975],{},[531,5988,5989],{},[495,5990,5991],{},"number",[531,5993,5994],{},"The answer to a count read. A non-negative integer",[1021,5996,5998],{"className":3491,"code":5997,"filename":5444,"language":3494,"meta":1026,"style":1026},"{\n  \"records\": [\n    { \"id\": \"art_42\", \"title\": \"Designing Filters\", \"wordCount\": 1850 },\n    { \"id\": \"art_43\", \"title\": \"Paging Large Collections\", \"wordCount\": null }\n  ]\n}\n",[495,5999,6000,6004,6011,6041,6071,6075],{"__ignoreMap":1026},[1030,6001,6002],{"class":1032,"line":1033},[1030,6003,3501],{"class":1040},[1030,6005,6006,6009],{"class":1032,"line":1060},[1030,6007,6008],{"class":1222},"  \"records\"",[1030,6010,3509],{"class":1040},[1030,6012,6013,6015,6017,6019,6021,6023,6025,6027,6030,6032,6034,6036,6039],{"class":1032,"line":1079},[1030,6014,5697],{"class":1040},[1030,6016,3560],{"class":1222},[1030,6018,1241],{"class":1040},[1030,6020,5268],{"class":1053},[1030,6022,779],{"class":1040},[1030,6024,3634],{"class":1222},[1030,6026,1241],{"class":1040},[1030,6028,6029],{"class":1053},"\"Designing Filters\"",[1030,6031,779],{"class":1040},[1030,6033,4793],{"class":1222},[1030,6035,1241],{"class":1040},[1030,6037,6038],{"class":1215},"1850",[1030,6040,5271],{"class":1040},[1030,6042,6043,6045,6047,6049,6052,6054,6056,6058,6061,6063,6065,6067,6069],{"class":1032,"line":1098},[1030,6044,5697],{"class":1040},[1030,6046,3560],{"class":1222},[1030,6048,1241],{"class":1040},[1030,6050,6051],{"class":1053},"\"art_43\"",[1030,6053,779],{"class":1040},[1030,6055,3634],{"class":1222},[1030,6057,1241],{"class":1040},[1030,6059,6060],{"class":1053},"\"Paging Large Collections\"",[1030,6062,779],{"class":1040},[1030,6064,4793],{"class":1222},[1030,6066,1241],{"class":1040},[1030,6068,2368],{"class":1215},[1030,6070,5544],{"class":1040},[1030,6072,6073],{"class":1032,"line":1117},[1030,6074,4651],{"class":1040},[1030,6076,6077],{"class":1032,"line":1141},[1030,6078,4657],{"class":1040},[459,6080,6081,6082,6084,6085,6087,6088,6090],{},"Engine checks the fields of every item in ",[495,6083,4971],{},", and of a keyed answer's ",[495,6086,5001],{},", the same way. An answer that fails a check fails the request with ",[495,6089,5408],{}," \"Invalid extension response\", with the reason nested inside:",[882,6092,6093,6102,6116,6129,6139,6149,6161],{},[885,6094,6095,6098,6099,6101],{},[463,6096,6097],{},"Carry every selected field."," Use an explicit ",[495,6100,2368],{}," for a missing value. A missing field fails the request with \"Missing selected field\".",[885,6103,6104,6107,6108,6110,6111,783,6113,6115],{},[463,6105,6106],{},"Extra fields on an item are ignored."," Engine keeps only the fields in ",[495,6109,4991],{},". A non-keyed answer takes only ",[495,6112,4971],{},[495,6114,4975],{},", and any other key fails the request.",[885,6117,6118,6121,6122,6125,6126,939],{},[463,6119,6120],{},"Match the declared type."," Engine converts each value by its field's type and fails the request when it can't, for example \"Expected a value matching ",[495,6123,6124],{},"Int64",", got a string\" for ",[495,6127,6128],{},"\"n\u002Fa\"",[885,6130,6131,6134,6135,6138],{},[463,6132,6133],{},"Some limits aren't checked."," Engine rejects a negative value in an unsigned field and a value outside the 64-bit range. It doesn't check narrower integer widths such as ",[495,6136,6137],{},"int8",", string length or nullability.",[885,6140,6141,6144,6145,939],{},[463,6142,6143],{},"Writes aren't rolled back."," When your answer fails one of these checks, a write your connector already made stays applied. See ",[472,6146,6148],{"href":6147},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Flimitations#no-transactions","No Transactions",[885,6150,6151,6154,6155,6157,6158,6160],{},[463,6152,6153],{},"Fill the page."," Engine reads fewer items than ",[495,6156,5184],{}," as the end of the data: the caller sees no next page. When the external data source returns short pages, keep fetching until you reach ",[495,6159,5184],{}," or it runs out of items.",[885,6162,6163,6166,6167,6169,6170,6172,6173,6176,6177,6179],{},[463,6164,6165],{},"Answers aren't streamed."," A non-keyed answer arrives as one ",[495,6168,4971],{}," array, and Engine converts every item in it before using any. Engine holds the whole answer in memory, so bound what a read without ",[495,6171,5184],{}," fetches. When a read hits your bound, throw ",[495,6174,6175],{},"QueryRejected"," instead of returning the items fetched so far: Engine treats every answer to a read without ",[495,6178,5184],{}," as complete.",[454,6181,6183],{"id":6182},"handle-requests-you-didnt-declare","Handle Requests You Didn't Declare",[459,6185,6186,6187,6189,6190,6192],{},"Engine offers callers only what your declaration lists, and rejects a caller's request outside it. It doesn't check the filters it sends to your connector against the called member's declaration. So some requests reach your connector in a shape the declaration doesn't list. Some come from caller shorthands and defaults that Engine expands, and others are calls Engine makes on its own. Serve them where you can. For a request you can't serve, throw ",[495,6188,6175],{},", which fails it with ",[495,6191,2139],{}," and passes your message to the caller.",[459,6194,6195],{},"A comparison on a field or with an operator the called member never declared can reach your connector too:",[882,6197,6198,6222],{},[885,6199,6200,6203,6204,779,6206,779,6208,783,6210,6212,6213,783,6215,6217,6218,939],{},[463,6201,6202],{},"A permission rule's condition."," A field read rule's condition joins the filter of every call whose filter names the field it guards, including bulk updates and deletes. Saving the policy checks the condition against ",[495,6205,1124],{},[495,6207,1129],{},[495,6209,1187],{},[495,6211,1177],{}," only, so it reaches ",[495,6214,1182],{},[495,6216,1172],{}," unchecked. See ",[472,6219,6221],{"href":6220},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Foperations#permission-rules","Permission Rules",[885,6223,6224,6227,6228,6232],{},[463,6225,6226],{},"A stored declaration older than your code."," After an ",[472,6229,6231],{"href":6230},"\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fdata-sources#update-data-sources-after-an-extension-update","extension update"," that narrowed the declaration without a schema refresh, Engine still offers what the stored declaration lists.",[459,6234,6235,6236,6239],{},"Never drop a comparison you can't translate: it can be a permission rule that restricts which items the caller may touch. Declare the fields and operators your rules' conditions use in every member they reach, and refuse any other undeclared comparison. No error class fits it, so throw a plain ",[495,6237,6238],{},"Error",", which Engine reports as a failed query.",[459,6241,6242,6243,6246,6247,6250],{},"To catch them, check each request against your own declaration: the full Art Institute connector in ",[472,6244,246],{"href":6245},"\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fdata-source-mapping#translate-a-rich-grammar"," reads it from ",[495,6248,6249],{},"schema.toSchemaDocument()",". Engine's relation and read-back lookups on a key no declaration can carry are the exception: serve them.",[504,6252,6253,6263],{},[507,6254,6255],{},[510,6256,6257,6260],{},[513,6258,6259],{},"You receive",[513,6261,6262],{},"When",[526,6264,6265,6293,6317,6334,6362,6381,6401,6425,6449,6482,6502,6517,6535,6548],{},[510,6266,6267,6274],{},[531,6268,6269,6270,4976,6272],{},"A default ",[495,6271,5184],{},[495,6273,1124],{},[531,6275,6276,6277,6279,6280,6282,6283,6285,6286,779,6290,6292],{},"The caller set no ",[495,6278,5184],{},", even if ",[495,6281,1124],{}," declares no ",[495,6284,5184],{},". The value is ",[6287,6288],"env-var",{"name":6289},"query_limit_default",[495,6291,4882],{}," by default",[510,6294,6295,6300],{},[531,6296,6297,6298],{},"No ",[495,6299,5184],{},[531,6301,6302,6303,2165,6306,6309,6310,6313,6314,6316],{},"The caller asked for no limit (",[495,6304,6305],{},"limit=-1",[495,6307,6308],{},"limit=0",") and the instance sets no ",[6287,6311],{"name":6312},"query_limit_max",", or the caller set no ",[495,6315,5184],{}," and the instance unsets its default",[510,6318,6319,6329],{},[531,6320,6321,6322,779,6324,6326,6327,3132],{},"A count read (",[495,6323,5500],{},[495,6325,5503],{},", no ",[495,6328,4991],{},[531,6330,6331,6332],{},"The caller asked for the total count and the page didn't establish it. See ",[472,6333,5481],{"href":4979},[510,6335,6336,6344],{},[531,6337,6338,6340,6341,6343],{},[495,6339,5621],{}," with a ",[495,6342,2368],{}," value",[531,6345,6346,6347,6350,6351,6353,6354,1933,6356,5797,6359,6361],{},"The caller used ",[495,6348,6349],{},"_null: true",", on a nullable field that declares ",[495,6352,5621],{},", in a filter that declares ",[495,6355,5782],{},[495,6357,6358],{},"_null: false",[495,6360,5782],{}," around it",[510,6363,6364,6369],{},[531,6365,6366,6368],{},[495,6367,5621],{}," from shorthand",[531,6370,6371,6372,6375,6376,6378,6379],{},"The caller wrote ",[495,6373,6374],{},"{ field: value }",", on a non-",[495,6377,3494],{}," field that declares ",[495,6380,5621],{},[510,6382,6383,6388],{},[531,6384,6385],{},[495,6386,6387],{},"direction: 'ascending'",[531,6389,6390,6391,6394,6395,6398,6399],{},"The caller sorted without a direction, on a field that declares ",[495,6392,6393],{},"ascending",". A field that declares only ",[495,6396,6397],{},"descending"," requires a direction. Any sorted field can also carry ",[495,6400,5874],{},[510,6402,6403,6414],{},[531,6404,6405,6406,5136,6408,6411,6412],{},"One ",[495,6407,1124],{},[495,6409,6410],{},"in"," over the relation's key field and no ",[495,6413,5184],{},[531,6415,6416,6417,5504,6419,636,6421],{},"The caller includes a to-one relation field, or a to-many relation field that resolves to no ",[495,6418,5184],{},[495,6420,5189],{},[472,6422,6424],{"href":6423},"#relation-reads","Relation Reads",[510,6426,6427,6432],{},[531,6428,6405,6429,6431],{},[495,6430,1124],{}," per distinct parent key, up to 16 at a time",[531,6433,6434,6435,6437,6438,6440,6441,2165,6443,5504,6445,636,6447],{},"The caller includes a to-many relation field that resolves to a ",[495,6436,5184],{}," or an ",[495,6439,5189],{},". With the default instance settings, that's every to-many include except one with ",[495,6442,6305],{},[495,6444,6308],{},[495,6446,5189],{},[472,6448,6424],{"href":6423},[510,6450,6451,6454],{},[531,6452,6453],{},"The relation filter shape on a key no declaration can offer it on",[531,6455,6456,6457,779,6459,779,6462,779,6464,2165,6466,6468,6469,6471,6472,6474,6475,6477,6478],{},"A relation key or stable ID of one field of type ",[495,6458,2565],{},[495,6460,6461],{},"bytes",[495,6463,3494],{},[495,6465,2973],{},[495,6467,3412],{}," receives ",[495,6470,6410],{},". One of several fields, at least one of them ",[495,6473,3412],{},", receives ",[495,6476,5621],{}," on each. It arrives in relation reads and read-backs. See ",[472,6479,6481],{"href":6480},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Foperations#rules-for-engines-own-calls","Rules for Engine's Own Calls",[510,6483,6484,6489],{},[531,6485,461,6486,6488],{},[495,6487,1124],{}," by stable ID after a write",[531,6490,6491,6492,6494,6495,2165,6497,6499,6500],{},"Engine reads back what a ",[495,6493,1167],{}," or an update wrote when the connector doesn't declare ",[495,6496,778],{},[495,6498,782],{},". After an update, it reads the stable IDs first, then the caller's selection. See ",[472,6501,5144],{"href":5143},[510,6503,6504,6509],{},[531,6505,461,6506,6508],{},[495,6507,1124],{}," before a write",[531,6510,6511,6512,6514,6515],{},"Engine reads the stable IDs of the items an update or delete matches when the connector doesn't declare its capability. Before a delete, it then reads the caller's selection by those stable IDs. It also re-reads what a write filters to check a caller's update rules. The rules arrive wrapped in ",[495,6513,5782],{}," and joined to the update's filter with ",[495,6516,5800],{},[510,6518,6519,6528],{},[531,6520,6521,2165,6523,5136,6525,6527],{},[495,6522,1182],{},[495,6524,1172],{},[495,6526,5139],{},", filtered by stable IDs",[531,6529,6530,6531,2165,6533],{},"The caller updated or deleted items, and the connector doesn't declare ",[495,6532,782],{},[495,6534,786],{},[510,6536,6537,6545],{},[531,6538,5919,6539,6542,6543],{},[495,6540,6541],{},"or"," of permission rules, joined to the caller's filter with ",[495,6544,5800],{},[531,6546,6547],{},"Several of the caller's policies grant access to the collection with a filter, and none grants it unconditionally",[510,6549,6550,6561],{},[531,6551,461,6552,6554,6555,779,6557,783,6559],{},[495,6553,4994],{}," on every ",[495,6556,1129],{},[495,6558,1187],{},[495,6560,1177],{},[531,6562,6563,6564,6566],{},"Always, whatever the member's ",[495,6565,5173],{}," declares",[459,6568,6569,6570,6572],{},"Engine doesn't add a sort of its own. A request without a caller sort arrives without ",[495,6571,5811],{},", so keep your connector's default order stable across pages.",[699,6574,6424],{"id":6575},"relation-reads",[459,6577,6578],{},"Engine resolves a relation field by reading the other collection, filtered by the relation's key field. It sends that read to your connector in one of two shapes:",[882,6580,6581,6602],{},[885,6582,6583,6586,6587,5136,6589,6591,6592,6594,6595,6597,6598,5504,6600,939],{},[463,6584,6585],{},"Batched:"," one ",[495,6588,1124],{},[495,6590,6410],{}," over the key values of every parent item, joined with ",[495,6593,5800],{}," to the include's ",[495,6596,5173],{},", with no ",[495,6599,5184],{},[495,6601,5189],{},[885,6603,6604,6586,6607,6609,6610,6612,6613,6594,6615,6617,6618,6620,6621,783,6623,939],{},[463,6605,6606],{},"Per parent:",[495,6608,1124],{}," per distinct, non-null parent key. Engine sends up to 16 of them at a time for one include, so they arrive concurrently. Each carries ",[495,6611,6410],{}," with that one key value, joined with ",[495,6614,5800],{},[495,6616,5173],{},", plus the include's ",[495,6619,5811],{}," and the resolved ",[495,6622,5184],{},[495,6624,5189],{},[459,6626,6627,6628,783,6630,6632,6633,779,6635,6637,6638,636,6640,939],{},"For a key of several fields, or a key field whose filter declares ",[495,6629,5621],{},[495,6631,6541],{}," but no ",[495,6634,6410],{},[495,6636,5621],{}," on each field takes the place of ",[495,6639,6410],{},[472,6641,6642],{"href":3311},"Resolve Relations",[459,6644,6645,6646,2165,6648,6650,6651,5504,6653,6655,6656,2165,6658,6660],{},"A to-one include is always batched, because it takes no ",[495,6647,5184],{},[495,6649,5189],{},". A to-many include is batched only when it resolves to no ",[495,6652,5184],{},[495,6654,5189],{},". A data connector can't apply a ",[495,6657,5184],{},[495,6659,5189],{}," to each parent's group of items within one read, so every other to-many include is read per parent.",[459,6662,6663,6664,6666,6667,6671,6672,6675,6676,6678,6679,6681],{},"The include's ",[495,6665,5184],{}," resolves like a top-level read's (see ",[472,6668,6670],{"href":6669},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Flimits#page-size","Page Size","). The instance settings are ",[6287,6673],{"name":6289,"section":6674},"limits"," (the default, ",[495,6677,4882],{}," unless configured) and ",[6287,6680],{"name":6312,"section":6674}," (the maximum, unset unless configured):",[504,6683,6684,6706],{},[507,6685,6686],{},[510,6687,6688,6693,6696,6701],{},[513,6689,6690,6691],{},"Include ",[495,6692,5184],{},[513,6694,6695],{},"Instance settings",[513,6697,6698,6699],{},"Without ",[495,6700,5189],{},[513,6702,6703,6704],{},"With ",[495,6705,5189],{},[526,6707,6708,6732,6753,6777,6798,6816,6836,6859],{},[510,6709,6710,6713,6719,6725],{},[531,6711,6712],{},"Omitted",[531,6714,6715,6716,6718],{},"Default set (",[495,6717,4882],{}," unless configured)",[531,6720,6721,6722,6724],{},"Per parent, ",[495,6723,5184],{}," = the default",[531,6726,6721,6727,6729,6730],{},[495,6728,5184],{}," = the default, and the ",[495,6731,5189],{},[510,6733,6734,6736,6741,6746],{},[531,6735,6712],{},[531,6737,6738,6739],{},"Default ",[495,6740,5193],{},[531,6742,6721,6743,6745],{},[495,6744,5503],{},", so no related items",[531,6747,6721,6748,6750,6751],{},[495,6749,5503],{},", and the ",[495,6752,5189],{},[510,6754,6755,6757,6767,6770],{},[531,6756,6712],{},[531,6758,6759,6760,6763,6764,3132],{},"Default unset (",[495,6761,6762],{},"query_limit_default: null"," in ",[495,6765,6766],{},"config.yaml",[531,6768,6769],{},"Batched",[531,6771,6772,6773,6750,6775],{},"Per parent, no ",[495,6774,5184],{},[495,6776,5189],{},[510,6778,6779,6782,6787,6792],{},[531,6780,6781],{},"Positive",[531,6783,6784,6785],{},"No maximum, or a maximum at least the include's ",[495,6786,5184],{},[531,6788,6789,6790],{},"Per parent, the include's ",[495,6791,5184],{},[531,6793,6789,6794,783,6796],{},[495,6795,5184],{},[495,6797,5189],{},[510,6799,6800,6802,6807,6812],{},[531,6801,6781],{},[531,6803,6804,6805],{},"A maximum below the include's ",[495,6806,5184],{},[531,6808,6809,6810],{},"Rejected with HTTP ",[495,6811,2139],{},[531,6813,6809,6814],{},[495,6815,2139],{},[510,6817,6818,6825,6828,6830],{},[531,6819,6820,2165,6823],{},[495,6821,6822],{},"-1",[495,6824,5193],{},[531,6826,6827],{},"No maximum",[531,6829,6769],{},[531,6831,6772,6832,6750,6834],{},[495,6833,5184],{},[495,6835,5189],{},[510,6837,6838,6844,6847,6852],{},[531,6839,6840,2165,6842],{},[495,6841,6822],{},[495,6843,5193],{},[531,6845,6846],{},"Maximum set",[531,6848,6721,6849,6851],{},[495,6850,5184],{}," = the maximum",[531,6853,6721,6854,6856,6857],{},[495,6855,5184],{}," = the maximum, and the ",[495,6858,5189],{},[510,6860,6861,6866,6869,6872],{},[531,6862,6863,6864],{},"Below ",[495,6865,6822],{},[531,6867,6868],{},"Any",[531,6870,6871],{},"Rejected",[531,6873,6871],{},[882,6875,6876,6889,6907,6926,6937,6960],{},[885,6877,6878,6881,6882,6884,6885,6888],{},[463,6879,6880],{},"To-many includes are paged by default."," With the default instance settings, a to-many include without ",[495,6883,5184],{}," carries ",[495,6886,6887],{},"limit: 100",", so your connector receives one read per parent, and a caller sees at most 100 related items per parent.",[885,6890,6891,6894,6895,6897,6898,6901,6902,6904,6905,939],{},[463,6892,6893],{},"The default isn't checked against the maximum."," With a default of ",[495,6896,4882],{}," and a maximum of ",[495,6899,6900],{},"50",", an include without ",[495,6903,5184],{}," still arrives with ",[495,6906,6887],{},[885,6908,6909,6920,6921,6923,6924,939],{},[463,6910,6911,6912,2165,6914,6916,6917,6919],{},"A caller can set ",[495,6913,5184],{},[495,6915,5189],{}," on an include only when the related collection's ",[495,6918,1124],{}," declares it."," Otherwise the include always resolves as an omitted ",[495,6922,5184],{}," without ",[495,6925,5189],{},[885,6927,6928,1960,6934,6936],{},[463,6929,6930,6931,6933],{},"Only ",[495,6932,6766],{}," can unset the default.",[6287,6935],{"name":6289,"section":6674}," accepts only an integer; an empty value stops the instance from starting.",[885,6938,6939,6942,6943,783,6945,6632,6947,6949,6950,5801,6952,6954,6955,6957,6958,939],{},[463,6940,6941],{},"A key of several fields",", or a single key field whose filter declares ",[495,6944,5621],{},[495,6946,6541],{},[495,6948,6410],{},", arrives as an ",[495,6951,6541],{},[495,6953,5800],{},"-joined ",[495,6956,5621],{}," instead of ",[495,6959,6410],{},[885,6961,6962,6965],{},[463,6963,6964],{},"Per-parent reads add up."," A to-many include on a page of 100 parent items can send your connector up to 100 reads, up to 16 at a time. Concurrent caller requests each send their own.",[459,6967,6968,6969,939],{},"Declare the filter each direction needs. See ",[472,6970,6642],{"href":3311},[454,6972,6974],{"id":6973},"see-also","See Also",[882,6976,6977,6982,6987,6992,6997,7006],{},[885,6978,6979,6981],{},[472,6980,379],{"href":493},": the extension-level fields around the entry",[885,6983,6984,6986],{},[472,6985,414],{"href":2610},": declare what each collection serves and which rules Engine enforces",[885,6988,6989,6991],{},[472,6990,2184],{"href":2183},": error classes and when to throw each",[885,6993,6994,6996],{},[472,6995,387],{"href":952},": every export of the kit, with its declaration",[885,6998,6999,1241,7001,7003,7004],{},[472,7000,432],{"href":758},[495,7002,830],{}," permissions in the manifest and from ",[495,7005,754],{},[885,7007,7008,7010],{},[472,7009,237],{"href":980},": the sandbox your connector runs in",[7012,7013,7014],"style",{},"html pre.shiki code .sLVBU, html code.shiki .sLVBU{--shiki-light:#0891B2;--shiki-default:#0891B2;--shiki-dark:#22D3EE}html pre.shiki code .sTMul, html code.shiki .sTMul{--shiki-light:#1F2937;--shiki-default:#1F2937;--shiki-dark:#94A3B8}html pre.shiki code .sNJ9c, html code.shiki .sNJ9c{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E2E8F0}html pre.shiki code .suKVh, html code.shiki .suKVh{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#F8FAFC}html pre.shiki code .ssBNi, html code.shiki .ssBNi{--shiki-light:#1659E9;--shiki-default:#1659E9;--shiki-dark:#94B3F5}html pre.shiki code .snHjA, html code.shiki .snHjA{--shiki-light:#124BC4;--shiki-default:#124BC4;--shiki-dark:#5B8EF4}html pre.shiki code .seNfP, html code.shiki .seNfP{--shiki-light:#64748B;--shiki-default:#64748B;--shiki-dark:#94A3B8}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);}",{"title":1026,"searchDepth":1060,"depth":1060,"links":7016},[7017,7021,7022,7028,7037,7038,7046,7047,7050],{"id":456,"depth":1060,"text":457,"children":7018},[7019,7020],{"id":679,"depth":1079,"text":679},{"id":866,"depth":1079,"text":736},{"id":942,"depth":1060,"text":943},{"id":983,"depth":1060,"text":984,"children":7023},[7024,7025,7026,7027],{"id":1918,"depth":1079,"text":1919},{"id":754,"depth":1079,"text":754},{"id":920,"depth":1079,"text":920},{"id":2188,"depth":1079,"text":2189},{"id":2376,"depth":1060,"text":2238,"children":7029},[7030,7031,7032,7033,7034,7035,7036],{"id":475,"depth":1079,"text":2464},{"id":489,"depth":1079,"text":2613},{"id":2774,"depth":1079,"text":2681},{"id":2540,"depth":1079,"text":3003},{"id":2447,"depth":1079,"text":3038},{"id":3314,"depth":1079,"text":2740},{"id":3457,"depth":1079,"text":3458},{"id":4685,"depth":1060,"text":4686},{"id":4707,"depth":1060,"text":2278,"children":7039},[7040,7041,7042,7043,7044,7045],{"id":2583,"depth":1079,"text":4922},{"id":5196,"depth":1079,"text":5197},{"id":5480,"depth":1079,"text":5481},{"id":5553,"depth":1079,"text":5554},{"id":5811,"depth":1079,"text":5812},{"id":5658,"depth":1079,"text":2862},{"id":5934,"depth":1060,"text":5935},{"id":6182,"depth":1060,"text":6183,"children":7048},[7049],{"id":6575,"depth":1079,"text":6424},{"id":6973,"depth":1060,"text":6974},"Reference for the dataConnector entry, what setup and the handlers must do, the schema document, and the query requests a data connector receives and answers.","md",null,{},{"icon":81},{"title":410,"description":7051},"ZVqVBJilzK2KEeHYfXC5mNUXZ-NBqJAeX_QJtUr8Qic",[7059,7061],{"title":401,"path":402,"stem":403,"description":7060,"icon":404,"children":-1},"Reference for every export of @monospace\u002Fextension-kit\u002Fdata-connector\u002Fexperimental, the helpers that build a data connector's schema document from typed definitions.",{"title":414,"path":415,"stem":416,"description":7062,"icon":176,"children":-1},"Reference for the operations a data connector collection declares, the filter operators each field type allows, and the rules Engine enforces on a declaration.",1790840089001]