[{"data":1,"prerenderedAt":3531},["ShallowReactive",2],{"fougere:post.list:{}":3,"docs:\u002Fdocs\u002Fdemos":5,"docs-nav":114,"demo:all":323,"demo:one-declaration":418},{"items":4},[],{"id":6,"title":7,"body":8,"description":106,"extension":107,"meta":108,"navigation":109,"path":110,"seo":111,"stem":112,"__hash__":113},"docs\u002Fdocs\u002F05.demos.md","Demos",{"type":9,"value":10,"toc":104},"minimark",[11,15,19,22,25,28,100],[12,13,7],"h1",{"id":14},"demos",[16,17,18],"p",{},"Every page of this documentation shows fragments. These are the projects those fragments\nare cut from: complete, running, and read straight out of the repository rather than\ncopied into a page.",[16,20,21],{},"Pick one, open any file, and run the ones that do not need a native binary.",[23,24],"demo-list",{},[16,26,27],{},"Each demo also runs locally, which is the only way to see the ones that hold a database:",[29,30,35],"pre",{"className":31,"code":32,"language":33,"meta":34,"style":34},"language-bash shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","git clone https:\u002F\u002Fgithub.com\u002Fchok\u002Ffougere.git\ncd fougere && pnpm install && pnpm run build\npnpm -C demos\u002Fnuxt-blog dev\n","bash","",[36,37,38,54,84],"code",{"__ignoreMap":34},[39,40,43,47,51],"span",{"class":41,"line":42},"line",1,[39,44,46],{"class":45},"sV8pK","git",[39,48,50],{"class":49},"sN-8n"," clone",[39,52,53],{"class":49}," https:\u002F\u002Fgithub.com\u002Fchok\u002Ffougere.git\n",[39,55,57,61,64,68,71,74,76,78,81],{"class":41,"line":56},2,[39,58,60],{"class":59},"s4mR9","cd",[39,62,63],{"class":49}," fougere",[39,65,67],{"class":66},"s15xx"," &&",[39,69,70],{"class":45}," pnpm",[39,72,73],{"class":49}," install",[39,75,67],{"class":66},[39,77,70],{"class":45},[39,79,80],{"class":49}," run",[39,82,83],{"class":49}," build\n",[39,85,87,90,94,97],{"class":41,"line":86},3,[39,88,89],{"class":45},"pnpm",[39,91,93],{"class":92},"svHQO"," -C",[39,95,96],{"class":49}," demos\u002Fnuxt-blog",[39,98,99],{"class":49}," dev\n",[101,102,103],"style",{},"html pre.shiki code .sV8pK, html code.shiki .sV8pK{--shiki-light:#E2931D;--shiki-default:#C9B6EA;--shiki-dark:#FFCB6B}html pre.shiki code .sN-8n, html code.shiki .sN-8n{--shiki-light:#91B859;--shiki-default:#EE9F6B;--shiki-dark:#C3E88D}html pre.shiki code .s4mR9, html code.shiki .s4mR9{--shiki-light:#6182B8;--shiki-default:#C9B6EA;--shiki-dark:#82AAFF}html pre.shiki code .s15xx, html code.shiki .s15xx{--shiki-light:#39ADB5;--shiki-default:#A3B0A5;--shiki-dark:#89DDFF}html pre.shiki code .svHQO, html code.shiki .svHQO{--shiki-light:#91B859;--shiki-default:#8FCF86;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":34,"searchDepth":56,"depth":56,"links":105},[],"Every demo the repository ships, whole — tree, files, and a sandbox to run it in.","md",{},true,"\u002Fdocs\u002Fdemos",{"title":7,"description":106},"docs\u002F05.demos","-wmtrrZIevHbWP83znk_ysV845aVRXxwoNDh9ukZ6gs",[115],{"title":116,"path":117,"stem":118,"children":119,"page":-1},"Docs","\u002Fdocs","docs",[120,123,127,131,135,139,140,162,183,208,257,282],{"title":121,"path":117,"stem":122},"What is Fougere","docs\u002Findex",{"title":124,"path":125,"stem":126},"Getting started","\u002Fdocs\u002Fgetting-started","docs\u002F01.getting-started",{"title":128,"path":129,"stem":130},"An app you already have","\u002Fdocs\u002Fexisting-app","docs\u002F02.existing-app",{"title":132,"path":133,"stem":134},"Bring your schema","\u002Fdocs\u002Fbring-your-schema","docs\u002F03.bring-your-schema",{"title":136,"path":137,"stem":138},"The CLI","\u002Fdocs\u002Fcli","docs\u002F04.cli",{"title":7,"path":110,"stem":112},{"title":141,"path":142,"stem":143,"children":144,"page":161},"Guides","\u002Fdocs\u002Fguides","docs\u002F1.guides",[145,149,153,157],{"title":146,"path":147,"stem":148},"Handle your business logic","\u002Fdocs\u002Fguides\u002Fbusiness-logic","docs\u002F1.guides\u002F1.business-logic",{"title":150,"path":151,"stem":152},"Store your data","\u002Fdocs\u002Fguides\u002Fdata","docs\u002F1.guides\u002F2.data",{"title":154,"path":155,"stem":156},"Shape your topology","\u002Fdocs\u002Fguides\u002Ftopology","docs\u002F1.guides\u002F3.topology",{"title":158,"path":159,"stem":160},"Choose how it runs","\u002Fdocs\u002Fguides\u002Fconfig","docs\u002F1.guides\u002F4.config",false,{"title":163,"path":164,"stem":165,"children":166,"page":161},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F2.concepts",[167,171,175,179],{"title":168,"path":169,"stem":170},"Philosophy","\u002Fdocs\u002Fconcepts\u002Fphilosophy","docs\u002F2.concepts\u002F1.philosophy",{"title":172,"path":173,"stem":174},"The Frond","\u002Fdocs\u002Fconcepts\u002Ffrond","docs\u002F2.concepts\u002F2.frond",{"title":176,"path":177,"stem":178},"The shortest path","\u002Fdocs\u002Fconcepts\u002Fshortest-path","docs\u002F2.concepts\u002F3.shortest-path",{"title":180,"path":181,"stem":182},"The base","\u002Fdocs\u002Fconcepts\u002Fthe-base","docs\u002F2.concepts\u002F4.the-base",{"title":184,"path":185,"stem":186,"children":187,"page":161},"Schema","\u002Fdocs\u002Fschema","docs\u002F3.schema",[188,192,196,200,204],{"title":189,"path":190,"stem":191},"Entities","\u002Fdocs\u002Fschema\u002Fentities","docs\u002F3.schema\u002F1.entities",{"title":193,"path":194,"stem":195},"Views","\u002Fdocs\u002Fschema\u002Fviews","docs\u002F3.schema\u002F2.views",{"title":197,"path":198,"stem":199},"The identity card","\u002Fdocs\u002Fschema\u002Fcard","docs\u002F3.schema\u002F3.card",{"title":201,"path":202,"stem":203},"Standard Schema","\u002Fdocs\u002Fschema\u002Fstandard-schema","docs\u002F3.schema\u002F4.standard-schema",{"title":205,"path":206,"stem":207},"How a schema moves","\u002Fdocs\u002Fschema\u002Fevolution","docs\u002F3.schema\u002F5.evolution",{"title":209,"path":210,"stem":211,"children":212,"page":161},"Business","\u002Fdocs\u002Fbusiness","docs\u002F4.business",[213,217,221,225,229,233,237,241,245,249,253],{"title":214,"path":215,"stem":216},"Handlers","\u002Fdocs\u002Fbusiness\u002Fhandlers","docs\u002F4.business\u002F1.handlers",{"title":218,"path":219,"stem":220},"Ports","\u002Fdocs\u002Fbusiness\u002Fports","docs\u002F4.business\u002F10.ports",{"title":222,"path":223,"stem":224},"Caller state","\u002Fdocs\u002Fbusiness\u002Fstate","docs\u002F4.business\u002F11.state",{"title":226,"path":227,"stem":228},"Presenters","\u002Fdocs\u002Fbusiness\u002Fpresenters","docs\u002F4.business\u002F2.presenters",{"title":230,"path":231,"stem":232},"Collectors","\u002Fdocs\u002Fbusiness\u002Fcollectors","docs\u002F4.business\u002F3.collectors",{"title":234,"path":235,"stem":236},"Errors","\u002Fdocs\u002Fbusiness\u002Ferrors","docs\u002F4.business\u002F4.errors",{"title":238,"path":239,"stem":240},"Seeds","\u002Fdocs\u002Fbusiness\u002Fseeds","docs\u002F4.business\u002F5.seeds",{"title":242,"path":243,"stem":244},"Facts","\u002Fdocs\u002Fbusiness\u002Ffacts","docs\u002F4.business\u002F6.facts",{"title":246,"path":247,"stem":248},"Storage","\u002Fdocs\u002Fbusiness\u002Fstorage","docs\u002F4.business\u002F7.storage",{"title":250,"path":251,"stem":252},"Writes that stand or fall as one","\u002Fdocs\u002Fbusiness\u002Ftogether","docs\u002F4.business\u002F8.together",{"title":254,"path":255,"stem":256},"Repositories","\u002Fdocs\u002Fbusiness\u002Frepositories","docs\u002F4.business\u002F9.repositories",{"title":258,"path":259,"stem":260,"children":261,"page":161},"Client","\u002Fdocs\u002Fclient","docs\u002F5.client",[262,266,270,274,278],{"title":263,"path":264,"stem":265},"Queries & commands","\u002Fdocs\u002Fclient\u002Fqueries-commands","docs\u002F5.client\u002F1.queries-commands",{"title":267,"path":268,"stem":269},"Forms","\u002Fdocs\u002Fclient\u002Fforms","docs\u002F5.client\u002F2.forms",{"title":271,"path":272,"stem":273},"Session","\u002Fdocs\u002Fclient\u002Fsession","docs\u002F5.client\u002F3.session",{"title":275,"path":276,"stem":277},"invoke","\u002Fdocs\u002Fclient\u002Finvoke","docs\u002F5.client\u002F4.invoke",{"title":279,"path":280,"stem":281},"Back-office","\u002Fdocs\u002Fclient\u002Fadmin","docs\u002F5.client\u002F5.admin",{"title":283,"path":284,"stem":285,"children":286,"page":161},"Infrastructure","\u002Fdocs\u002Finfra","docs\u002F6.infra",[287,291,295,299,303,307,311,315,319],{"title":288,"path":289,"stem":290},"The gradient","\u002Fdocs\u002Finfra\u002Fgradient","docs\u002F6.infra\u002F1.gradient",{"title":292,"path":293,"stem":294},"Surfaces — REST & GraphQL","\u002Fdocs\u002Finfra\u002Fsurfaces","docs\u002F6.infra\u002F2.surfaces",{"title":296,"path":297,"stem":298},"Deployment","\u002Fdocs\u002Finfra\u002Fdeployment","docs\u002F6.infra\u002F3.deployment",{"title":300,"path":301,"stem":302},"Hosts","\u002Fdocs\u002Finfra\u002Fhosts","docs\u002F6.infra\u002F4.hosts",{"title":304,"path":305,"stem":306},"Sources","\u002Fdocs\u002Finfra\u002Fsources","docs\u002F6.infra\u002F5.sources",{"title":308,"path":309,"stem":310},"Lifecycle","\u002Fdocs\u002Finfra\u002Flifecycle","docs\u002F6.infra\u002F6.lifecycle",{"title":312,"path":313,"stem":314},"Identity across Fronds","\u002Fdocs\u002Finfra\u002Fidentity","docs\u002F6.infra\u002F7.identity",{"title":316,"path":317,"stem":318},"Observability","\u002Fdocs\u002Finfra\u002Fobservability","docs\u002F6.infra\u002F8.observability",{"title":320,"path":321,"stem":322},"Testing","\u002Fdocs\u002Finfra\u002Ftesting","docs\u002F6.infra\u002F9.testing",[324,327,330,333,336,339,342,344,346,348,351,354,356,359,361,363,365,367,370,372,375,377,380,382,384,387,389,391,394,397,399,401,403,405,408,411,413,416],{"name":325,"runnable":109,"count":326},"admin-panel",8,{"name":328,"runnable":109,"count":329},"anchor-chain",4,{"name":331,"runnable":109,"count":332},"ask-quorum",10,{"name":334,"runnable":161,"count":335},"auth-better",7,{"name":337,"runnable":109,"count":338},"boot-refusals",56,{"name":340,"runnable":109,"count":341},"cloudflare-d1",26,{"name":343,"runnable":161,"count":335},"config-reload",{"name":345,"runnable":109,"count":329},"container-basics",{"name":347,"runnable":109,"count":326},"core-scanner",{"name":349,"runnable":109,"count":350},"crossing-cost",11,{"name":352,"runnable":161,"count":353},"crud-auto",13,{"name":355,"runnable":109,"count":332},"emit-fleet",{"name":357,"runnable":109,"count":358},"emit-multirepo",16,{"name":360,"runnable":109,"count":332},"emit-split",{"name":362,"runnable":161,"count":350},"express-blog",{"name":364,"runnable":109,"count":335},"log-destinations",{"name":366,"runnable":161,"count":350},"mirror-catalog",{"name":368,"runnable":109,"count":369},"multi-frond",25,{"name":371,"runnable":109,"count":335},"multi-transport",{"name":373,"runnable":161,"count":374},"next-blog",19,{"name":376,"runnable":109,"count":335},"no-compiler",{"name":378,"runnable":161,"count":379},"nuxt-blog",43,{"name":381,"runnable":109,"count":358},"observability",{"name":383,"runnable":161,"count":350},"oclif-catalog",{"name":385,"runnable":161,"count":386},"on-delete",12,{"name":388,"runnable":109,"count":329},"one-declaration",{"name":390,"runnable":109,"count":353},"pipe-split",{"name":392,"runnable":109,"count":393},"ports-swap",18,{"name":395,"runnable":161,"count":396},"react-router-blog",21,{"name":398,"runnable":109,"count":335},"rust-frond",{"name":400,"runnable":161,"count":332},"schema-ecommerce",{"name":402,"runnable":109,"count":350},"shared-parent",{"name":404,"runnable":109,"count":350},"sse-live",{"name":406,"runnable":161,"count":407},"sveltekit-blog",23,{"name":409,"runnable":161,"count":410},"tanstack-blog",20,{"name":412,"runnable":161,"count":374},"test-gradient",{"name":414,"runnable":161,"count":415},"together-frame",14,{"name":417,"runnable":109,"count":386},"transport-chain",{"id":419,"title":388,"body":420,"count":329,"description":34,"entry":425,"extension":107,"meta":3526,"name":388,"navigation":109,"path":3527,"runnable":109,"seo":3528,"stem":3529,"__hash__":3530},"demo\u002Fdemo\u002Fone-declaration.md",{"type":9,"value":421,"toc":3524},[422,3521],[423,424,426,1190,3166,3384],"code-tree",{"default-value":425},"main.ts",[29,427,431],{"className":428,"code":429,"filename":430,"language":107,"meta":34,"style":34},"language-md shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","# one-declaration — six lines in, four consumers out\n\n```bash\npnpm -C demos\u002Fone-declaration dev\n```\n\nOne entity is declared. Four different consumers are then asked what they make of\nit. **Nobody wrote any of the four**, and none of them can drift from the others.\n\n## What you write\n\n```ts\nclass Reading extends entity({\n  id: primary(),\n  station: text({ min: 2, max: 40 }),\n  celsius: number({ min: -90, max: 60 }),\n  recordedAt: created(),\n}) {}\n```\n\n## What comes out\n\n**The table** — `min: 2` became a database constraint, not a runtime check:\n\n```sql\ncreate table if not exists \"reading\" (\n  \"id\" text not null primary key,\n  \"station\" text not null,\n  \"celsius\" real not null,\n  \"recorded_at\" text not null,\n  constraint \"reading_station_check\" check (length(\"station\") >= 2 and length(\"station\") \u003C= 40),\n  constraint \"reading_celsius_check\" check (\"celsius\" >= -90 and \"celsius\" \u003C= 60))\n```\n\nSo raw SQL, another process, or a human at a prompt meets the bound too.\n\n**The identity card** — 488 bytes of plain JSON Schema:\n\n```json\n\"station\": { \"type\": \"string\", \"minLength\": 2, \"maxLength\": 40 }\n```\n\nAny validator on earth reads it. This is the document `demos\u002Frust-frond` publishes:\na Frond written in Rust, consumed from TypeScript, with no shared code.\n\n**The io projection** — nobody wrote \"a client cannot supply an id\":\n\n```\na client may send    station, celsius\na client receives    id, station, celsius, recordedAt\n```\n\n`primary()` and `created()` state it, and the facade reads them.\n\n**The validator** — the same verdict in the browser, at the façade, and across a split\n(proven in `packages\u002Fcore\u002Ftests\u002Fvalidator-local-remote.test.ts`):\n\n```\n{ station: \"x\", celsius: 200 }   →  station: String is too short (1 \u003C 2). · celsius: 200 is greater than 60.\n```\n\n## Why this is the whole point\n\n`min: 2` is written once and lands in four places — a `CHECK` in the database, the\nvalidator at the facade, the card that crosses a language boundary, and the browser's own\n`minlength` attribute. Write those by hand and you have four places to keep\nconsistent, in four languages, one of which you do not control.\n\n## What is not shown here\n\nThe form contract — `formFieldsOf` derives `minlength`\u002F`max`\u002F`pattern` from the same\nshape, but it lives inside `@fougere\u002Fnuxt` and the package exposes only its Nuxt\nmodule. Its own doc comment says \"usable by any renderer\"; no renderer outside the\npackage can reach it today.\n\n","README.md",[36,432,433,443,448,458,463,469,474,480,498,503,511,515,522,545,563,607,646,661,671,675,679,686,691,714,719,726,731,737,743,749,755,761,767,772,777,783,788,800,805,813,877,882,887,902,908,913,926,931,936,942,948,953,958,981,986,999,1014,1019,1024,1030,1035,1040,1048,1053,1075,1081,1094,1100,1105,1113,1118,1162,1178,1184],{"__ignoreMap":34},[39,434,435,439],{"class":41,"line":42},[39,436,438],{"class":437},"sd7zb","#",[39,440,442],{"class":441},"sLf9K"," one-declaration — six lines in, four consumers out\n",[39,444,445],{"class":41,"line":56},[39,446,447],{"emptyLinePlaceholder":109},"\n",[39,449,450,454],{"class":41,"line":86},[39,451,453],{"class":452},"siB6D","```",[39,455,457],{"class":456},"sYNOY","bash\n",[39,459,460],{"class":41,"line":329},[39,461,462],{"class":456},"pnpm -C demos\u002Fone-declaration dev\n",[39,464,466],{"class":41,"line":465},5,[39,467,468],{"class":452},"```\n",[39,470,472],{"class":41,"line":471},6,[39,473,447],{"emptyLinePlaceholder":109},[39,475,476],{"class":41,"line":335},[39,477,479],{"class":478},"sPEhv","One entity is declared. Four different consumers are then asked what they make of\n",[39,481,482,485,489,493,495],{"class":41,"line":326},[39,483,484],{"class":478},"it. ",[39,486,488],{"class":487},"sHaeK","**",[39,490,492],{"class":491},"s7rwI","Nobody wrote any of the four",[39,494,488],{"class":487},[39,496,497],{"class":478},", and none of them can drift from the others.\n",[39,499,501],{"class":41,"line":500},9,[39,502,447],{"emptyLinePlaceholder":109},[39,504,505,508],{"class":41,"line":332},[39,506,507],{"class":437},"##",[39,509,510],{"class":441}," What you write\n",[39,512,513],{"class":41,"line":350},[39,514,447],{"emptyLinePlaceholder":109},[39,516,517,519],{"class":41,"line":386},[39,518,453],{"class":452},[39,520,521],{"class":456},"ts\n",[39,523,524,528,532,535,538,542],{"class":41,"line":353},[39,525,527],{"class":526},"s76I7","class",[39,529,531],{"class":530},"sBZYL"," Reading",[39,533,534],{"class":526}," extends",[39,536,537],{"class":59}," entity",[39,539,541],{"class":540},"srlTG","(",[39,543,544],{"class":66},"{\n",[39,546,547,551,554,557,560],{"class":41,"line":415},[39,548,550],{"class":549},"sHtqg","  id",[39,552,553],{"class":66},":",[39,555,556],{"class":59}," primary",[39,558,559],{"class":540},"()",[39,561,562],{"class":66},",\n",[39,564,566,569,571,574,576,579,582,584,588,591,594,596,599,602,605],{"class":41,"line":565},15,[39,567,568],{"class":549},"  station",[39,570,553],{"class":66},[39,572,573],{"class":59}," text",[39,575,541],{"class":540},[39,577,578],{"class":66},"{",[39,580,581],{"class":549}," min",[39,583,553],{"class":66},[39,585,587],{"class":586},"s3dPA"," 2",[39,589,590],{"class":66},",",[39,592,593],{"class":549}," max",[39,595,553],{"class":66},[39,597,598],{"class":586}," 40",[39,600,601],{"class":66}," }",[39,603,604],{"class":540},")",[39,606,562],{"class":66},[39,608,609,612,614,617,619,621,623,625,628,631,633,635,637,640,642,644],{"class":41,"line":358},[39,610,611],{"class":549},"  celsius",[39,613,553],{"class":66},[39,615,616],{"class":59}," number",[39,618,541],{"class":540},[39,620,578],{"class":66},[39,622,581],{"class":549},[39,624,553],{"class":66},[39,626,627],{"class":66}," -",[39,629,630],{"class":586},"90",[39,632,590],{"class":66},[39,634,593],{"class":549},[39,636,553],{"class":66},[39,638,639],{"class":586}," 60",[39,641,601],{"class":66},[39,643,604],{"class":540},[39,645,562],{"class":66},[39,647,649,652,654,657,659],{"class":41,"line":648},17,[39,650,651],{"class":549},"  recordedAt",[39,653,553],{"class":66},[39,655,656],{"class":59}," created",[39,658,559],{"class":540},[39,660,562],{"class":66},[39,662,663,666,668],{"class":41,"line":393},[39,664,665],{"class":66},"}",[39,667,604],{"class":540},[39,669,670],{"class":66}," {}\n",[39,672,673],{"class":41,"line":374},[39,674,468],{"class":452},[39,676,677],{"class":41,"line":410},[39,678,447],{"emptyLinePlaceholder":109},[39,680,681,683],{"class":41,"line":396},[39,682,507],{"class":437},[39,684,685],{"class":441}," What comes out\n",[39,687,689],{"class":41,"line":688},22,[39,690,447],{"emptyLinePlaceholder":109},[39,692,693,695,698,700,703,706,709,711],{"class":41,"line":407},[39,694,488],{"class":487},[39,696,697],{"class":491},"The table",[39,699,488],{"class":487},[39,701,702],{"class":478}," — ",[39,704,705],{"class":66},"`",[39,707,708],{"class":49},"min: 2",[39,710,705],{"class":66},[39,712,713],{"class":478}," became a database constraint, not a runtime check:\n",[39,715,717],{"class":41,"line":716},24,[39,718,447],{"emptyLinePlaceholder":109},[39,720,721,723],{"class":41,"line":369},[39,722,453],{"class":452},[39,724,725],{"class":456},"sql\n",[39,727,728],{"class":41,"line":341},[39,729,730],{"class":456},"create table if not exists \"reading\" (\n",[39,732,734],{"class":41,"line":733},27,[39,735,736],{"class":456},"  \"id\" text not null primary key,\n",[39,738,740],{"class":41,"line":739},28,[39,741,742],{"class":456},"  \"station\" text not null,\n",[39,744,746],{"class":41,"line":745},29,[39,747,748],{"class":456},"  \"celsius\" real not null,\n",[39,750,752],{"class":41,"line":751},30,[39,753,754],{"class":456},"  \"recorded_at\" text not null,\n",[39,756,758],{"class":41,"line":757},31,[39,759,760],{"class":456},"  constraint \"reading_station_check\" check (length(\"station\") >= 2 and length(\"station\") \u003C= 40),\n",[39,762,764],{"class":41,"line":763},32,[39,765,766],{"class":456},"  constraint \"reading_celsius_check\" check (\"celsius\" >= -90 and \"celsius\" \u003C= 60))\n",[39,768,770],{"class":41,"line":769},33,[39,771,468],{"class":452},[39,773,775],{"class":41,"line":774},34,[39,776,447],{"emptyLinePlaceholder":109},[39,778,780],{"class":41,"line":779},35,[39,781,782],{"class":478},"So raw SQL, another process, or a human at a prompt meets the bound too.\n",[39,784,786],{"class":41,"line":785},36,[39,787,447],{"emptyLinePlaceholder":109},[39,789,791,793,795,797],{"class":41,"line":790},37,[39,792,488],{"class":487},[39,794,197],{"class":491},[39,796,488],{"class":487},[39,798,799],{"class":478}," — 488 bytes of plain JSON Schema:\n",[39,801,803],{"class":41,"line":802},38,[39,804,447],{"emptyLinePlaceholder":109},[39,806,808,810],{"class":41,"line":807},39,[39,809,453],{"class":452},[39,811,812],{"class":456},"json\n",[39,814,816,820,823,825,828,830,833,837,839,841,843,846,848,850,852,855,857,859,861,863,865,868,870,872,874],{"class":41,"line":815},40,[39,817,819],{"class":818},"sDDC1","\"",[39,821,822],{"class":49},"station",[39,824,819],{"class":818},[39,826,827],{"class":478},": ",[39,829,578],{"class":66},[39,831,832],{"class":66}," \"",[39,834,836],{"class":835},"s8ClO","type",[39,838,819],{"class":66},[39,840,553],{"class":66},[39,842,832],{"class":818},[39,844,845],{"class":49},"string",[39,847,819],{"class":818},[39,849,590],{"class":66},[39,851,832],{"class":66},[39,853,854],{"class":835},"minLength",[39,856,819],{"class":66},[39,858,553],{"class":66},[39,860,587],{"class":586},[39,862,590],{"class":66},[39,864,832],{"class":66},[39,866,867],{"class":835},"maxLength",[39,869,819],{"class":66},[39,871,553],{"class":66},[39,873,598],{"class":586},[39,875,876],{"class":66}," }\n",[39,878,880],{"class":41,"line":879},41,[39,881,468],{"class":452},[39,883,885],{"class":41,"line":884},42,[39,886,447],{"emptyLinePlaceholder":109},[39,888,889,892,894,897,899],{"class":41,"line":379},[39,890,891],{"class":478},"Any validator on earth reads it. This is the document ",[39,893,705],{"class":66},[39,895,896],{"class":49},"demos\u002Frust-frond",[39,898,705],{"class":66},[39,900,901],{"class":478}," publishes:\n",[39,903,905],{"class":41,"line":904},44,[39,906,907],{"class":478},"a Frond written in Rust, consumed from TypeScript, with no shared code.\n",[39,909,911],{"class":41,"line":910},45,[39,912,447],{"emptyLinePlaceholder":109},[39,914,916,918,921,923],{"class":41,"line":915},46,[39,917,488],{"class":487},[39,919,920],{"class":491},"The io projection",[39,922,488],{"class":487},[39,924,925],{"class":478}," — nobody wrote \"a client cannot supply an id\":\n",[39,927,929],{"class":41,"line":928},47,[39,930,447],{"emptyLinePlaceholder":109},[39,932,934],{"class":41,"line":933},48,[39,935,468],{"class":452},[39,937,939],{"class":41,"line":938},49,[39,940,941],{"class":456},"a client may send    station, celsius\n",[39,943,945],{"class":41,"line":944},50,[39,946,947],{"class":456},"a client receives    id, station, celsius, recordedAt\n",[39,949,951],{"class":41,"line":950},51,[39,952,468],{"class":452},[39,954,956],{"class":41,"line":955},52,[39,957,447],{"emptyLinePlaceholder":109},[39,959,961,963,966,968,971,973,976,978],{"class":41,"line":960},53,[39,962,705],{"class":66},[39,964,965],{"class":49},"primary()",[39,967,705],{"class":66},[39,969,970],{"class":478}," and ",[39,972,705],{"class":66},[39,974,975],{"class":49},"created()",[39,977,705],{"class":66},[39,979,980],{"class":478}," state it, and the facade reads them.\n",[39,982,984],{"class":41,"line":983},54,[39,985,447],{"emptyLinePlaceholder":109},[39,987,989,991,994,996],{"class":41,"line":988},55,[39,990,488],{"class":487},[39,992,993],{"class":491},"The validator",[39,995,488],{"class":487},[39,997,998],{"class":478}," — the same verdict in the browser, at the façade, and across a split\n",[39,1000,1001,1004,1006,1009,1011],{"class":41,"line":338},[39,1002,1003],{"class":478},"(proven in ",[39,1005,705],{"class":66},[39,1007,1008],{"class":49},"packages\u002Fcore\u002Ftests\u002Fvalidator-local-remote.test.ts",[39,1010,705],{"class":66},[39,1012,1013],{"class":478},"):\n",[39,1015,1017],{"class":41,"line":1016},57,[39,1018,447],{"emptyLinePlaceholder":109},[39,1020,1022],{"class":41,"line":1021},58,[39,1023,468],{"class":452},[39,1025,1027],{"class":41,"line":1026},59,[39,1028,1029],{"class":456},"{ station: \"x\", celsius: 200 }   →  station: String is too short (1 \u003C 2). · celsius: 200 is greater than 60.\n",[39,1031,1033],{"class":41,"line":1032},60,[39,1034,468],{"class":452},[39,1036,1038],{"class":41,"line":1037},61,[39,1039,447],{"emptyLinePlaceholder":109},[39,1041,1043,1045],{"class":41,"line":1042},62,[39,1044,507],{"class":437},[39,1046,1047],{"class":441}," Why this is the whole point\n",[39,1049,1051],{"class":41,"line":1050},63,[39,1052,447],{"emptyLinePlaceholder":109},[39,1054,1056,1058,1060,1062,1065,1067,1070,1072],{"class":41,"line":1055},64,[39,1057,705],{"class":66},[39,1059,708],{"class":49},[39,1061,705],{"class":66},[39,1063,1064],{"class":478}," is written once and lands in four places — a ",[39,1066,705],{"class":66},[39,1068,1069],{"class":49},"CHECK",[39,1071,705],{"class":66},[39,1073,1074],{"class":478}," in the database, the\n",[39,1076,1078],{"class":41,"line":1077},65,[39,1079,1080],{"class":478},"validator at the facade, the card that crosses a language boundary, and the browser's own\n",[39,1082,1084,1086,1089,1091],{"class":41,"line":1083},66,[39,1085,705],{"class":66},[39,1087,1088],{"class":49},"minlength",[39,1090,705],{"class":66},[39,1092,1093],{"class":478}," attribute. Write those by hand and you have four places to keep\n",[39,1095,1097],{"class":41,"line":1096},67,[39,1098,1099],{"class":478},"consistent, in four languages, one of which you do not control.\n",[39,1101,1103],{"class":41,"line":1102},68,[39,1104,447],{"emptyLinePlaceholder":109},[39,1106,1108,1110],{"class":41,"line":1107},69,[39,1109,507],{"class":437},[39,1111,1112],{"class":441}," What is not shown here\n",[39,1114,1116],{"class":41,"line":1115},70,[39,1117,447],{"emptyLinePlaceholder":109},[39,1119,1121,1124,1126,1129,1131,1134,1136,1138,1140,1143,1145,1148,1150,1152,1154,1157,1159],{"class":41,"line":1120},71,[39,1122,1123],{"class":478},"The form contract — ",[39,1125,705],{"class":66},[39,1127,1128],{"class":49},"formFieldsOf",[39,1130,705],{"class":66},[39,1132,1133],{"class":478}," derives ",[39,1135,705],{"class":66},[39,1137,1088],{"class":49},[39,1139,705],{"class":66},[39,1141,1142],{"class":478},"\u002F",[39,1144,705],{"class":66},[39,1146,1147],{"class":49},"max",[39,1149,705],{"class":66},[39,1151,1142],{"class":478},[39,1153,705],{"class":66},[39,1155,1156],{"class":49},"pattern",[39,1158,705],{"class":66},[39,1160,1161],{"class":478}," from the same\n",[39,1163,1165,1168,1170,1173,1175],{"class":41,"line":1164},72,[39,1166,1167],{"class":478},"shape, but it lives inside ",[39,1169,705],{"class":66},[39,1171,1172],{"class":49},"@fougere\u002Fnuxt",[39,1174,705],{"class":66},[39,1176,1177],{"class":478}," and the package exposes only its Nuxt\n",[39,1179,1181],{"class":41,"line":1180},73,[39,1182,1183],{"class":478},"module. Its own doc comment says \"usable by any renderer\"; no renderer outside the\n",[39,1185,1187],{"class":41,"line":1186},74,[39,1188,1189],{"class":478},"package can reach it today.\n",[29,1191,1195],{"className":1192,"code":1193,"filename":425,"language":1194,"meta":34,"style":34},"language-ts shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","\u002F**\n * Six lines in. Everything else out.\n *\n * This demo writes ONE entity and then asks four different consumers what they\n * make of it — the SQL dialect, the wire, the io projection, the validator. Nobody\n * wrote any of the four. Run it and read the arrows.\n *\u002F\nimport { Card, entity, primary, text, number, created, Visibility } from '@fougere\u002Fschema';\nimport { toTable, createTableSQL } from '@fougere\u002Fadapter-sql';\n\n\u002F\u002F ─────────────────────────────────────────────────────────────────────────────\n\u002F\u002F WHAT YOU WRITE\n\u002F\u002F ─────────────────────────────────────────────────────────────────────────────\n\nclass Reading extends entity({\n  id: primary(),\n  station: text({ min: 2, max: 40 }),\n  celsius: number({ min: -90, max: 60 }),\n  recordedAt: created(),\n}) {}\n\n\u002F\u002F ─────────────────────────────────────────────────────────────────────────────\n\nconst B = (s: string) => `\\x1b[1m${s}\\x1b[0m`;\nconst D = (s: string) => `\\x1b[2m${s}\\x1b[0m`;\nconst G = (s: string) => `\\x1b[32m${s}\\x1b[0m`;\nconst R = (s: string) => `\\x1b[31m${s}\\x1b[0m`;\n\nfunction section(arrow: string, title: string, who: string) {\n  console.log(`\\n${D('  ' + arrow)}  ${B(title)}\\n     ${D(who)}\\n`);\n}\n\nconsole.log(`\n  ${G('🌿 fougere')}  one declaration\n\n  ${B('class Reading extends entity({')}\n  ${B('  id: primary(),')}\n  ${B(\"  station: text({ min: 2, max: 40 }),\")}\n  ${B('  celsius: number({ min: -90, max: 60 }),')}\n  ${B('  recordedAt: created(),')}\n  ${B('}) {}')}\n`);\n\n\u002F\u002F ── 1. the database ──────────────────────────────────────────────────────────\nsection('→', 'The table', 'schema-sql, sqlite dialect — nobody wrote this DDL');\nconst ddl = createTableSQL(toTable('reading', Reading as never), 'sqlite');\nconsole.log(ddl.replace(\u002F, (constraint)\u002Fg, ',\\n       $1').replace(\u002F\\((\"id\")\u002F, '(\\n       $1').replace(\u002F, (\"station\"|\"celsius\"|\"recorded_at\")\u002Fg, ',\\n       $1'));\nconsole.log(D(`\n     The bounds became CHECK constraints. So raw SQL, another process, or a\n     human at a prompt meets \"at least 2 characters\" too — not just this app.`));\n\n\u002F\u002F ── 2. the wire ──────────────────────────────────────────────────────────────\nsection('→', 'The identity card', 'what crosses to another language — plain JSON Schema');\nconst card = Card.fromSchema(Reading as never, 'reading').descriptor;\nconsole.log(JSON.stringify(card, null, 2).split('\\n').map((l) => '     ' + l).join('\\n'));\nconsole.log(D(`\n     ${JSON.stringify(card).length} bytes, and any validator on earth reads it. This is the\n     document demos\u002Frust-frond publishes — a Frond written in Rust, consumed\n     from TypeScript, with no shared code.`));\n\n\u002F\u002F ── 3. the io projection ─────────────────────────────────────────────────────\nsection('→', 'What a client may send, and what it gets back', 'the boundary axis — nobody listed these');\nconst may = Object.keys(Visibility.of(Reading.getFields() as never).input);\nconst gets = Object.keys(Visibility.of(Reading.getFields() as never).output);\nconsole.log(`     ${D('a client may send   ')} ${may.join(', ')}`);\nconsole.log(`     ${D('a client receives   ')} ${gets.join(', ')}`);\nconsole.log(D(`\n     Nobody wrote \"a client cannot supply an id\". primary() and created() say it,\n     and the facade reads them.`));\n\n\u002F\u002F ── 4. the validator ─────────────────────────────────────────────────────────────\nsection('→', 'The validator', 'the same verdict in the browser, at the façade, and across a split');\nfor (const [label, input] of [\n  ['{ station: \"x\", celsius: 200 }', { station: 'x', celsius: 200 }],\n  ['{ station: \"harbour\", celsius: 12.1 }', { station: 'harbour', celsius: 12.1 }],\n] as const) {\n  const verdict = Reading.validate(input);\n  console.log(`     ${D(label.padEnd(38))} ${verdict.success\n    ? G('accepted')\n    : R(verdict.errors.map((e) => `${e.path}: ${e.message}`).join(' · '))}`);\n}\n\nconsole.log(`\n  ${B('Four consumers, one declaration.')} ${D('None of the four was written by hand, and')}\n  ${D('none can drift from the others — there is nothing to keep in sync.')}\n`);\n\n","ts",[36,1196,1197,1203,1208,1213,1218,1223,1228,1233,1287,1314,1318,1323,1328,1332,1336,1350,1362,1394,1428,1440,1448,1452,1456,1460,1516,1558,1600,1642,1646,1686,1766,1771,1775,1789,1812,1816,1835,1854,1873,1892,1911,1930,1938,1942,1947,1982,2034,2170,2186,2191,2202,2206,2211,2244,2287,2381,2397,2423,2428,2439,2443,2448,2482,2537,2585,2642,2698,2714,2719,2730,2734,2739,2772,2801,2845,2887,2901,2927,2972,2992,3077,3082,3087,3100,3137,3157],{"__ignoreMap":34},[39,1198,1199],{"class":41,"line":42},[39,1200,1202],{"class":1201},"skXKP","\u002F**\n",[39,1204,1205],{"class":41,"line":56},[39,1206,1207],{"class":1201}," * Six lines in. Everything else out.\n",[39,1209,1210],{"class":41,"line":86},[39,1211,1212],{"class":1201}," *\n",[39,1214,1215],{"class":41,"line":329},[39,1216,1217],{"class":1201}," * This demo writes ONE entity and then asks four different consumers what they\n",[39,1219,1220],{"class":41,"line":465},[39,1221,1222],{"class":1201}," * make of it — the SQL dialect, the wire, the io projection, the validator. Nobody\n",[39,1224,1225],{"class":41,"line":471},[39,1226,1227],{"class":1201}," * wrote any of the four. Run it and read the arrows.\n",[39,1229,1230],{"class":41,"line":335},[39,1231,1232],{"class":1201}," *\u002F\n",[39,1234,1235,1239,1242,1245,1247,1249,1251,1253,1255,1257,1259,1261,1263,1265,1267,1270,1272,1275,1278,1281,1284],{"class":41,"line":326},[39,1236,1238],{"class":1237},"sK6XW","import",[39,1240,1241],{"class":66}," {",[39,1243,1244],{"class":478}," Card",[39,1246,590],{"class":66},[39,1248,537],{"class":478},[39,1250,590],{"class":66},[39,1252,556],{"class":478},[39,1254,590],{"class":66},[39,1256,573],{"class":478},[39,1258,590],{"class":66},[39,1260,616],{"class":478},[39,1262,590],{"class":66},[39,1264,656],{"class":478},[39,1266,590],{"class":66},[39,1268,1269],{"class":478}," Visibility",[39,1271,601],{"class":66},[39,1273,1274],{"class":1237}," from",[39,1276,1277],{"class":818}," '",[39,1279,1280],{"class":49},"@fougere\u002Fschema",[39,1282,1283],{"class":818},"'",[39,1285,1286],{"class":66},";\n",[39,1288,1289,1291,1293,1296,1298,1301,1303,1305,1307,1310,1312],{"class":41,"line":500},[39,1290,1238],{"class":1237},[39,1292,1241],{"class":66},[39,1294,1295],{"class":478}," toTable",[39,1297,590],{"class":66},[39,1299,1300],{"class":478}," createTableSQL",[39,1302,601],{"class":66},[39,1304,1274],{"class":1237},[39,1306,1277],{"class":818},[39,1308,1309],{"class":49},"@fougere\u002Fadapter-sql",[39,1311,1283],{"class":818},[39,1313,1286],{"class":66},[39,1315,1316],{"class":41,"line":332},[39,1317,447],{"emptyLinePlaceholder":109},[39,1319,1320],{"class":41,"line":350},[39,1321,1322],{"class":1201},"\u002F\u002F ─────────────────────────────────────────────────────────────────────────────\n",[39,1324,1325],{"class":41,"line":386},[39,1326,1327],{"class":1201},"\u002F\u002F WHAT YOU WRITE\n",[39,1329,1330],{"class":41,"line":353},[39,1331,1322],{"class":1201},[39,1333,1334],{"class":41,"line":415},[39,1335,447],{"emptyLinePlaceholder":109},[39,1337,1338,1340,1342,1344,1346,1348],{"class":41,"line":565},[39,1339,527],{"class":526},[39,1341,531],{"class":530},[39,1343,534],{"class":526},[39,1345,537],{"class":59},[39,1347,541],{"class":540},[39,1349,544],{"class":66},[39,1351,1352,1354,1356,1358,1360],{"class":41,"line":358},[39,1353,550],{"class":549},[39,1355,553],{"class":66},[39,1357,556],{"class":59},[39,1359,559],{"class":540},[39,1361,562],{"class":66},[39,1363,1364,1366,1368,1370,1372,1374,1376,1378,1380,1382,1384,1386,1388,1390,1392],{"class":41,"line":648},[39,1365,568],{"class":549},[39,1367,553],{"class":66},[39,1369,573],{"class":59},[39,1371,541],{"class":540},[39,1373,578],{"class":66},[39,1375,581],{"class":549},[39,1377,553],{"class":66},[39,1379,587],{"class":586},[39,1381,590],{"class":66},[39,1383,593],{"class":549},[39,1385,553],{"class":66},[39,1387,598],{"class":586},[39,1389,601],{"class":66},[39,1391,604],{"class":540},[39,1393,562],{"class":66},[39,1395,1396,1398,1400,1402,1404,1406,1408,1410,1412,1414,1416,1418,1420,1422,1424,1426],{"class":41,"line":393},[39,1397,611],{"class":549},[39,1399,553],{"class":66},[39,1401,616],{"class":59},[39,1403,541],{"class":540},[39,1405,578],{"class":66},[39,1407,581],{"class":549},[39,1409,553],{"class":66},[39,1411,627],{"class":66},[39,1413,630],{"class":586},[39,1415,590],{"class":66},[39,1417,593],{"class":549},[39,1419,553],{"class":66},[39,1421,639],{"class":586},[39,1423,601],{"class":66},[39,1425,604],{"class":540},[39,1427,562],{"class":66},[39,1429,1430,1432,1434,1436,1438],{"class":41,"line":374},[39,1431,651],{"class":549},[39,1433,553],{"class":66},[39,1435,656],{"class":59},[39,1437,559],{"class":540},[39,1439,562],{"class":66},[39,1441,1442,1444,1446],{"class":41,"line":410},[39,1443,665],{"class":66},[39,1445,604],{"class":540},[39,1447,670],{"class":66},[39,1449,1450],{"class":41,"line":396},[39,1451,447],{"emptyLinePlaceholder":109},[39,1453,1454],{"class":41,"line":688},[39,1455,1322],{"class":1201},[39,1457,1458],{"class":41,"line":407},[39,1459,447],{"emptyLinePlaceholder":109},[39,1461,1462,1465,1469,1472,1475,1479,1481,1484,1486,1490,1493,1497,1500,1503,1505,1507,1509,1512,1514],{"class":41,"line":716},[39,1463,1464],{"class":526},"const",[39,1466,1468],{"class":1467},"slP7D"," B",[39,1470,1471],{"class":66}," =",[39,1473,1474],{"class":66}," (",[39,1476,1478],{"class":1477},"shDUQ","s",[39,1480,553],{"class":66},[39,1482,1483],{"class":530}," string",[39,1485,604],{"class":66},[39,1487,1489],{"class":1488},"scTuO"," =>",[39,1491,1492],{"class":818}," `",[39,1494,1496],{"class":1495},"sfnqo","\\x1b",[39,1498,1499],{"class":49},"[1m",[39,1501,1502],{"class":66},"${",[39,1504,1478],{"class":478},[39,1506,665],{"class":66},[39,1508,1496],{"class":1495},[39,1510,1511],{"class":49},"[0m",[39,1513,705],{"class":818},[39,1515,1286],{"class":66},[39,1517,1518,1520,1523,1525,1527,1529,1531,1533,1535,1537,1539,1541,1544,1546,1548,1550,1552,1554,1556],{"class":41,"line":369},[39,1519,1464],{"class":526},[39,1521,1522],{"class":1467}," D",[39,1524,1471],{"class":66},[39,1526,1474],{"class":66},[39,1528,1478],{"class":1477},[39,1530,553],{"class":66},[39,1532,1483],{"class":530},[39,1534,604],{"class":66},[39,1536,1489],{"class":1488},[39,1538,1492],{"class":818},[39,1540,1496],{"class":1495},[39,1542,1543],{"class":49},"[2m",[39,1545,1502],{"class":66},[39,1547,1478],{"class":478},[39,1549,665],{"class":66},[39,1551,1496],{"class":1495},[39,1553,1511],{"class":49},[39,1555,705],{"class":818},[39,1557,1286],{"class":66},[39,1559,1560,1562,1565,1567,1569,1571,1573,1575,1577,1579,1581,1583,1586,1588,1590,1592,1594,1596,1598],{"class":41,"line":341},[39,1561,1464],{"class":526},[39,1563,1564],{"class":1467}," G",[39,1566,1471],{"class":66},[39,1568,1474],{"class":66},[39,1570,1478],{"class":1477},[39,1572,553],{"class":66},[39,1574,1483],{"class":530},[39,1576,604],{"class":66},[39,1578,1489],{"class":1488},[39,1580,1492],{"class":818},[39,1582,1496],{"class":1495},[39,1584,1585],{"class":49},"[32m",[39,1587,1502],{"class":66},[39,1589,1478],{"class":478},[39,1591,665],{"class":66},[39,1593,1496],{"class":1495},[39,1595,1511],{"class":49},[39,1597,705],{"class":818},[39,1599,1286],{"class":66},[39,1601,1602,1604,1607,1609,1611,1613,1615,1617,1619,1621,1623,1625,1628,1630,1632,1634,1636,1638,1640],{"class":41,"line":733},[39,1603,1464],{"class":526},[39,1605,1606],{"class":1467}," R",[39,1608,1471],{"class":66},[39,1610,1474],{"class":66},[39,1612,1478],{"class":1477},[39,1614,553],{"class":66},[39,1616,1483],{"class":530},[39,1618,604],{"class":66},[39,1620,1489],{"class":1488},[39,1622,1492],{"class":818},[39,1624,1496],{"class":1495},[39,1626,1627],{"class":49},"[31m",[39,1629,1502],{"class":66},[39,1631,1478],{"class":478},[39,1633,665],{"class":66},[39,1635,1496],{"class":1495},[39,1637,1511],{"class":49},[39,1639,705],{"class":818},[39,1641,1286],{"class":66},[39,1643,1644],{"class":41,"line":739},[39,1645,447],{"emptyLinePlaceholder":109},[39,1647,1648,1651,1654,1656,1659,1661,1663,1665,1668,1670,1672,1674,1677,1679,1681,1683],{"class":41,"line":745},[39,1649,1650],{"class":526},"function",[39,1652,1653],{"class":59}," section",[39,1655,541],{"class":66},[39,1657,1658],{"class":1477},"arrow",[39,1660,553],{"class":66},[39,1662,1483],{"class":530},[39,1664,590],{"class":66},[39,1666,1667],{"class":1477}," title",[39,1669,553],{"class":66},[39,1671,1483],{"class":530},[39,1673,590],{"class":66},[39,1675,1676],{"class":1477}," who",[39,1678,553],{"class":66},[39,1680,1483],{"class":530},[39,1682,604],{"class":66},[39,1684,1685],{"class":66}," {\n",[39,1687,1688,1691,1694,1697,1700,1702,1705,1707,1710,1712,1714,1717,1720,1723,1725,1727,1730,1733,1735,1738,1740,1742,1744,1747,1749,1751,1754,1756,1758,1760,1762,1764],{"class":41,"line":751},[39,1689,1690],{"class":478},"  console",[39,1692,1693],{"class":66},".",[39,1695,1696],{"class":59},"log",[39,1698,541],{"class":1699},"spAFX",[39,1701,705],{"class":818},[39,1703,1704],{"class":1495},"\\n",[39,1706,1502],{"class":66},[39,1708,1709],{"class":59},"D",[39,1711,541],{"class":540},[39,1713,1283],{"class":818},[39,1715,1716],{"class":818},"  '",[39,1718,1719],{"class":66}," +",[39,1721,1722],{"class":478}," arrow",[39,1724,604],{"class":540},[39,1726,665],{"class":66},[39,1728,1729],{"class":66},"  ${",[39,1731,1732],{"class":59},"B",[39,1734,541],{"class":540},[39,1736,1737],{"class":478},"title",[39,1739,604],{"class":540},[39,1741,665],{"class":66},[39,1743,1704],{"class":1495},[39,1745,1746],{"class":66},"     ${",[39,1748,1709],{"class":59},[39,1750,541],{"class":540},[39,1752,1753],{"class":478},"who",[39,1755,604],{"class":540},[39,1757,665],{"class":66},[39,1759,1704],{"class":1495},[39,1761,705],{"class":818},[39,1763,604],{"class":1699},[39,1765,1286],{"class":66},[39,1767,1768],{"class":41,"line":757},[39,1769,1770],{"class":66},"}\n",[39,1772,1773],{"class":41,"line":763},[39,1774,447],{"emptyLinePlaceholder":109},[39,1776,1777,1780,1782,1784,1786],{"class":41,"line":769},[39,1778,1779],{"class":478},"console",[39,1781,1693],{"class":66},[39,1783,1696],{"class":59},[39,1785,541],{"class":540},[39,1787,1788],{"class":818},"`\n",[39,1790,1791,1793,1796,1798,1800,1803,1805,1807,1809],{"class":41,"line":774},[39,1792,1729],{"class":66},[39,1794,1795],{"class":59},"G",[39,1797,541],{"class":540},[39,1799,1283],{"class":818},[39,1801,1802],{"class":49},"🌿 fougere",[39,1804,1283],{"class":818},[39,1806,604],{"class":540},[39,1808,665],{"class":66},[39,1810,1811],{"class":49},"  one declaration\n",[39,1813,1814],{"class":41,"line":779},[39,1815,447],{"emptyLinePlaceholder":109},[39,1817,1818,1820,1822,1824,1826,1829,1831,1833],{"class":41,"line":785},[39,1819,1729],{"class":66},[39,1821,1732],{"class":59},[39,1823,541],{"class":540},[39,1825,1283],{"class":818},[39,1827,1828],{"class":49},"class Reading extends entity({",[39,1830,1283],{"class":818},[39,1832,604],{"class":540},[39,1834,1770],{"class":66},[39,1836,1837,1839,1841,1843,1845,1848,1850,1852],{"class":41,"line":790},[39,1838,1729],{"class":66},[39,1840,1732],{"class":59},[39,1842,541],{"class":540},[39,1844,1283],{"class":818},[39,1846,1847],{"class":49},"  id: primary(),",[39,1849,1283],{"class":818},[39,1851,604],{"class":540},[39,1853,1770],{"class":66},[39,1855,1856,1858,1860,1862,1864,1867,1869,1871],{"class":41,"line":802},[39,1857,1729],{"class":66},[39,1859,1732],{"class":59},[39,1861,541],{"class":540},[39,1863,819],{"class":818},[39,1865,1866],{"class":49},"  station: text({ min: 2, max: 40 }),",[39,1868,819],{"class":818},[39,1870,604],{"class":540},[39,1872,1770],{"class":66},[39,1874,1875,1877,1879,1881,1883,1886,1888,1890],{"class":41,"line":807},[39,1876,1729],{"class":66},[39,1878,1732],{"class":59},[39,1880,541],{"class":540},[39,1882,1283],{"class":818},[39,1884,1885],{"class":49},"  celsius: number({ min: -90, max: 60 }),",[39,1887,1283],{"class":818},[39,1889,604],{"class":540},[39,1891,1770],{"class":66},[39,1893,1894,1896,1898,1900,1902,1905,1907,1909],{"class":41,"line":815},[39,1895,1729],{"class":66},[39,1897,1732],{"class":59},[39,1899,541],{"class":540},[39,1901,1283],{"class":818},[39,1903,1904],{"class":49},"  recordedAt: created(),",[39,1906,1283],{"class":818},[39,1908,604],{"class":540},[39,1910,1770],{"class":66},[39,1912,1913,1915,1917,1919,1921,1924,1926,1928],{"class":41,"line":879},[39,1914,1729],{"class":66},[39,1916,1732],{"class":59},[39,1918,541],{"class":540},[39,1920,1283],{"class":818},[39,1922,1923],{"class":49},"}) {}",[39,1925,1283],{"class":818},[39,1927,604],{"class":540},[39,1929,1770],{"class":66},[39,1931,1932,1934,1936],{"class":41,"line":884},[39,1933,705],{"class":818},[39,1935,604],{"class":540},[39,1937,1286],{"class":66},[39,1939,1940],{"class":41,"line":379},[39,1941,447],{"emptyLinePlaceholder":109},[39,1943,1944],{"class":41,"line":904},[39,1945,1946],{"class":1201},"\u002F\u002F ── 1. the database ──────────────────────────────────────────────────────────\n",[39,1948,1949,1952,1954,1956,1959,1961,1963,1965,1967,1969,1971,1973,1976,1978,1980],{"class":41,"line":910},[39,1950,1951],{"class":59},"section",[39,1953,541],{"class":540},[39,1955,1283],{"class":818},[39,1957,1958],{"class":49},"→",[39,1960,1283],{"class":818},[39,1962,590],{"class":66},[39,1964,1277],{"class":818},[39,1966,697],{"class":49},[39,1968,1283],{"class":818},[39,1970,590],{"class":66},[39,1972,1277],{"class":818},[39,1974,1975],{"class":49},"schema-sql, sqlite dialect — nobody wrote this DDL",[39,1977,1283],{"class":818},[39,1979,604],{"class":540},[39,1981,1286],{"class":66},[39,1983,1984,1986,1989,1992,1994,1996,1999,2001,2003,2006,2008,2010,2013,2016,2019,2021,2023,2025,2028,2030,2032],{"class":41,"line":915},[39,1985,1464],{"class":526},[39,1987,1988],{"class":478}," ddl ",[39,1990,1991],{"class":66},"=",[39,1993,1300],{"class":59},[39,1995,541],{"class":540},[39,1997,1998],{"class":59},"toTable",[39,2000,541],{"class":540},[39,2002,1283],{"class":818},[39,2004,2005],{"class":49},"reading",[39,2007,1283],{"class":818},[39,2009,590],{"class":66},[39,2011,2012],{"class":478}," Reading ",[39,2014,2015],{"class":1237},"as",[39,2017,2018],{"class":530}," never",[39,2020,604],{"class":540},[39,2022,590],{"class":66},[39,2024,1277],{"class":818},[39,2026,2027],{"class":49},"sqlite",[39,2029,1283],{"class":818},[39,2031,604],{"class":540},[39,2033,1286],{"class":66},[39,2035,2036,2038,2040,2042,2044,2047,2049,2052,2054,2056,2059,2061,2064,2066,2068,2072,2074,2076,2078,2080,2083,2085,2087,2089,2091,2093,2095,2098,2100,2103,2105,2107,2109,2111,2113,2115,2117,2119,2121,2123,2125,2127,2129,2131,2133,2136,2139,2142,2144,2147,2149,2151,2153,2155,2157,2159,2161,2163,2165,2168],{"class":41,"line":928},[39,2037,1779],{"class":478},[39,2039,1693],{"class":66},[39,2041,1696],{"class":59},[39,2043,541],{"class":540},[39,2045,2046],{"class":478},"ddl",[39,2048,1693],{"class":66},[39,2050,2051],{"class":59},"replace",[39,2053,541],{"class":540},[39,2055,1142],{"class":818},[39,2057,2058],{"class":49},", ",[39,2060,541],{"class":66},[39,2062,2063],{"class":49},"constraint",[39,2065,604],{"class":66},[39,2067,1142],{"class":818},[39,2069,2071],{"class":2070},"sWPpw","g",[39,2073,590],{"class":66},[39,2075,1277],{"class":818},[39,2077,590],{"class":49},[39,2079,1704],{"class":1495},[39,2081,2082],{"class":49},"       $1",[39,2084,1283],{"class":818},[39,2086,604],{"class":540},[39,2088,1693],{"class":66},[39,2090,2051],{"class":59},[39,2092,541],{"class":540},[39,2094,1142],{"class":818},[39,2096,2097],{"class":1495},"\\(",[39,2099,541],{"class":66},[39,2101,2102],{"class":49},"\"id\"",[39,2104,604],{"class":66},[39,2106,1142],{"class":818},[39,2108,590],{"class":66},[39,2110,1277],{"class":818},[39,2112,541],{"class":49},[39,2114,1704],{"class":1495},[39,2116,2082],{"class":49},[39,2118,1283],{"class":818},[39,2120,604],{"class":540},[39,2122,1693],{"class":66},[39,2124,2051],{"class":59},[39,2126,541],{"class":540},[39,2128,1142],{"class":818},[39,2130,2058],{"class":49},[39,2132,541],{"class":66},[39,2134,2135],{"class":49},"\"station\"",[39,2137,2138],{"class":66},"|",[39,2140,2141],{"class":49},"\"celsius\"",[39,2143,2138],{"class":66},[39,2145,2146],{"class":49},"\"recorded_at\"",[39,2148,604],{"class":66},[39,2150,1142],{"class":818},[39,2152,2071],{"class":2070},[39,2154,590],{"class":66},[39,2156,1277],{"class":818},[39,2158,590],{"class":49},[39,2160,1704],{"class":1495},[39,2162,2082],{"class":49},[39,2164,1283],{"class":818},[39,2166,2167],{"class":540},"))",[39,2169,1286],{"class":66},[39,2171,2172,2174,2176,2178,2180,2182,2184],{"class":41,"line":933},[39,2173,1779],{"class":478},[39,2175,1693],{"class":66},[39,2177,1696],{"class":59},[39,2179,541],{"class":540},[39,2181,1709],{"class":59},[39,2183,541],{"class":540},[39,2185,1788],{"class":818},[39,2187,2188],{"class":41,"line":938},[39,2189,2190],{"class":49},"     The bounds became CHECK constraints. So raw SQL, another process, or a\n",[39,2192,2193,2196,2198,2200],{"class":41,"line":944},[39,2194,2195],{"class":49},"     human at a prompt meets \"at least 2 characters\" too — not just this app.",[39,2197,705],{"class":818},[39,2199,2167],{"class":540},[39,2201,1286],{"class":66},[39,2203,2204],{"class":41,"line":950},[39,2205,447],{"emptyLinePlaceholder":109},[39,2207,2208],{"class":41,"line":955},[39,2209,2210],{"class":1201},"\u002F\u002F ── 2. the wire ──────────────────────────────────────────────────────────────\n",[39,2212,2213,2215,2217,2219,2221,2223,2225,2227,2229,2231,2233,2235,2238,2240,2242],{"class":41,"line":960},[39,2214,1951],{"class":59},[39,2216,541],{"class":540},[39,2218,1283],{"class":818},[39,2220,1958],{"class":49},[39,2222,1283],{"class":818},[39,2224,590],{"class":66},[39,2226,1277],{"class":818},[39,2228,197],{"class":49},[39,2230,1283],{"class":818},[39,2232,590],{"class":66},[39,2234,1277],{"class":818},[39,2236,2237],{"class":49},"what crosses to another language — plain JSON Schema",[39,2239,1283],{"class":818},[39,2241,604],{"class":540},[39,2243,1286],{"class":66},[39,2245,2246,2248,2251,2253,2255,2257,2260,2262,2265,2267,2269,2271,2273,2275,2277,2279,2281,2285],{"class":41,"line":983},[39,2247,1464],{"class":526},[39,2249,2250],{"class":478}," card ",[39,2252,1991],{"class":66},[39,2254,1244],{"class":478},[39,2256,1693],{"class":66},[39,2258,2259],{"class":59},"fromSchema",[39,2261,541],{"class":540},[39,2263,2264],{"class":478},"Reading ",[39,2266,2015],{"class":1237},[39,2268,2018],{"class":530},[39,2270,590],{"class":66},[39,2272,1277],{"class":818},[39,2274,2005],{"class":49},[39,2276,1283],{"class":818},[39,2278,604],{"class":540},[39,2280,1693],{"class":66},[39,2282,2284],{"class":2283},"sy9f4","descriptor",[39,2286,1286],{"class":66},[39,2288,2289,2291,2293,2295,2297,2300,2302,2305,2307,2310,2312,2315,2317,2319,2321,2323,2326,2328,2330,2332,2334,2336,2338,2341,2343,2345,2348,2350,2352,2354,2357,2359,2362,2364,2366,2369,2371,2373,2375,2377,2379],{"class":41,"line":988},[39,2290,1779],{"class":478},[39,2292,1693],{"class":66},[39,2294,1696],{"class":59},[39,2296,541],{"class":540},[39,2298,2299],{"class":478},"JSON",[39,2301,1693],{"class":66},[39,2303,2304],{"class":59},"stringify",[39,2306,541],{"class":540},[39,2308,2309],{"class":478},"card",[39,2311,590],{"class":66},[39,2313,2314],{"class":818}," null",[39,2316,590],{"class":66},[39,2318,587],{"class":586},[39,2320,604],{"class":540},[39,2322,1693],{"class":66},[39,2324,2325],{"class":59},"split",[39,2327,541],{"class":540},[39,2329,1283],{"class":818},[39,2331,1704],{"class":1495},[39,2333,1283],{"class":818},[39,2335,604],{"class":540},[39,2337,1693],{"class":66},[39,2339,2340],{"class":59},"map",[39,2342,541],{"class":540},[39,2344,541],{"class":66},[39,2346,2347],{"class":1477},"l",[39,2349,604],{"class":66},[39,2351,1489],{"class":1488},[39,2353,1277],{"class":818},[39,2355,2356],{"class":818},"     '",[39,2358,1719],{"class":66},[39,2360,2361],{"class":478}," l",[39,2363,604],{"class":540},[39,2365,1693],{"class":66},[39,2367,2368],{"class":59},"join",[39,2370,541],{"class":540},[39,2372,1283],{"class":818},[39,2374,1704],{"class":1495},[39,2376,1283],{"class":818},[39,2378,2167],{"class":540},[39,2380,1286],{"class":66},[39,2382,2383,2385,2387,2389,2391,2393,2395],{"class":41,"line":338},[39,2384,1779],{"class":478},[39,2386,1693],{"class":66},[39,2388,1696],{"class":59},[39,2390,541],{"class":540},[39,2392,1709],{"class":59},[39,2394,541],{"class":540},[39,2396,1788],{"class":818},[39,2398,2399,2401,2403,2405,2407,2409,2411,2413,2415,2418,2420],{"class":41,"line":1016},[39,2400,1746],{"class":66},[39,2402,2299],{"class":478},[39,2404,1693],{"class":66},[39,2406,2304],{"class":59},[39,2408,541],{"class":540},[39,2410,2309],{"class":478},[39,2412,604],{"class":540},[39,2414,1693],{"class":66},[39,2416,2417],{"class":2283},"length",[39,2419,665],{"class":66},[39,2421,2422],{"class":49}," bytes, and any validator on earth reads it. This is the\n",[39,2424,2425],{"class":41,"line":1021},[39,2426,2427],{"class":49},"     document demos\u002Frust-frond publishes — a Frond written in Rust, consumed\n",[39,2429,2430,2433,2435,2437],{"class":41,"line":1026},[39,2431,2432],{"class":49},"     from TypeScript, with no shared code.",[39,2434,705],{"class":818},[39,2436,2167],{"class":540},[39,2438,1286],{"class":66},[39,2440,2441],{"class":41,"line":1032},[39,2442,447],{"emptyLinePlaceholder":109},[39,2444,2445],{"class":41,"line":1037},[39,2446,2447],{"class":1201},"\u002F\u002F ── 3. the io projection ─────────────────────────────────────────────────────\n",[39,2449,2450,2452,2454,2456,2458,2460,2462,2464,2467,2469,2471,2473,2476,2478,2480],{"class":41,"line":1042},[39,2451,1951],{"class":59},[39,2453,541],{"class":540},[39,2455,1283],{"class":818},[39,2457,1958],{"class":49},[39,2459,1283],{"class":818},[39,2461,590],{"class":66},[39,2463,1277],{"class":818},[39,2465,2466],{"class":49},"What a client may send, and what it gets back",[39,2468,1283],{"class":818},[39,2470,590],{"class":66},[39,2472,1277],{"class":818},[39,2474,2475],{"class":49},"the boundary axis — nobody listed these",[39,2477,1283],{"class":818},[39,2479,604],{"class":540},[39,2481,1286],{"class":66},[39,2483,2484,2486,2489,2491,2494,2496,2499,2501,2504,2506,2509,2511,2514,2516,2519,2521,2524,2526,2528,2530,2533,2535],{"class":41,"line":1050},[39,2485,1464],{"class":526},[39,2487,2488],{"class":478}," may ",[39,2490,1991],{"class":66},[39,2492,2493],{"class":478}," Object",[39,2495,1693],{"class":66},[39,2497,2498],{"class":59},"keys",[39,2500,541],{"class":540},[39,2502,2503],{"class":478},"Visibility",[39,2505,1693],{"class":66},[39,2507,2508],{"class":59},"of",[39,2510,541],{"class":540},[39,2512,2513],{"class":478},"Reading",[39,2515,1693],{"class":66},[39,2517,2518],{"class":59},"getFields",[39,2520,559],{"class":540},[39,2522,2523],{"class":1237}," as",[39,2525,2018],{"class":530},[39,2527,604],{"class":540},[39,2529,1693],{"class":66},[39,2531,2532],{"class":2283},"input",[39,2534,604],{"class":540},[39,2536,1286],{"class":66},[39,2538,2539,2541,2544,2546,2548,2550,2552,2554,2556,2558,2560,2562,2564,2566,2568,2570,2572,2574,2576,2578,2581,2583],{"class":41,"line":1055},[39,2540,1464],{"class":526},[39,2542,2543],{"class":478}," gets ",[39,2545,1991],{"class":66},[39,2547,2493],{"class":478},[39,2549,1693],{"class":66},[39,2551,2498],{"class":59},[39,2553,541],{"class":540},[39,2555,2503],{"class":478},[39,2557,1693],{"class":66},[39,2559,2508],{"class":59},[39,2561,541],{"class":540},[39,2563,2513],{"class":478},[39,2565,1693],{"class":66},[39,2567,2518],{"class":59},[39,2569,559],{"class":540},[39,2571,2523],{"class":1237},[39,2573,2018],{"class":530},[39,2575,604],{"class":540},[39,2577,1693],{"class":66},[39,2579,2580],{"class":2283},"output",[39,2582,604],{"class":540},[39,2584,1286],{"class":66},[39,2586,2587,2589,2591,2593,2595,2597,2599,2601,2603,2605,2608,2610,2612,2614,2617,2620,2622,2624,2626,2628,2630,2632,2634,2636,2638,2640],{"class":41,"line":1077},[39,2588,1779],{"class":478},[39,2590,1693],{"class":66},[39,2592,1696],{"class":59},[39,2594,541],{"class":540},[39,2596,705],{"class":818},[39,2598,1746],{"class":66},[39,2600,1709],{"class":59},[39,2602,541],{"class":540},[39,2604,1283],{"class":818},[39,2606,2607],{"class":49},"a client may send   ",[39,2609,1283],{"class":818},[39,2611,604],{"class":540},[39,2613,665],{"class":66},[39,2615,2616],{"class":66}," ${",[39,2618,2619],{"class":478},"may",[39,2621,1693],{"class":66},[39,2623,2368],{"class":59},[39,2625,541],{"class":540},[39,2627,1283],{"class":818},[39,2629,2058],{"class":49},[39,2631,1283],{"class":818},[39,2633,604],{"class":540},[39,2635,665],{"class":66},[39,2637,705],{"class":818},[39,2639,604],{"class":540},[39,2641,1286],{"class":66},[39,2643,2644,2646,2648,2650,2652,2654,2656,2658,2660,2662,2665,2667,2669,2671,2673,2676,2678,2680,2682,2684,2686,2688,2690,2692,2694,2696],{"class":41,"line":1083},[39,2645,1779],{"class":478},[39,2647,1693],{"class":66},[39,2649,1696],{"class":59},[39,2651,541],{"class":540},[39,2653,705],{"class":818},[39,2655,1746],{"class":66},[39,2657,1709],{"class":59},[39,2659,541],{"class":540},[39,2661,1283],{"class":818},[39,2663,2664],{"class":49},"a client receives   ",[39,2666,1283],{"class":818},[39,2668,604],{"class":540},[39,2670,665],{"class":66},[39,2672,2616],{"class":66},[39,2674,2675],{"class":478},"gets",[39,2677,1693],{"class":66},[39,2679,2368],{"class":59},[39,2681,541],{"class":540},[39,2683,1283],{"class":818},[39,2685,2058],{"class":49},[39,2687,1283],{"class":818},[39,2689,604],{"class":540},[39,2691,665],{"class":66},[39,2693,705],{"class":818},[39,2695,604],{"class":540},[39,2697,1286],{"class":66},[39,2699,2700,2702,2704,2706,2708,2710,2712],{"class":41,"line":1096},[39,2701,1779],{"class":478},[39,2703,1693],{"class":66},[39,2705,1696],{"class":59},[39,2707,541],{"class":540},[39,2709,1709],{"class":59},[39,2711,541],{"class":540},[39,2713,1788],{"class":818},[39,2715,2716],{"class":41,"line":1102},[39,2717,2718],{"class":49},"     Nobody wrote \"a client cannot supply an id\". primary() and created() say it,\n",[39,2720,2721,2724,2726,2728],{"class":41,"line":1107},[39,2722,2723],{"class":49},"     and the facade reads them.",[39,2725,705],{"class":818},[39,2727,2167],{"class":540},[39,2729,1286],{"class":66},[39,2731,2732],{"class":41,"line":1115},[39,2733,447],{"emptyLinePlaceholder":109},[39,2735,2736],{"class":41,"line":1120},[39,2737,2738],{"class":1201},"\u002F\u002F ── 4. the validator ─────────────────────────────────────────────────────────────\n",[39,2740,2741,2743,2745,2747,2749,2751,2753,2755,2757,2759,2761,2763,2766,2768,2770],{"class":41,"line":1164},[39,2742,1951],{"class":59},[39,2744,541],{"class":540},[39,2746,1283],{"class":818},[39,2748,1958],{"class":49},[39,2750,1283],{"class":818},[39,2752,590],{"class":66},[39,2754,1277],{"class":818},[39,2756,993],{"class":49},[39,2758,1283],{"class":818},[39,2760,590],{"class":66},[39,2762,1277],{"class":818},[39,2764,2765],{"class":49},"the same verdict in the browser, at the façade, and across a split",[39,2767,1283],{"class":818},[39,2769,604],{"class":540},[39,2771,1286],{"class":66},[39,2773,2774,2777,2779,2781,2784,2787,2789,2792,2795,2798],{"class":41,"line":1180},[39,2775,2776],{"class":1237},"for",[39,2778,1474],{"class":540},[39,2780,1464],{"class":526},[39,2782,2783],{"class":66}," [",[39,2785,2786],{"class":478},"label",[39,2788,590],{"class":66},[39,2790,2791],{"class":478}," input",[39,2793,2794],{"class":66},"]",[39,2796,2797],{"class":66}," of",[39,2799,2800],{"class":540}," [\n",[39,2802,2803,2806,2808,2811,2813,2815,2817,2820,2822,2824,2827,2829,2831,2834,2836,2839,2841,2843],{"class":41,"line":1186},[39,2804,2805],{"class":540},"  [",[39,2807,1283],{"class":818},[39,2809,2810],{"class":49},"{ station: \"x\", celsius: 200 }",[39,2812,1283],{"class":818},[39,2814,590],{"class":66},[39,2816,1241],{"class":66},[39,2818,2819],{"class":549}," station",[39,2821,553],{"class":66},[39,2823,1277],{"class":818},[39,2825,2826],{"class":49},"x",[39,2828,1283],{"class":818},[39,2830,590],{"class":66},[39,2832,2833],{"class":549}," celsius",[39,2835,553],{"class":66},[39,2837,2838],{"class":586}," 200",[39,2840,601],{"class":66},[39,2842,2794],{"class":540},[39,2844,562],{"class":66},[39,2846,2848,2850,2852,2855,2857,2859,2861,2863,2865,2867,2870,2872,2874,2876,2878,2881,2883,2885],{"class":41,"line":2847},75,[39,2849,2805],{"class":540},[39,2851,1283],{"class":818},[39,2853,2854],{"class":49},"{ station: \"harbour\", celsius: 12.1 }",[39,2856,1283],{"class":818},[39,2858,590],{"class":66},[39,2860,1241],{"class":66},[39,2862,2819],{"class":549},[39,2864,553],{"class":66},[39,2866,1277],{"class":818},[39,2868,2869],{"class":49},"harbour",[39,2871,1283],{"class":818},[39,2873,590],{"class":66},[39,2875,2833],{"class":549},[39,2877,553],{"class":66},[39,2879,2880],{"class":586}," 12.1",[39,2882,601],{"class":66},[39,2884,2794],{"class":540},[39,2886,562],{"class":66},[39,2888,2890,2892,2894,2897,2899],{"class":41,"line":2889},76,[39,2891,2794],{"class":540},[39,2893,2523],{"class":1237},[39,2895,2896],{"class":526}," const",[39,2898,604],{"class":540},[39,2900,1685],{"class":66},[39,2902,2904,2907,2910,2912,2914,2916,2919,2921,2923,2925],{"class":41,"line":2903},77,[39,2905,2906],{"class":526},"  const",[39,2908,2909],{"class":478}," verdict",[39,2911,1471],{"class":66},[39,2913,531],{"class":478},[39,2915,1693],{"class":66},[39,2917,2918],{"class":59},"validate",[39,2920,541],{"class":1699},[39,2922,2532],{"class":478},[39,2924,604],{"class":1699},[39,2926,1286],{"class":66},[39,2928,2930,2932,2934,2936,2938,2940,2942,2944,2946,2948,2950,2953,2955,2958,2960,2962,2964,2967,2969],{"class":41,"line":2929},78,[39,2931,1690],{"class":478},[39,2933,1693],{"class":66},[39,2935,1696],{"class":59},[39,2937,541],{"class":1699},[39,2939,705],{"class":818},[39,2941,1746],{"class":66},[39,2943,1709],{"class":59},[39,2945,541],{"class":540},[39,2947,2786],{"class":478},[39,2949,1693],{"class":66},[39,2951,2952],{"class":59},"padEnd",[39,2954,541],{"class":540},[39,2956,2957],{"class":586},"38",[39,2959,2167],{"class":540},[39,2961,665],{"class":66},[39,2963,2616],{"class":66},[39,2965,2966],{"class":478},"verdict",[39,2968,1693],{"class":66},[39,2970,2971],{"class":2283},"success\n",[39,2973,2975,2978,2980,2982,2984,2987,2989],{"class":41,"line":2974},79,[39,2976,2977],{"class":66},"    ?",[39,2979,1564],{"class":59},[39,2981,541],{"class":540},[39,2983,1283],{"class":818},[39,2985,2986],{"class":49},"accepted",[39,2988,1283],{"class":818},[39,2990,2991],{"class":540},")\n",[39,2993,2995,2998,3000,3002,3004,3006,3009,3011,3013,3015,3017,3020,3022,3024,3026,3028,3030,3032,3035,3037,3039,3041,3043,3045,3048,3050,3052,3054,3056,3058,3060,3062,3065,3067,3069,3071,3073,3075],{"class":41,"line":2994},80,[39,2996,2997],{"class":66},"    :",[39,2999,1606],{"class":59},[39,3001,541],{"class":540},[39,3003,2966],{"class":478},[39,3005,1693],{"class":66},[39,3007,3008],{"class":2283},"errors",[39,3010,1693],{"class":66},[39,3012,2340],{"class":59},[39,3014,541],{"class":540},[39,3016,541],{"class":66},[39,3018,3019],{"class":1477},"e",[39,3021,604],{"class":66},[39,3023,1489],{"class":1488},[39,3025,1492],{"class":818},[39,3027,1502],{"class":66},[39,3029,3019],{"class":478},[39,3031,1693],{"class":66},[39,3033,3034],{"class":2283},"path",[39,3036,665],{"class":66},[39,3038,827],{"class":49},[39,3040,1502],{"class":66},[39,3042,3019],{"class":478},[39,3044,1693],{"class":66},[39,3046,3047],{"class":2283},"message",[39,3049,665],{"class":66},[39,3051,705],{"class":818},[39,3053,604],{"class":540},[39,3055,1693],{"class":66},[39,3057,2368],{"class":59},[39,3059,541],{"class":540},[39,3061,1283],{"class":818},[39,3063,3064],{"class":49}," · ",[39,3066,1283],{"class":818},[39,3068,2167],{"class":540},[39,3070,665],{"class":66},[39,3072,705],{"class":818},[39,3074,604],{"class":1699},[39,3076,1286],{"class":66},[39,3078,3080],{"class":41,"line":3079},81,[39,3081,1770],{"class":66},[39,3083,3085],{"class":41,"line":3084},82,[39,3086,447],{"emptyLinePlaceholder":109},[39,3088,3090,3092,3094,3096,3098],{"class":41,"line":3089},83,[39,3091,1779],{"class":478},[39,3093,1693],{"class":66},[39,3095,1696],{"class":59},[39,3097,541],{"class":540},[39,3099,1788],{"class":818},[39,3101,3103,3105,3107,3109,3111,3114,3116,3118,3120,3122,3124,3126,3128,3131,3133,3135],{"class":41,"line":3102},84,[39,3104,1729],{"class":66},[39,3106,1732],{"class":59},[39,3108,541],{"class":540},[39,3110,1283],{"class":818},[39,3112,3113],{"class":49},"Four consumers, one declaration.",[39,3115,1283],{"class":818},[39,3117,604],{"class":540},[39,3119,665],{"class":66},[39,3121,2616],{"class":66},[39,3123,1709],{"class":59},[39,3125,541],{"class":540},[39,3127,1283],{"class":818},[39,3129,3130],{"class":49},"None of the four was written by hand, and",[39,3132,1283],{"class":818},[39,3134,604],{"class":540},[39,3136,1770],{"class":66},[39,3138,3140,3142,3144,3146,3148,3151,3153,3155],{"class":41,"line":3139},85,[39,3141,1729],{"class":66},[39,3143,1709],{"class":59},[39,3145,541],{"class":540},[39,3147,1283],{"class":818},[39,3149,3150],{"class":49},"none can drift from the others — there is nothing to keep in sync.",[39,3152,1283],{"class":818},[39,3154,604],{"class":540},[39,3156,1770],{"class":66},[39,3158,3160,3162,3164],{"class":41,"line":3159},86,[39,3161,705],{"class":818},[39,3163,604],{"class":540},[39,3165,1286],{"class":66},[29,3167,3172],{"className":3168,"code":3169,"filename":3170,"language":3171,"meta":34,"style":34},"language-json shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","{\n  \"name\": \"one-declaration\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"tsx main.ts\",\n    \"typecheck\": \"tsc --noEmit -p .\"\n  },\n  \"dependencies\": {\n    \"@fougere\u002Fschema\": \"^0.26.0-alpha.0\",\n    \"@fougere\u002Fadapter-sql\": \"^0.26.0-alpha.0\"\n  },\n  \"devDependencies\": {\n    \"tsx\": \"^4.0.0\"\n  }\n}\n\n","package.json","json",[36,3173,3174,3178,3198,3214,3233,3246,3268,3287,3292,3305,3324,3340,3344,3357,3375,3380],{"__ignoreMap":34},[39,3175,3176],{"class":41,"line":42},[39,3177,544],{"class":66},[39,3179,3180,3183,3186,3188,3190,3192,3194,3196],{"class":41,"line":56},[39,3181,3182],{"class":66},"  \"",[39,3184,3185],{"class":835},"name",[39,3187,819],{"class":66},[39,3189,553],{"class":66},[39,3191,832],{"class":818},[39,3193,388],{"class":49},[39,3195,819],{"class":818},[39,3197,562],{"class":66},[39,3199,3200,3202,3205,3207,3209,3212],{"class":41,"line":86},[39,3201,3182],{"class":66},[39,3203,3204],{"class":835},"private",[39,3206,819],{"class":66},[39,3208,553],{"class":66},[39,3210,3211],{"class":818}," true",[39,3213,562],{"class":66},[39,3215,3216,3218,3220,3222,3224,3226,3229,3231],{"class":41,"line":329},[39,3217,3182],{"class":66},[39,3219,836],{"class":835},[39,3221,819],{"class":66},[39,3223,553],{"class":66},[39,3225,832],{"class":818},[39,3227,3228],{"class":49},"module",[39,3230,819],{"class":818},[39,3232,562],{"class":66},[39,3234,3235,3237,3240,3242,3244],{"class":41,"line":465},[39,3236,3182],{"class":66},[39,3238,3239],{"class":835},"scripts",[39,3241,819],{"class":66},[39,3243,553],{"class":66},[39,3245,1685],{"class":66},[39,3247,3248,3251,3255,3257,3259,3261,3264,3266],{"class":41,"line":471},[39,3249,3250],{"class":66},"    \"",[39,3252,3254],{"class":3253},"sWI7z","dev",[39,3256,819],{"class":66},[39,3258,553],{"class":66},[39,3260,832],{"class":818},[39,3262,3263],{"class":49},"tsx main.ts",[39,3265,819],{"class":818},[39,3267,562],{"class":66},[39,3269,3270,3272,3275,3277,3279,3281,3284],{"class":41,"line":335},[39,3271,3250],{"class":66},[39,3273,3274],{"class":3253},"typecheck",[39,3276,819],{"class":66},[39,3278,553],{"class":66},[39,3280,832],{"class":818},[39,3282,3283],{"class":49},"tsc --noEmit -p .",[39,3285,3286],{"class":818},"\"\n",[39,3288,3289],{"class":41,"line":326},[39,3290,3291],{"class":66},"  },\n",[39,3293,3294,3296,3299,3301,3303],{"class":41,"line":500},[39,3295,3182],{"class":66},[39,3297,3298],{"class":835},"dependencies",[39,3300,819],{"class":66},[39,3302,553],{"class":66},[39,3304,1685],{"class":66},[39,3306,3307,3309,3311,3313,3315,3317,3320,3322],{"class":41,"line":332},[39,3308,3250],{"class":66},[39,3310,1280],{"class":3253},[39,3312,819],{"class":66},[39,3314,553],{"class":66},[39,3316,832],{"class":818},[39,3318,3319],{"class":49},"^0.26.0-alpha.0",[39,3321,819],{"class":818},[39,3323,562],{"class":66},[39,3325,3326,3328,3330,3332,3334,3336,3338],{"class":41,"line":350},[39,3327,3250],{"class":66},[39,3329,1309],{"class":3253},[39,3331,819],{"class":66},[39,3333,553],{"class":66},[39,3335,832],{"class":818},[39,3337,3319],{"class":49},[39,3339,3286],{"class":818},[39,3341,3342],{"class":41,"line":386},[39,3343,3291],{"class":66},[39,3345,3346,3348,3351,3353,3355],{"class":41,"line":353},[39,3347,3182],{"class":66},[39,3349,3350],{"class":835},"devDependencies",[39,3352,819],{"class":66},[39,3354,553],{"class":66},[39,3356,1685],{"class":66},[39,3358,3359,3361,3364,3366,3368,3370,3373],{"class":41,"line":415},[39,3360,3250],{"class":66},[39,3362,3363],{"class":3253},"tsx",[39,3365,819],{"class":66},[39,3367,553],{"class":66},[39,3369,832],{"class":818},[39,3371,3372],{"class":49},"^4.0.0",[39,3374,3286],{"class":818},[39,3376,3377],{"class":41,"line":565},[39,3378,3379],{"class":66},"  }\n",[39,3381,3382],{"class":41,"line":358},[39,3383,1770],{"class":66},[29,3385,3388],{"className":3168,"code":3386,"filename":3387,"language":3171,"meta":34,"style":34},"{\n  \"extends\": \"..\u002F..\u002Ftsconfig.base.json\",\n  \"compilerOptions\": {\n    \"noEmit\": true,\n    \"rootDir\": \".\"\n  },\n  \"include\": [\".\"],\n  \"exclude\": [\"**\u002Fdist\", \"node_modules\"]\n}\n\n","tsconfig.json",[36,3389,3390,3394,3414,3427,3442,3459,3463,3485,3517],{"__ignoreMap":34},[39,3391,3392],{"class":41,"line":42},[39,3393,544],{"class":66},[39,3395,3396,3398,3401,3403,3405,3407,3410,3412],{"class":41,"line":56},[39,3397,3182],{"class":66},[39,3399,3400],{"class":835},"extends",[39,3402,819],{"class":66},[39,3404,553],{"class":66},[39,3406,832],{"class":818},[39,3408,3409],{"class":49},"..\u002F..\u002Ftsconfig.base.json",[39,3411,819],{"class":818},[39,3413,562],{"class":66},[39,3415,3416,3418,3421,3423,3425],{"class":41,"line":86},[39,3417,3182],{"class":66},[39,3419,3420],{"class":835},"compilerOptions",[39,3422,819],{"class":66},[39,3424,553],{"class":66},[39,3426,1685],{"class":66},[39,3428,3429,3431,3434,3436,3438,3440],{"class":41,"line":329},[39,3430,3250],{"class":66},[39,3432,3433],{"class":3253},"noEmit",[39,3435,819],{"class":66},[39,3437,553],{"class":66},[39,3439,3211],{"class":818},[39,3441,562],{"class":66},[39,3443,3444,3446,3449,3451,3453,3455,3457],{"class":41,"line":465},[39,3445,3250],{"class":66},[39,3447,3448],{"class":3253},"rootDir",[39,3450,819],{"class":66},[39,3452,553],{"class":66},[39,3454,832],{"class":818},[39,3456,1693],{"class":49},[39,3458,3286],{"class":818},[39,3460,3461],{"class":41,"line":471},[39,3462,3291],{"class":66},[39,3464,3465,3467,3470,3472,3474,3476,3478,3480,3482],{"class":41,"line":335},[39,3466,3182],{"class":66},[39,3468,3469],{"class":835},"include",[39,3471,819],{"class":66},[39,3473,553],{"class":66},[39,3475,2783],{"class":66},[39,3477,819],{"class":818},[39,3479,1693],{"class":49},[39,3481,819],{"class":818},[39,3483,3484],{"class":66},"],\n",[39,3486,3487,3489,3492,3494,3496,3498,3500,3503,3505,3507,3509,3512,3514],{"class":41,"line":326},[39,3488,3182],{"class":66},[39,3490,3491],{"class":835},"exclude",[39,3493,819],{"class":66},[39,3495,553],{"class":66},[39,3497,2783],{"class":66},[39,3499,819],{"class":818},[39,3501,3502],{"class":49},"**\u002Fdist",[39,3504,819],{"class":818},[39,3506,590],{"class":66},[39,3508,832],{"class":818},[39,3510,3511],{"class":49},"node_modules",[39,3513,819],{"class":818},[39,3515,3516],{"class":66},"]\n",[39,3518,3519],{"class":41,"line":500},[39,3520,1770],{"class":66},[101,3522,3523],{},"html pre.shiki code .sd7zb, html code.shiki .sd7zb{--shiki-light:#39ADB5;--shiki-light-font-weight:inherit;--shiki-default:#A3B0A5;--shiki-default-font-weight:bold;--shiki-dark:#89DDFF;--shiki-dark-font-weight:inherit}html pre.shiki code .sLf9K, html code.shiki .sLf9K{--shiki-light:#E2931D;--shiki-light-font-weight:inherit;--shiki-default:#8FCF86;--shiki-default-font-weight:bold;--shiki-dark:#FFCB6B;--shiki-dark-font-weight:inherit}html pre.shiki code .siB6D, html code.shiki .siB6D{--shiki-light:#91B859;--shiki-default:#A3B0A5;--shiki-dark:#C3E88D}html pre.shiki code .sYNOY, html code.shiki .sYNOY{--shiki-light:#90A4AE90;--shiki-default:#DDE5DA;--shiki-dark:#BABED890}html pre.shiki code .sPEhv, html code.shiki .sPEhv{--shiki-light:#90A4AE;--shiki-default:#DDE5DA;--shiki-dark:#BABED8}html pre.shiki code .sHaeK, html code.shiki .sHaeK{--shiki-light:#39ADB5;--shiki-light-font-weight:bold;--shiki-default:#A3B0A5;--shiki-default-font-weight:inherit;--shiki-dark:#89DDFF;--shiki-dark-font-weight:bold}html pre.shiki code .s7rwI, html code.shiki .s7rwI{--shiki-light:#E53935;--shiki-light-font-weight:bold;--shiki-default:#DDE5DA;--shiki-default-font-weight:inherit;--shiki-dark:#F07178;--shiki-dark-font-weight:bold}html pre.shiki code .s76I7, html code.shiki .s76I7{--shiki-light:#9C3EDA;--shiki-default:#8FCF86;--shiki-dark:#C792EA}html pre.shiki code .sBZYL, html code.shiki .sBZYL{--shiki-light:#E2931D;--shiki-default:#EFCD8F;--shiki-dark:#FFCB6B}html pre.shiki code .s4mR9, html code.shiki .s4mR9{--shiki-light:#6182B8;--shiki-default:#C9B6EA;--shiki-dark:#82AAFF}html pre.shiki code .srlTG, html code.shiki .srlTG{--shiki-light:#90A4AE;--shiki-default:#A3B0A5;--shiki-dark:#BABED8}html pre.shiki code .s15xx, html code.shiki .s15xx{--shiki-light:#39ADB5;--shiki-default:#A3B0A5;--shiki-dark:#89DDFF}html pre.shiki code .sHtqg, html code.shiki .sHtqg{--shiki-light:#E53935;--shiki-default:#93CFC0;--shiki-dark:#F07178}html pre.shiki code .s3dPA, html code.shiki .s3dPA{--shiki-light:#F76D47;--shiki-default:#EE9F6B;--shiki-dark:#F78C6C}html pre.shiki code .sN-8n, html code.shiki .sN-8n{--shiki-light:#91B859;--shiki-default:#EE9F6B;--shiki-dark:#C3E88D}html pre.shiki code .sDDC1, html code.shiki .sDDC1{--shiki-light:#39ADB5;--shiki-default:#EE9F6B;--shiki-dark:#89DDFF}html pre.shiki code .s8ClO, html code.shiki .s8ClO{--shiki-light:#9C3EDA;--shiki-default:#93CFC0;--shiki-dark:#C792EA}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .skXKP, html code.shiki .skXKP{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#7D8C80;--shiki-default-font-style:inherit;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sK6XW, html code.shiki .sK6XW{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#8FCF86;--shiki-default-font-style:inherit;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .slP7D, html code.shiki .slP7D{--shiki-light:#90A4AE;--shiki-default:#C9B6EA;--shiki-dark:#BABED8}html pre.shiki code .shDUQ, html code.shiki .shDUQ{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#DDE5DA;--shiki-default-font-style:inherit;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .scTuO, html code.shiki .scTuO{--shiki-light:#9C3EDA;--shiki-default:#A3B0A5;--shiki-dark:#C792EA}html pre.shiki code .sfnqo, html code.shiki .sfnqo{--shiki-light:#90A4AE;--shiki-default:#EE9F6B;--shiki-dark:#BABED8}html pre.shiki code .spAFX, html code.shiki .spAFX{--shiki-light:#E53935;--shiki-default:#A3B0A5;--shiki-dark:#F07178}html pre.shiki code .sWPpw, html code.shiki .sWPpw{--shiki-light:#F76D47;--shiki-default:#8FCF86;--shiki-dark:#F78C6C}html pre.shiki code .sy9f4, html code.shiki .sy9f4{--shiki-light:#90A4AE;--shiki-default:#93CFC0;--shiki-dark:#BABED8}html pre.shiki code .sWI7z, html code.shiki .sWI7z{--shiki-light:#E2931D;--shiki-default:#93CFC0;--shiki-dark:#FFCB6B}",{"title":34,"searchDepth":56,"depth":56,"links":3525},[],{},"\u002Fdemo\u002Fone-declaration",{"title":388,"description":34},"demo\u002Fone-declaration","M5n5o47nOfIJ7CHJMVGpBwvf2o-Uc997YYuevE1PDUI",1792704169793]