[{"data":1,"prerenderedAt":250},["ShallowReactive",2],{"fougere:post.list:{}":3,"tutorial-steps":6,"tutorial:\u002Ftutorial\u002F2-a-source":43},{"items":4,"hasMore":5},[],false,[7,11,15,19,23,27,31,35,39],{"path":8,"step":9,"name":10},"\u002Ftutorial\u002F0-start",0,"Start",{"path":12,"step":13,"name":14},"\u002Ftutorial\u002F1-an-entity",1,"An entity",{"path":16,"step":17,"name":18},"\u002Ftutorial\u002F2-a-source",2,"A source",{"path":20,"step":21,"name":22},"\u002Ftutorial\u002F3-a-rule",3,"A rule",{"path":24,"step":25,"name":26},"\u002Ftutorial\u002F4-a-port",4,"A port",{"path":28,"step":29,"name":30},"\u002Ftutorial\u002F5-a-link",5,"A link",{"path":32,"step":33,"name":34},"\u002Ftutorial\u002F6-a-fact",6,"A fact",{"path":36,"step":37,"name":38},"\u002Ftutorial\u002F7-an-app",7,"An app",{"path":40,"step":41,"name":42},"\u002Ftutorial\u002F8-split",8,"Split",{"id":44,"title":45,"aside":46,"body":47,"code":53,"concept":199,"description":200,"extension":201,"fig":202,"files":203,"grows":208,"heading":221,"install":222,"lede":200,"links":227,"meta":237,"name":18,"navigation":100,"path":16,"seo":238,"slug":239,"stem":240,"step":17,"tryIt":241,"zero":248,"__hash__":249},"tutorial\u002Ftutorial\u002F2-a-source.md","One line, and the rows stay","On Postgres it is { type: 'pg', url: process.env.DATABASE_URL }, and nothing else in the project changes.",{"type":48,"value":49,"toc":50},"minimark",[],{"title":51,"searchDepth":17,"depth":17,"links":52},"",[],[54,77,91,125],{"path":55,"state":51,"lines":56},"fronds\u002Fblog\u002Fentities\u002FPost.ts",[57,60,62,65,68,71,74],{"text":58,"added":5,"keys":59},"import { entity, oneOf, primary, text } from '@fougere\u002Fschema';",[],{"text":51,"added":5,"keys":61},[],{"text":63,"added":5,"keys":64},"export default class Post extends entity({",[],{"text":66,"added":5,"keys":67},"  id: primary(),",[],{"text":69,"added":5,"keys":70},"  title: text({ min: 1, max: 160 }),",[],{"text":72,"added":5,"keys":73},"  status: oneOf('draft', 'published', { default: 'draft' }),",[],{"text":75,"added":5,"keys":76},"}) {}",[],{"path":78,"state":51,"lines":79},"fronds\u002Fblog\u002Fhandlers\u002FPostHandler.ts",[80,83,86,88],{"text":81,"added":5,"keys":82},"import { Repository } from '@fougere\u002Fcore';",[],{"text":84,"added":5,"keys":85},"import Post from '..\u002Fentities\u002FPost.js';",[],{"text":51,"added":5,"keys":87},[],{"text":89,"added":5,"keys":90},"export default class PostHandler extends Repository\u003CPost> {}",[],{"path":92,"state":93,"lines":94},"fougere.config.ts","changed",[95,98,102,105,107,110,113,119,122],{"text":96,"added":5,"keys":97},"import '@fougere\u002Fadapter-rest';",[],{"text":99,"added":100,"keys":101},"import '@fougere\u002Fadapter-sql';",true,[],{"text":103,"added":5,"keys":104},"import { defineFougere } from '@fougere\u002Fcore';",[],{"text":51,"added":5,"keys":106},[],{"text":108,"added":5,"keys":109},"export default defineFougere({",[],{"text":111,"added":5,"keys":112},"  protocols: { rest: {} },",[],{"text":114,"added":100,"keys":115},"  sources: { main: { type: 'sqlite', path: '.data\u002Fblog.db' } },",[116,117,118],"a","b","c",{"text":120,"added":5,"keys":121},"  fronds: { '@fougere\u002Flog': {} },",[],{"text":123,"added":5,"keys":124},"});",[],{"path":126,"state":93,"lines":127},"package.json",[128,131,134,137,140,143,146,149,152,155,158,161,164,167,170,173,175,178,181,184,187,190,193,196],{"text":129,"added":5,"keys":130},"{",[],{"text":132,"added":5,"keys":133},"  \"name\": \"my-blog\",",[],{"text":135,"added":5,"keys":136},"  \"private\": true,",[],{"text":138,"added":5,"keys":139},"  \"type\": \"module\",",[],{"text":141,"added":5,"keys":142},"  \"scripts\": {",[],{"text":144,"added":5,"keys":145},"    \"typecheck\": \"tsc\",",[],{"text":147,"added":5,"keys":148},"    \"test\": \"vitest run --config tests\u002Fvitest.config.ts\"",[],{"text":150,"added":5,"keys":151},"  },",[],{"text":153,"added":5,"keys":154},"  \"dependencies\": {",[],{"text":156,"added":5,"keys":157},"    \"@fougere\u002Fadapter-rest\": \"latest\",",[],{"text":159,"added":100,"keys":160},"    \"@fougere\u002Fadapter-sql\": \"latest\",",[],{"text":162,"added":5,"keys":163},"    \"@fougere\u002Fcore\": \"latest\",",[],{"text":165,"added":5,"keys":166},"    \"@fougere\u002Flog\": \"latest\",",[],{"text":168,"added":100,"keys":169},"    \"@fougere\u002Fschema\": \"latest\",",[],{"text":171,"added":100,"keys":172},"    \"better-sqlite3\": \"^13.0.3\"",[],{"text":150,"added":5,"keys":174},[],{"text":176,"added":5,"keys":177},"  \"devDependencies\": {",[],{"text":179,"added":5,"keys":180},"    \"@fougere\u002Fcli\": \"latest\",",[],{"text":182,"added":5,"keys":183},"    \"@fougere\u002Ftesting\": \"latest\",",[],{"text":185,"added":5,"keys":186},"    \"@types\u002Fnode\": \"^22.19.15\",",[],{"text":188,"added":5,"keys":189},"    \"typescript\": \"^7.0.2\",",[],{"text":191,"added":5,"keys":192},"    \"vitest\": \"^4.1.0\"",[],{"text":194,"added":5,"keys":195},"  }",[],{"text":197,"added":5,"keys":198},"}",[],"configuration","Rows in memory are lost at every restart, so we add SQLite with one line in sources. The app then refuses to start until the table exists, and fougere migrate creates it.","md","The handler asks for its rows as before. Where they live is a line of config.",[204,205,206,207],{"path":55,"state":51},{"path":78,"state":51},{"path":92,"state":93},{"path":126,"state":93},[209,213,217],{"key":116,"side":210,"label":211,"detail":212},"in","the posts table","created by fougere migrate, read from Post",{"key":117,"side":214,"label":215,"detail":216},"out","posts in .data\u002Fblog.db","SQLite, kept between restarts",{"key":118,"side":218,"label":219,"detail":220},"refuses","the boot, until you migrate","the database is missing 1 change(s): posts — no table, and the command that adds it","One line, *and the rows stay*",{"npm":223,"pnpm":224,"bun":225,"yarn":226},"npm install @fougere\u002Fadapter-sql better-sqlite3","pnpm add @fougere\u002Fadapter-sql better-sqlite3","bun add @fougere\u002Fadapter-sql better-sqlite3","yarn add @fougere\u002Fadapter-sql better-sqlite3",[228,231,234],{"title":229,"path":230},"SQLite or Postgres","\u002Fdocs\u002Fdata\u002Fsql",{"title":232,"path":233},"Evolve a schema","\u002Fdocs\u002Fdata\u002Fevolve",{"title":235,"path":236},"Configuration","\u002Fdocs\u002Fconcepts\u002Fconfiguration",{},{"title":45,"description":200},"2-a-source","tutorial\u002F2-a-source",{"command":242,"said":243,"output":247},"npx fougere migrate --latest --apply",{"npm":242,"pnpm":244,"bun":245,"yarn":246},"pnpm exec fougere migrate --latest --apply","bunx fougere migrate --latest --apply","yarn fougere migrate --latest --apply","◇  create posts\n◆  1 change(s) applied.","fronds\u002F","5BCdzwv14Nj1rUEHGthYnoXsawA26tJh2W9l4Rlm5n0",1794396615568]