[{"data":1,"prerenderedAt":253},["ShallowReactive",2],{"search-de":3,"content-de-developer\u002Fdecisions\u002F004-monorepo-bun-workspaces":4,"surround-de-\u002Fdeveloper\u002Fdecisions\u002F004-monorepo-bun-workspaces":244},[],{"id":5,"title":6,"body":7,"description":236,"extension":237,"meta":238,"navigation":239,"path":240,"seo":241,"stem":242,"__hash__":243},"content_de\u002F3.developer\u002Fdecisions\u002F5.004-monorepo-bun-workspaces.md","ADR-004: Monorepo mit Bun Workspaces",{"type":8,"value":9,"toc":230},"minimark",[10,27,32,41,44,65,69,80,83,93,129,133,138,204,209],[11,12,13,21],"ul",{},[14,15,16,20],"li",{},[17,18,19],"strong",{},"Status:"," Angenommen",[14,22,23,26],{},[17,24,25],{},"Datum:"," 2024-06-15",[28,29,31],"h2",{"id":30},"kontext","Kontext",[33,34,35,36,40],"p",{},"Owlat besteht aus mehreren miteinander verbundenen Teilen: einem Nuxt-Frontend, einem Convex-Backend, einer Dokumentationsseite, einer E-Mail-Builder-Komponente, einer E-Mail-Renderer-Bibliothek, gemeinsamen Typen und veröffentlichbaren SDKs. Diese Packages teilen sich Typen und Utilities in großem Umfang — so hängen etwa sowohl der E-Mail-Builder als auch der E-Mail-Renderer für die Block-Typdefinitionen von ",[37,38,39],"code",{},"@owlat\u002Fshared"," ab.",[33,42,43],{},"Die wesentlichen Optionen:",[45,46,47,53,59],"ol",{},[14,48,49,52],{},[17,50,51],{},"Getrennte Repositories"," — jedes Package in einem eigenen Repo, gemeinsamer Code über veröffentlichte npm-Packages. Saubere Grenzen, aber langsame Iteration: Die Änderung eines gemeinsamen Typs erfordert Veröffentlichen, Versionsanhebungen und das Aktualisieren der Consumer.",[14,54,55,58],{},[17,56,57],{},"Monorepo mit npm-\u002Fpnpm-Workspaces"," — Code an einem Ort, Abhängigkeiten per Symlink. Gut etabliert, aber langsamere Installationen und komplexeres Tooling.",[14,60,61,64],{},[17,62,63],{},"Monorepo mit Bun Workspaces"," — dasselbe Workspace-Modell, aber mit Buns schneller Installation, nativer TypeScript-Ausführung und Turbo für die Task-Orchestrierung.",[28,66,68],{"id":67},"entscheidung","Entscheidung",[33,70,71,72,75,76,79],{},"Ein Monorepo mit Bun Workspaces und Turborepo für die Task-Orchestrierung einsetzen. Alle Apps und Packages liegen in einem einzigen Repository unter ",[37,73,74],{},"apps\u002F"," und ",[37,77,78],{},"packages\u002F",".",[33,81,82],{},"Struktur:",[84,85,90],"pre",{"className":86,"code":88,"language":89},[87],"language-text","apps\u002Fweb        — @owlat\u002Fweb (Nuxt frontend)\napps\u002Fapi        — @owlat\u002Fapi (Convex backend)\napps\u002Fdocs       — @owlat\u002Fdocs (Nuxt + @nuxt\u002Fcontent)\npackages\u002Fshared — @owlat\u002Fshared (types, utilities)\npackages\u002Femail-builder   — @owlat\u002Femail-builder\npackages\u002Femail-renderer  — @owlat\u002Femail-renderer\npackages\u002Fsdk-js          — @owlat\u002Fsdk-js\npackages\u002Fui              — @owlat\u002Fui\n","text",[37,91,88],{"__ignoreMap":92},"",[33,94,95,96,99,100,99,103,99,106,99,109,112,113,116,117,120,121,124,125,128],{},"Dies ist ein repräsentativer Ausschnitt; das Repo enthält darüber hinaus weitere Apps (",[37,97,98],{},"apps\u002Fmta",", ",[37,101,102],{},"apps\u002Fmarketing",[37,104,105],{},"apps\u002Fimap",[37,107,108],{},"apps\u002Fupdater",[37,110,111],{},"apps\u002Fsetup-cli"," und mehr) sowie weitere Packages. Zu beachten: ",[37,114,115],{},"packages\u002Fsdk-java"," ist ein Java-SDK und wird explizit aus den Bun Workspaces ausgenommen (",[37,118,119],{},"!packages\u002Fsdk-java"," in ",[37,122,123],{},"workspaces.packages"," der Root-",[37,126,127],{},"package.json",").",[28,130,132],{"id":131},"konsequenzen","Konsequenzen",[33,134,135],{},[17,136,137],{},"Ermöglicht:",[11,139,140,147,150,175,186,197],{},[14,141,142,143,146],{},"Atomare paketübergreifende Änderungen — eine Typänderung in ",[37,144,145],{},"shared"," und ihre Consumer gehen in einem einzigen PR raus",[14,148,149],{},"Schnelle Installationen — Buns Linker ist bei der Workspace-Auflösung deutlich schneller als npm\u002Fpnpm",[14,151,152,153,120,156,159,160,163,164,167,168,171,172,79],{},"Turbo-Caching — Build-Ausgaben werden gecacht (der Task ",[37,154,155],{},"build",[37,157,158],{},"turbo.json"," deklariert ",[37,161,162],{},"outputs","), sodass ",[37,165,166],{},"bun run build"," unveränderte Packages überspringt. Tests laufen ungecacht: Der Task ",[37,169,170],{},"test"," setzt ",[37,173,174],{},"\"cache\": false",[14,176,177,178,181,182,185],{},"Eine einzige CI-Pipeline — ",[37,179,180],{},".github\u002Fworkflows\u002Ftest.yml"," (Workflow-Name „CI“) führt alle Workspace-Tests aus, über eine Matrix pro Workspace, die ",[37,183,184],{},"bun run --cwd \u003Cworkspace> test:coverage"," für jeden Workspace unabhängig aufruft",[14,187,188,189,192,193,196],{},"Gemeinsames Tooling — eine ",[37,190,191],{},"oxlintrc.json",", eine ",[37,194,195],{},"oxfmtrc.json",", eine Turbo-Konfiguration",[14,198,199,200,203],{},"Changesets für die SDK-Veröffentlichung — ",[37,201,202],{},"@changesets\u002Fcli"," verwaltet die Versionierung der veröffentlichbaren Packages",[33,205,206],{},[17,207,208],{},"Abwägungen:",[11,210,211,214,221,224],{},[14,212,213],{},"Alle Mitwirkenden benötigen eine Bun-Installation (nicht nur Node)",[14,215,216,217,220],{},"Große ",[37,218,219],{},"bun.lock","-Datei, die bei Abhängigkeitsänderungen Merge-Konflikte verursachen kann",[14,222,223],{},"Turbo fügt eine Build-Orchestrierungsschicht hinzu, die neue Mitwirkende verstehen müssen",[14,225,226,227,229],{},"Die CI führt alle Workspace-Prüfungen aus, selbst bei Änderungen an einem einzelnen Package. Build-Caching hilft, doch Tests sind ungecacht; der Test-Job dämpft die Kosten mit einer Matrix pro Workspace in ",[37,228,180],{},", sodass Workspaces parallel statt sequenziell laufen",{"title":92,"searchDepth":231,"depth":231,"links":232},2,[233,234,235],{"id":30,"depth":231,"text":31},{"id":67,"depth":231,"text":68},{"id":131,"depth":231,"text":132},"Warum Owlat ein Monorepo mit Bun Workspaces und Turborepo einsetzt — für schnelle Installationen, atomare paketübergreifende Änderungen und gecachte CI.","md",{},true,"\u002Fdeveloper\u002Fdecisions\u002F004-monorepo-bun-workspaces",{"title":6,"description":236},"3.developer\u002Fdecisions\u002F5.004-monorepo-bun-workspaces","zJ0dQ8KoMG475Jsb-uQ9SG6xE4Rk_kFn4bJWEyT0nRQ",[245,249],{"title":246,"path":247,"stem":248,"children":-1},"ADR-003: Notion-artiger E-Mail-Builder","\u002Fdeveloper\u002Fdecisions\u002F003-notion-like-builder","3.developer\u002Fdecisions\u002F4.003-notion-like-builder",{"title":250,"path":251,"stem":252,"children":-1},"ADR-005: Eigener MTA","\u002Fdeveloper\u002Fdecisions\u002F005-custom-mta","3.developer\u002Fdecisions\u002F6.005-custom-mta",1786915110600]