[{"data":1,"prerenderedAt":1790},["ShallowReactive",2],{"navigation_docs":3,"-libraries-migrating":612,"-libraries-migrating-surround":1785},[4,35,85,138,318,453,489,548,587],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Start","\u002Fstart","1.start",[9,14,19,24,29],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Why start with evlog","\u002Fstart\u002Fwhy-evlog","1.start\u002F2.why-evlog","i-lucide-rocket",{"title":20,"path":21,"stem":22,"icon":23},"Installation","\u002Fstart\u002Finstallation","1.start\u002F3.installation","i-lucide-download",{"title":25,"path":26,"stem":27,"icon":28},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F4.quick-start","i-lucide-zap",{"title":30,"path":31,"stem":32,"icon":33},"Choose your logger","\u002Fstart\u002Ftypescript-logging-library","1.start\u002F5.typescript-logging-library","i-lucide-file-code",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Learn","\u002Flearn","2.learn",[40,45,50,55,60,65,70,75,80],{"title":41,"path":42,"stem":43,"icon":44},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":46,"path":47,"stem":48,"icon":49},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":51,"path":52,"stem":53,"icon":54},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":56,"path":57,"stem":58,"icon":59},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":61,"path":62,"stem":63,"icon":64},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":66,"path":67,"stem":68,"icon":69},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":71,"path":72,"stem":73,"icon":74},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":76,"path":77,"stem":78,"icon":79},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":81,"path":82,"stem":83,"icon":84},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":86,"path":87,"stem":88,"children":89,"page":34},"CLI","\u002Fcli","3.cli",[90,93,98,103,108,113,118,123,128,133],{"title":41,"path":91,"stem":92,"icon":49},"\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":94,"path":95,"stem":96,"icon":97},"init","\u002Fcli\u002Finit","3.cli\u002F1.init","i-lucide-wand-sparkles",{"title":99,"path":100,"stem":101,"icon":102},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":104,"path":105,"stem":106,"icon":107},"Rules","\u002Fcli\u002Frules","3.cli\u002F3.rules","i-lucide-list-checks",{"title":109,"path":110,"stem":111,"icon":112},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring","i-lucide-gauge",{"title":114,"path":115,"stem":116,"icon":117},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":119,"path":120,"stem":121,"icon":122},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":124,"path":125,"stem":126,"icon":127},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":129,"path":130,"stem":131,"icon":132},"agents","\u002Fcli\u002Fagents","3.cli\u002F8.agents","i-lucide-bot",{"title":134,"path":135,"stem":136,"icon":137},"Observability Score","\u002Fcli\u002Fobservability-score","3.cli\u002F9.observability-score","i-lucide-activity",{"title":139,"path":140,"stem":141,"children":142,"page":34},"Integrate","\u002Fintegrate","4.integrate",[143,147,230],{"title":41,"path":144,"stem":145,"icon":146},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":148,"path":149,"stem":150,"children":151,"page":34},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[152,155,185,210],{"title":41,"path":153,"stem":154,"icon":44},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":156,"path":157,"stem":158,"children":159,"page":34},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[160,165,170,175,180],{"title":161,"path":162,"stem":163,"icon":164},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":166,"path":167,"stem":168,"icon":169},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F02.posthog","i-simple-icons-posthog",{"title":171,"path":172,"stem":173,"icon":174},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F03.sentry","i-simple-icons-sentry",{"title":176,"path":177,"stem":178,"icon":179},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F04.better-stack","i-simple-icons-betterstack",{"title":181,"path":182,"stem":183,"icon":184},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F05.datadog","i-simple-icons-datadog",{"title":186,"path":187,"stem":188,"children":189,"page":34},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[190,195,200,205],{"title":191,"path":192,"stem":193,"icon":194},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":196,"path":197,"stem":198,"icon":199},"ClickHouse","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fclickhouse","4.integrate\u002Fadapters\u002Fhybrid\u002F02.clickhouse","i-simple-icons-clickhouse",{"title":201,"path":202,"stem":203,"icon":204},"OTLP","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fotlp","4.integrate\u002Fadapters\u002Fhybrid\u002F03.otlp","i-simple-icons-opentelemetry",{"title":206,"path":207,"stem":208,"icon":209},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fhyperdx","4.integrate\u002Fadapters\u002Fhybrid\u002F04.hyperdx","i-custom-hyperdx",{"title":211,"path":212,"stem":213,"children":214,"page":34},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[215,220,225],{"title":216,"path":217,"stem":218,"icon":219},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":221,"path":222,"stem":223,"icon":224},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":226,"path":227,"stem":228,"icon":229},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":231,"path":232,"stem":233,"children":234,"page":34},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[235,239,244,249,254,259,264,269,274,279,284,289,294,299,303,308,313],{"title":41,"path":236,"stem":237,"icon":238},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":240,"path":241,"stem":242,"icon":243},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":245,"path":246,"stem":247,"icon":248},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":250,"path":251,"stem":252,"icon":253},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":255,"path":256,"stem":257,"icon":258},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":260,"path":261,"stem":262,"icon":263},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":265,"path":266,"stem":267,"icon":268},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":270,"path":271,"stem":272,"icon":273},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":275,"path":276,"stem":277,"icon":278},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":280,"path":281,"stem":282,"icon":283},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":285,"path":286,"stem":287,"icon":288},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":290,"path":291,"stem":292,"icon":293},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":295,"path":296,"stem":297,"icon":298},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":300,"path":301,"stem":302,"icon":79},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":304,"path":305,"stem":306,"icon":307},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":309,"path":310,"stem":311,"icon":312},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":314,"path":315,"stem":316,"icon":317},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":319,"path":320,"stem":321,"children":322,"page":34},"Use Cases","\u002Fuse-cases","5.use-cases",[323,326,331,359,386,418,439,444,449],{"title":41,"path":324,"stem":325,"icon":107},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":327,"path":328,"stem":329,"icon":330},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":332,"icon":333,"path":334,"stem":335,"children":336,"page":34},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[337,340,345,350,355],{"title":41,"path":338,"stem":339,"icon":44},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":341,"path":342,"stem":343,"icon":344},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":346,"path":347,"stem":348,"icon":349},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":351,"path":352,"stem":353,"icon":354},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":356,"path":357,"stem":358,"icon":137},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry",{"title":360,"icon":361,"path":362,"stem":363,"children":364,"page":34},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[365,368,373,378,382],{"title":41,"path":366,"stem":367,"icon":44},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":369,"path":370,"stem":371,"icon":372},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":374,"path":375,"stem":376,"icon":377},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":379,"path":380,"stem":381,"icon":330},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":383,"path":384,"stem":385,"icon":112},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":387,"icon":388,"path":389,"stem":390,"children":391,"page":34},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[392,395,400,405,410,414],{"title":41,"path":393,"stem":394,"icon":44},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":396,"path":397,"stem":398,"icon":399},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":401,"path":402,"stem":403,"icon":404},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":406,"path":407,"stem":408,"icon":409},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":411,"path":412,"stem":413,"icon":388},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":415,"path":416,"stem":417,"icon":84},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":356,"icon":112,"path":419,"stem":420,"children":421,"page":34},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[422,425,430,435],{"title":41,"path":423,"stem":424,"icon":44},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":426,"path":427,"stem":428,"icon":429},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":431,"path":432,"stem":433,"icon":434},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":436,"path":437,"stem":438,"icon":84},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":440,"path":441,"stem":442,"icon":443},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":445,"path":446,"stem":447,"icon":448},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":450,"path":451,"stem":452,"icon":434},"Node.js request logging","\u002Fuse-cases\u002Fstructured-logging-nodejs","5.use-cases\u002F6.structured-logging-nodejs",{"title":454,"path":455,"stem":456,"children":457,"page":34},"Libraries","\u002Flibraries","6.libraries",[458,462,467,470,474,479,484],{"title":41,"path":459,"stem":460,"icon":461},"\u002Flibraries\u002Foverview","6.libraries\u002F0.overview","i-lucide-package",{"title":463,"path":464,"stem":465,"icon":466},"Emitting Events","\u002Flibraries\u002Femitting","6.libraries\u002F1.emitting","i-lucide-radio",{"title":56,"path":468,"stem":469,"icon":59},"\u002Flibraries\u002Ferrors","6.libraries\u002F2.errors",{"title":471,"path":472,"stem":473,"icon":132},"Errors Agents Can Act On","\u002Flibraries\u002Fagents","6.libraries\u002F3.agents",{"title":475,"path":476,"stem":477,"icon":478},"Exporting the Catalog","\u002Flibraries\u002Fexporting","6.libraries\u002F4.exporting","i-lucide-file-output",{"title":480,"path":481,"stem":482,"icon":483},"Migrating","\u002Flibraries\u002Fmigrating","6.libraries\u002F5.migrating","i-lucide-route",{"title":485,"path":486,"stem":487,"icon":488},"Testing","\u002Flibraries\u002Ftesting","6.libraries\u002F6.testing","i-lucide-flask-conical",{"title":490,"path":491,"stem":492,"children":493,"page":34},"Extend","\u002Fextend","7.extend",[494,498,503,508,512,517,521,525,529,533,538,543],{"title":41,"path":495,"stem":496,"icon":497},"\u002Fextend\u002Foverview","7.extend\u002F0.overview","i-lucide-blocks",{"title":499,"path":500,"stem":501,"icon":502},"Stream","\u002Fextend\u002Fstream","7.extend\u002F1.stream","i-lucide-radio-tower",{"title":504,"path":505,"stem":506,"icon":507},"Custom framework","\u002Fextend\u002Fcustom-framework","7.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":509,"path":510,"stem":511,"icon":502},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","7.extend\u002F11.diagnostics-channel",{"title":513,"path":514,"stem":515,"icon":516},"FS reader","\u002Fextend\u002Ffs-reader","7.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":415,"path":518,"stem":519,"icon":520},"\u002Fextend\u002Fconsumer-recipes","7.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":522,"path":523,"stem":524,"icon":497},"Plugins","\u002Fextend\u002Fplugins","7.extend\u002F4.plugins",{"title":526,"path":527,"stem":528,"icon":443},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","7.extend\u002F5.custom-enrichers",{"title":530,"path":531,"stem":532,"icon":69},"Tail sampling","\u002Fextend\u002Ftail-sampling","7.extend\u002F6.tail-sampling",{"title":534,"path":535,"stem":536,"icon":537},"Identity headers","\u002Fextend\u002Fidentity-headers","7.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":539,"path":540,"stem":541,"icon":542},"Custom drains","\u002Fextend\u002Fcustom-drains","7.extend\u002F8.custom-drains","i-lucide-share-2",{"title":544,"path":545,"stem":546,"icon":547},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","7.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":436,"path":549,"stem":550,"children":551,"page":34},"\u002Freference","8.reference",[552,556,561,564,569,573,578,582],{"title":41,"path":553,"stem":554,"icon":555},"\u002Freference\u002Foverview","8.reference\u002F0.overview","i-lucide-book-marked",{"title":557,"path":558,"stem":559,"icon":560},"Configuration","\u002Freference\u002Fconfiguration","8.reference\u002F1.configuration","i-lucide-settings",{"title":383,"path":562,"stem":563,"icon":112},"\u002Freference\u002Fperformance","8.reference\u002F2.performance",{"title":565,"path":566,"stem":567,"icon":568},"Vite Plugin","\u002Freference\u002Fvite-plugin","8.reference\u002F3.vite-plugin","i-custom-vite",{"title":570,"path":571,"stem":572,"icon":388},"Best Practices","\u002Freference\u002Fbest-practices","8.reference\u002F4.best-practices",{"title":574,"path":575,"stem":576,"icon":577},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","8.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":579,"path":580,"stem":581,"icon":443},"Agent Skills","\u002Freference\u002Fagent-skills","8.reference\u002F6.agent-skills",{"title":583,"path":584,"stem":585,"icon":586},"Cost","\u002Freference\u002Fcost","8.reference\u002F7.cost","i-lucide-receipt",{"title":588,"path":589,"stem":590,"children":591,"page":34},"Compare","\u002Fcompare","9.compare",[592,596,600,604,608],{"title":593,"path":594,"stem":595,"icon":577},"evlog vs Pino","\u002Fcompare\u002Fpino","9.compare\u002F1.pino",{"title":597,"path":598,"stem":599,"icon":204},"evlog vs OpenTelemetry","\u002Fcompare\u002Fopentelemetry","9.compare\u002F2.opentelemetry",{"title":601,"path":602,"stem":603,"icon":577},"evlog vs LogTape","\u002Fcompare\u002Flogtape","9.compare\u002F3.logtape",{"title":605,"path":606,"stem":607,"icon":577},"evlog vs Winston: formats and request events","\u002Fcompare\u002Fwinston","9.compare\u002F4.winston",{"title":609,"path":610,"stem":611,"icon":577},"evlog vs Consola: reporters and request context","\u002Fcompare\u002Fconsola","9.compare\u002F5.consola",{"id":613,"title":480,"body":614,"description":1778,"extension":1779,"links":1780,"meta":1781,"navigation":1782,"path":481,"seo":1783,"stem":482,"__hash__":1784},"docs\u002F6.libraries\u002F5.migrating.md",{"type":615,"value":616,"toc":1771},"minimark",[617,651,656,659,704,710,714,724,849,852,856,869,1224,1228,1235,1615,1625,1629,1632,1759,1767],[618,619,620,621,625,626,629,630,633,634,637,638,647,648,650],"p",{},"You have a published package, thirty ",[622,623,624],"code",{},"throw new Error(...)"," sites, and consumers matching on message strings because that is all you gave them. Replacing everything in one release breaks those consumers and ships a catalog whose ",[622,627,628],{},"why"," and ",[622,631,632],{},"fix"," were written in an afternoon. The order below converts the package in five steps, each one shippable, with the boundary you already have as the first target. The example package is ",[622,635,636],{},"mylib","; ",[639,640,644],"a",{"href":641,"rel":642},"https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fgithub-tools",[643],"nofollow",[622,645,646],{},"@github-tools\u002Fsdk"," followed the same path and its catalog on ",[639,649,56],{"href":468}," is the result.",[652,653,655],"h2",{"id":654},"step-1-inventory-the-throws-and-group-them-by-cause","Step 1: Inventory the throws and group them by cause",[618,657,658],{},"List every throw site and every place an upstream error escapes uncaught. Group by what went wrong, not by where it went wrong: ten call sites that all fail because the token is missing are one catalog entry.",[660,661,667],"pre",{"className":662,"code":663,"filename":664,"language":665,"meta":666,"style":666},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","grep -rn \"throw new Error\\|throw err\\|reject(\" src\u002F | wc -l\n","Terminal","bash","",[622,668,669],{"__ignoreMap":666},[670,671,674,678,682,686,689,692,695,698,701],"span",{"class":672,"line":673},"line",1,[670,675,677],{"class":676},"sBMFI","grep",[670,679,681],{"class":680},"sfazB"," -rn",[670,683,685],{"class":684},"sMK4o"," \"",[670,687,688],{"class":680},"throw new Error\\|throw err\\|reject(",[670,690,691],{"class":684},"\"",[670,693,694],{"class":680}," src\u002F",[670,696,697],{"class":684}," |",[670,699,700],{"class":676}," wc",[670,702,703],{"class":680}," -l\n",[618,705,706,707,709],{},"The groups become your first entry list. Most packages land between eight and fifteen entries; a group you cannot name a fix for is not an entry yet, and stays a bare error until you can. ",[639,708,471],{"href":472}," is the test each group has to pass.",[652,711,713],{"id":712},"step-2-pick-the-prefix-and-add-the-peer-dependency","Step 2: Pick the prefix and add the peer dependency",[618,715,716,717,720,721,723],{},"The prefix is your package name in the form a host will type in a dashboard filter: ",[622,718,719],{},"github_tools",", not ",[622,722,646],{},". It never changes after the first release that ships a code, so decide it once.",[660,725,730],{"className":726,"code":727,"filename":728,"language":729,"meta":666,"style":666},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"peerDependencies\": {\n    \"evlog\": \"^2.0.0\"\n  },\n  \"exports\": {\n    \".\": \".\u002Fdist\u002Findex.mjs\",\n    \".\u002Ferrors\": \".\u002Fdist\u002Ferrors.mjs\"\n  }\n}\n","package.json","json",[622,731,732,737,755,776,782,796,818,837,843],{"__ignoreMap":666},[670,733,734],{"class":672,"line":673},[670,735,736],{"class":684},"{\n",[670,738,740,743,747,749,752],{"class":672,"line":739},2,[670,741,742],{"class":684},"  \"",[670,744,746],{"class":745},"spNyl","peerDependencies",[670,748,691],{"class":684},[670,750,751],{"class":684},":",[670,753,754],{"class":684}," {\n",[670,756,758,761,764,766,768,770,773],{"class":672,"line":757},3,[670,759,760],{"class":684},"    \"",[670,762,763],{"class":676},"evlog",[670,765,691],{"class":684},[670,767,751],{"class":684},[670,769,685],{"class":684},[670,771,772],{"class":680},"^2.0.0",[670,774,775],{"class":684},"\"\n",[670,777,779],{"class":672,"line":778},4,[670,780,781],{"class":684},"  },\n",[670,783,785,787,790,792,794],{"class":672,"line":784},5,[670,786,742],{"class":684},[670,788,789],{"class":745},"exports",[670,791,691],{"class":684},[670,793,751],{"class":684},[670,795,754],{"class":684},[670,797,799,801,804,806,808,810,813,815],{"class":672,"line":798},6,[670,800,760],{"class":684},[670,802,803],{"class":676},".",[670,805,691],{"class":684},[670,807,751],{"class":684},[670,809,685],{"class":684},[670,811,812],{"class":680},".\u002Fdist\u002Findex.mjs",[670,814,691],{"class":684},[670,816,817],{"class":684},",\n",[670,819,821,823,826,828,830,832,835],{"class":672,"line":820},7,[670,822,760],{"class":684},[670,824,825],{"class":676},".\u002Ferrors",[670,827,691],{"class":684},[670,829,751],{"class":684},[670,831,685],{"class":684},[670,833,834],{"class":680},".\u002Fdist\u002Ferrors.mjs",[670,836,775],{"class":684},[670,838,840],{"class":672,"line":839},8,[670,841,842],{"class":684},"  }\n",[670,844,846],{"class":672,"line":845},9,[670,847,848],{"class":684},"}\n",[618,850,851],{},"Adding a peer dependency is a minor release for most packages: hosts that already run evlog change nothing, and hosts that do not get an install prompt. Say so in the changelog.",[652,853,855],{"id":854},"step-3-write-the-catalog-before-touching-a-throw","Step 3: Write the catalog before touching a throw",[618,857,858,859,861,862,864,865,868],{},"Create the catalog module with every entry from step 1, and write ",[622,860,628],{},", ",[622,863,632],{},", and ",[622,866,867],{},"link"," for each one now, while the causes are in front of you. Ship this step on its own: the module exists, nothing throws from it yet, and a consumer can already import the codes.",[660,870,875],{"className":871,"code":872,"filename":873,"language":874,"meta":666,"style":666},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { defineErrorCatalog } from 'evlog'\n\nexport const errors = defineErrorCatalog('mylib', {\n  TOKEN_REQUIRED: {\n    status: 401,\n    message: 'API token is required. Pass it as `token` or set MYLIB_TOKEN.',\n    why: 'No token string or MYLIB_TOKEN environment variable was available when the client resolved its credentials.',\n    fix: 'Pass `token` when creating the client, or set MYLIB_TOKEN in the environment the process runs in.',\n    link: 'https:\u002F\u002Fmylib.dev\u002Fguide\u002Fauth',\n  },\n  RATE_LIMITED: {\n    status: 429,\n    message: ({ resetAt }: { resetAt: string }) => `Rate limit exhausted; resets at ${resetAt}`,\n    why: 'The token used up its request quota for this resource.',\n    fix: 'Stop calling this method and retry after the reset timestamp in the message.',\n    link: 'https:\u002F\u002Fmylib.dev\u002Fguide\u002Frate-limits',\n  },\n})\n\ndeclare module 'evlog' {\n  interface RegisteredErrorCatalogs {\n    mylib: typeof errors\n  }\n}\n","src\u002Ferrors.ts","typescript",[622,876,877,904,910,942,952,965,981,997,1013,1029,1034,1044,1056,1105,1121,1137,1153,1158,1167,1172,1189,1200,1214,1219],{"__ignoreMap":666},[670,878,879,883,886,890,893,896,899,901],{"class":672,"line":673},[670,880,882],{"class":881},"s7zQu","import",[670,884,885],{"class":684}," {",[670,887,889],{"class":888},"sTEyZ"," defineErrorCatalog",[670,891,892],{"class":684}," }",[670,894,895],{"class":881}," from",[670,897,898],{"class":684}," '",[670,900,763],{"class":680},[670,902,903],{"class":684},"'\n",[670,905,906],{"class":672,"line":739},[670,907,909],{"emptyLinePlaceholder":908},true,"\n",[670,911,912,915,918,921,924,927,930,933,935,937,940],{"class":672,"line":757},[670,913,914],{"class":881},"export",[670,916,917],{"class":745}," const",[670,919,920],{"class":888}," errors ",[670,922,923],{"class":684},"=",[670,925,889],{"class":926},"s2Zo4",[670,928,929],{"class":888},"(",[670,931,932],{"class":684},"'",[670,934,636],{"class":680},[670,936,932],{"class":684},[670,938,939],{"class":684},",",[670,941,754],{"class":684},[670,943,944,948,950],{"class":672,"line":778},[670,945,947],{"class":946},"swJcz","  TOKEN_REQUIRED",[670,949,751],{"class":684},[670,951,754],{"class":684},[670,953,954,957,959,963],{"class":672,"line":784},[670,955,956],{"class":946},"    status",[670,958,751],{"class":684},[670,960,962],{"class":961},"sbssI"," 401",[670,964,817],{"class":684},[670,966,967,970,972,974,977,979],{"class":672,"line":798},[670,968,969],{"class":946},"    message",[670,971,751],{"class":684},[670,973,898],{"class":684},[670,975,976],{"class":680},"API token is required. Pass it as `token` or set MYLIB_TOKEN.",[670,978,932],{"class":684},[670,980,817],{"class":684},[670,982,983,986,988,990,993,995],{"class":672,"line":820},[670,984,985],{"class":946},"    why",[670,987,751],{"class":684},[670,989,898],{"class":684},[670,991,992],{"class":680},"No token string or MYLIB_TOKEN environment variable was available when the client resolved its credentials.",[670,994,932],{"class":684},[670,996,817],{"class":684},[670,998,999,1002,1004,1006,1009,1011],{"class":672,"line":839},[670,1000,1001],{"class":946},"    fix",[670,1003,751],{"class":684},[670,1005,898],{"class":684},[670,1007,1008],{"class":680},"Pass `token` when creating the client, or set MYLIB_TOKEN in the environment the process runs in.",[670,1010,932],{"class":684},[670,1012,817],{"class":684},[670,1014,1015,1018,1020,1022,1025,1027],{"class":672,"line":845},[670,1016,1017],{"class":946},"    link",[670,1019,751],{"class":684},[670,1021,898],{"class":684},[670,1023,1024],{"class":680},"https:\u002F\u002Fmylib.dev\u002Fguide\u002Fauth",[670,1026,932],{"class":684},[670,1028,817],{"class":684},[670,1030,1032],{"class":672,"line":1031},10,[670,1033,781],{"class":684},[670,1035,1037,1040,1042],{"class":672,"line":1036},11,[670,1038,1039],{"class":946},"  RATE_LIMITED",[670,1041,751],{"class":684},[670,1043,754],{"class":684},[670,1045,1047,1049,1051,1054],{"class":672,"line":1046},12,[670,1048,956],{"class":946},[670,1050,751],{"class":684},[670,1052,1053],{"class":961}," 429",[670,1055,817],{"class":684},[670,1057,1059,1061,1063,1066,1070,1073,1075,1077,1079,1082,1085,1088,1091,1094,1097,1100,1103],{"class":672,"line":1058},13,[670,1060,969],{"class":926},[670,1062,751],{"class":684},[670,1064,1065],{"class":684}," ({",[670,1067,1069],{"class":1068},"sHdIc"," resetAt",[670,1071,1072],{"class":684}," }:",[670,1074,885],{"class":684},[670,1076,1069],{"class":946},[670,1078,751],{"class":684},[670,1080,1081],{"class":676}," string",[670,1083,1084],{"class":684}," })",[670,1086,1087],{"class":745}," =>",[670,1089,1090],{"class":684}," `",[670,1092,1093],{"class":680},"Rate limit exhausted; resets at ",[670,1095,1096],{"class":684},"${",[670,1098,1099],{"class":888},"resetAt",[670,1101,1102],{"class":684},"}`",[670,1104,817],{"class":684},[670,1106,1108,1110,1112,1114,1117,1119],{"class":672,"line":1107},14,[670,1109,985],{"class":946},[670,1111,751],{"class":684},[670,1113,898],{"class":684},[670,1115,1116],{"class":680},"The token used up its request quota for this resource.",[670,1118,932],{"class":684},[670,1120,817],{"class":684},[670,1122,1124,1126,1128,1130,1133,1135],{"class":672,"line":1123},15,[670,1125,1001],{"class":946},[670,1127,751],{"class":684},[670,1129,898],{"class":684},[670,1131,1132],{"class":680},"Stop calling this method and retry after the reset timestamp in the message.",[670,1134,932],{"class":684},[670,1136,817],{"class":684},[670,1138,1140,1142,1144,1146,1149,1151],{"class":672,"line":1139},16,[670,1141,1017],{"class":946},[670,1143,751],{"class":684},[670,1145,898],{"class":684},[670,1147,1148],{"class":680},"https:\u002F\u002Fmylib.dev\u002Fguide\u002Frate-limits",[670,1150,932],{"class":684},[670,1152,817],{"class":684},[670,1154,1156],{"class":672,"line":1155},17,[670,1157,781],{"class":684},[670,1159,1161,1164],{"class":672,"line":1160},18,[670,1162,1163],{"class":684},"}",[670,1165,1166],{"class":888},")\n",[670,1168,1170],{"class":672,"line":1169},19,[670,1171,909],{"emptyLinePlaceholder":908},[670,1173,1175,1178,1181,1183,1185,1187],{"class":672,"line":1174},20,[670,1176,1177],{"class":745},"declare",[670,1179,1180],{"class":745}," module",[670,1182,898],{"class":684},[670,1184,763],{"class":680},[670,1186,932],{"class":684},[670,1188,754],{"class":684},[670,1190,1192,1195,1198],{"class":672,"line":1191},21,[670,1193,1194],{"class":745},"  interface",[670,1196,1197],{"class":676}," RegisteredErrorCatalogs",[670,1199,754],{"class":684},[670,1201,1203,1206,1208,1211],{"class":672,"line":1202},22,[670,1204,1205],{"class":946},"    mylib",[670,1207,751],{"class":684},[670,1209,1210],{"class":684}," typeof",[670,1212,1213],{"class":888}," errors\n",[670,1215,1217],{"class":672,"line":1216},23,[670,1218,842],{"class":684},[670,1220,1222],{"class":672,"line":1221},24,[670,1223,848],{"class":684},[652,1225,1227],{"id":1226},"step-4-replace-the-throws-at-the-boundary-first","Step 4: Replace the throws at the boundary first",[618,1229,1230,1231,1234],{},"Start with the one place upstream errors enter your package: the HTTP client, the SDK wrapper, the parser. A mapping function there converts most of the inventory in one file, keeps the original as ",[622,1232,1233],{},"cause",", and leaves unmapped statuses untouched:",[660,1236,1239],{"className":871,"code":1237,"filename":1238,"language":874,"meta":666,"style":666},"import { errors } from '.\u002Ferrors'\n\nfunction toMylibError(error: unknown): unknown {\n  if (!(error instanceof Error) || !('status' in error)) return error\n  const status = (error as { status: number }).status\n  const overrides = { cause: error, internal: { status } }\n\n  if (status === 401) return errors.TOKEN_REQUIRED(overrides)\n  if (status === 429) return errors.RATE_LIMITED({ resetAt: resetHeader(error), ...overrides })\n  return error\n}\n\nexport async function request(path: string): Promise\u003CResponse> {\n  try {\n    return await fetchWithAuth(path)\n  } catch (error) {\n    throw toMylibError(error)\n  }\n}\n","src\u002Fclient.ts",[622,1240,1241,1260,1264,1289,1343,1380,1414,1418,1449,1501,1508,1512,1516,1554,1561,1578,1594,1607,1611],{"__ignoreMap":666},[670,1242,1243,1245,1247,1250,1252,1254,1256,1258],{"class":672,"line":673},[670,1244,882],{"class":881},[670,1246,885],{"class":684},[670,1248,1249],{"class":888}," errors",[670,1251,892],{"class":684},[670,1253,895],{"class":881},[670,1255,898],{"class":684},[670,1257,825],{"class":680},[670,1259,903],{"class":684},[670,1261,1262],{"class":672,"line":739},[670,1263,909],{"emptyLinePlaceholder":908},[670,1265,1266,1269,1272,1274,1277,1279,1282,1285,1287],{"class":672,"line":757},[670,1267,1268],{"class":745},"function",[670,1270,1271],{"class":926}," toMylibError",[670,1273,929],{"class":684},[670,1275,1276],{"class":1068},"error",[670,1278,751],{"class":684},[670,1280,1281],{"class":676}," unknown",[670,1283,1284],{"class":684},"):",[670,1286,1281],{"class":676},[670,1288,754],{"class":684},[670,1290,1291,1294,1297,1300,1302,1304,1307,1310,1313,1316,1319,1321,1323,1326,1328,1331,1334,1337,1340],{"class":672,"line":778},[670,1292,1293],{"class":881},"  if",[670,1295,1296],{"class":946}," (",[670,1298,1299],{"class":684},"!",[670,1301,929],{"class":946},[670,1303,1276],{"class":888},[670,1305,1306],{"class":684}," instanceof",[670,1308,1309],{"class":676}," Error",[670,1311,1312],{"class":946},") ",[670,1314,1315],{"class":684},"||",[670,1317,1318],{"class":684}," !",[670,1320,929],{"class":946},[670,1322,932],{"class":684},[670,1324,1325],{"class":680},"status",[670,1327,932],{"class":684},[670,1329,1330],{"class":684}," in",[670,1332,1333],{"class":888}," error",[670,1335,1336],{"class":946},")) ",[670,1338,1339],{"class":881},"return",[670,1341,1342],{"class":888}," error\n",[670,1344,1345,1348,1351,1354,1356,1358,1361,1363,1365,1367,1370,1372,1375,1377],{"class":672,"line":784},[670,1346,1347],{"class":745},"  const",[670,1349,1350],{"class":888}," status",[670,1352,1353],{"class":684}," =",[670,1355,1296],{"class":946},[670,1357,1276],{"class":888},[670,1359,1360],{"class":881}," as",[670,1362,885],{"class":684},[670,1364,1350],{"class":946},[670,1366,751],{"class":684},[670,1368,1369],{"class":676}," number",[670,1371,892],{"class":684},[670,1373,1374],{"class":946},")",[670,1376,803],{"class":684},[670,1378,1379],{"class":888},"status\n",[670,1381,1382,1384,1387,1389,1391,1394,1396,1398,1400,1403,1405,1407,1409,1411],{"class":672,"line":798},[670,1383,1347],{"class":745},[670,1385,1386],{"class":888}," overrides",[670,1388,1353],{"class":684},[670,1390,885],{"class":684},[670,1392,1393],{"class":946}," cause",[670,1395,751],{"class":684},[670,1397,1333],{"class":888},[670,1399,939],{"class":684},[670,1401,1402],{"class":946}," internal",[670,1404,751],{"class":684},[670,1406,885],{"class":684},[670,1408,1350],{"class":888},[670,1410,892],{"class":684},[670,1412,1413],{"class":684}," }\n",[670,1415,1416],{"class":672,"line":820},[670,1417,909],{"emptyLinePlaceholder":908},[670,1419,1420,1422,1424,1426,1429,1431,1433,1435,1437,1439,1442,1444,1447],{"class":672,"line":839},[670,1421,1293],{"class":881},[670,1423,1296],{"class":946},[670,1425,1325],{"class":888},[670,1427,1428],{"class":684}," ===",[670,1430,962],{"class":961},[670,1432,1312],{"class":946},[670,1434,1339],{"class":881},[670,1436,1249],{"class":888},[670,1438,803],{"class":684},[670,1440,1441],{"class":926},"TOKEN_REQUIRED",[670,1443,929],{"class":946},[670,1445,1446],{"class":888},"overrides",[670,1448,1166],{"class":946},[670,1450,1451,1453,1455,1457,1459,1461,1463,1465,1467,1469,1472,1474,1477,1479,1481,1484,1486,1488,1490,1492,1495,1497,1499],{"class":672,"line":845},[670,1452,1293],{"class":881},[670,1454,1296],{"class":946},[670,1456,1325],{"class":888},[670,1458,1428],{"class":684},[670,1460,1053],{"class":961},[670,1462,1312],{"class":946},[670,1464,1339],{"class":881},[670,1466,1249],{"class":888},[670,1468,803],{"class":684},[670,1470,1471],{"class":926},"RATE_LIMITED",[670,1473,929],{"class":946},[670,1475,1476],{"class":684},"{",[670,1478,1069],{"class":946},[670,1480,751],{"class":684},[670,1482,1483],{"class":926}," resetHeader",[670,1485,929],{"class":946},[670,1487,1276],{"class":888},[670,1489,1374],{"class":946},[670,1491,939],{"class":684},[670,1493,1494],{"class":684}," ...",[670,1496,1446],{"class":888},[670,1498,892],{"class":684},[670,1500,1166],{"class":946},[670,1502,1503,1506],{"class":672,"line":1031},[670,1504,1505],{"class":881},"  return",[670,1507,1342],{"class":888},[670,1509,1510],{"class":672,"line":1036},[670,1511,848],{"class":684},[670,1513,1514],{"class":672,"line":1046},[670,1515,909],{"emptyLinePlaceholder":908},[670,1517,1518,1520,1523,1526,1529,1531,1534,1536,1538,1540,1543,1546,1549,1552],{"class":672,"line":1058},[670,1519,914],{"class":881},[670,1521,1522],{"class":745}," async",[670,1524,1525],{"class":745}," function",[670,1527,1528],{"class":926}," request",[670,1530,929],{"class":684},[670,1532,1533],{"class":1068},"path",[670,1535,751],{"class":684},[670,1537,1081],{"class":676},[670,1539,1284],{"class":684},[670,1541,1542],{"class":676}," Promise",[670,1544,1545],{"class":684},"\u003C",[670,1547,1548],{"class":676},"Response",[670,1550,1551],{"class":684},">",[670,1553,754],{"class":684},[670,1555,1556,1559],{"class":672,"line":1107},[670,1557,1558],{"class":881},"  try",[670,1560,754],{"class":684},[670,1562,1563,1566,1569,1572,1574,1576],{"class":672,"line":1123},[670,1564,1565],{"class":881},"    return",[670,1567,1568],{"class":881}," await",[670,1570,1571],{"class":926}," fetchWithAuth",[670,1573,929],{"class":946},[670,1575,1533],{"class":888},[670,1577,1166],{"class":946},[670,1579,1580,1583,1586,1588,1590,1592],{"class":672,"line":1139},[670,1581,1582],{"class":684},"  }",[670,1584,1585],{"class":881}," catch",[670,1587,1296],{"class":946},[670,1589,1276],{"class":888},[670,1591,1312],{"class":946},[670,1593,736],{"class":684},[670,1595,1596,1599,1601,1603,1605],{"class":672,"line":1155},[670,1597,1598],{"class":881},"    throw",[670,1600,1271],{"class":926},[670,1602,929],{"class":946},[670,1604,1276],{"class":888},[670,1606,1166],{"class":946},[670,1608,1609],{"class":672,"line":1160},[670,1610,842],{"class":684},[670,1612,1613],{"class":672,"line":1169},[670,1614,848],{"class":684},[618,1616,1617,1618,1621,1622,1624],{},"Then work through the remaining sites, one entry at a time. The messages consumers matched on keep working as long as the new ",[622,1619,1620],{},"message"," contains the old text, which is the compatibility rule for this step: change the shape, keep the words, and note the codes in the changelog so consumers can move to ",[622,1623,622],{}," at their pace.",[652,1626,1628],{"id":1627},"step-5-export-the-reference-and-lock-the-codes","Step 5: Export the reference and lock the codes",[618,1630,1631],{},"With every throw converted, generate the error reference from the catalog and add the two tests that make the catalog a contract:",[660,1633,1636],{"className":871,"code":1634,"filename":1635,"language":874,"meta":666,"style":666},"import { errors } from '..\u002Fsrc\u002Ferrors'\n\nit('keeps the wire format stable', () => {\n  expect(errors.TOKEN_REQUIRED.code).toBe('mylib.TOKEN_REQUIRED')\n  expect(errors.RATE_LIMITED.code).toBe('mylib.RATE_LIMITED')\n})\n","test\u002Ferrors.test.ts",[622,1637,1638,1657,1661,1684,1720,1753],{"__ignoreMap":666},[670,1639,1640,1642,1644,1646,1648,1650,1652,1655],{"class":672,"line":673},[670,1641,882],{"class":881},[670,1643,885],{"class":684},[670,1645,1249],{"class":888},[670,1647,892],{"class":684},[670,1649,895],{"class":881},[670,1651,898],{"class":684},[670,1653,1654],{"class":680},"..\u002Fsrc\u002Ferrors",[670,1656,903],{"class":684},[670,1658,1659],{"class":672,"line":739},[670,1660,909],{"emptyLinePlaceholder":908},[670,1662,1663,1666,1668,1670,1673,1675,1677,1680,1682],{"class":672,"line":757},[670,1664,1665],{"class":926},"it",[670,1667,929],{"class":888},[670,1669,932],{"class":684},[670,1671,1672],{"class":680},"keeps the wire format stable",[670,1674,932],{"class":684},[670,1676,939],{"class":684},[670,1678,1679],{"class":684}," ()",[670,1681,1087],{"class":745},[670,1683,754],{"class":684},[670,1685,1686,1689,1691,1694,1696,1698,1700,1702,1704,1706,1709,1711,1713,1716,1718],{"class":672,"line":778},[670,1687,1688],{"class":926},"  expect",[670,1690,929],{"class":946},[670,1692,1693],{"class":888},"errors",[670,1695,803],{"class":684},[670,1697,1441],{"class":888},[670,1699,803],{"class":684},[670,1701,622],{"class":888},[670,1703,1374],{"class":946},[670,1705,803],{"class":684},[670,1707,1708],{"class":926},"toBe",[670,1710,929],{"class":946},[670,1712,932],{"class":684},[670,1714,1715],{"class":680},"mylib.TOKEN_REQUIRED",[670,1717,932],{"class":684},[670,1719,1166],{"class":946},[670,1721,1722,1724,1726,1728,1730,1732,1734,1736,1738,1740,1742,1744,1746,1749,1751],{"class":672,"line":784},[670,1723,1688],{"class":926},[670,1725,929],{"class":946},[670,1727,1693],{"class":888},[670,1729,803],{"class":684},[670,1731,1471],{"class":888},[670,1733,803],{"class":684},[670,1735,622],{"class":888},[670,1737,1374],{"class":946},[670,1739,803],{"class":684},[670,1741,1708],{"class":926},[670,1743,929],{"class":946},[670,1745,932],{"class":684},[670,1747,1748],{"class":680},"mylib.RATE_LIMITED",[670,1750,932],{"class":684},[670,1752,1166],{"class":946},[670,1754,1755,1757],{"class":672,"line":798},[670,1756,1163],{"class":684},[670,1758,1166],{"class":888},[618,1760,1761,1763,1764,1766],{},[639,1762,475],{"href":476}," is the script and the staleness test; ",[639,1765,485],{"href":486}," covers the event side. From here a new failure mode is one catalog entry, one mapping line, and one regenerated reference, and the host, the support channel, and the agent all learn about it from the same four sentences.",[1768,1769,1770],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":666,"searchDepth":739,"depth":739,"links":1772},[1773,1774,1775,1776,1777],{"id":654,"depth":739,"text":655},{"id":712,"depth":739,"text":713},{"id":854,"depth":739,"text":855},{"id":1226,"depth":739,"text":1227},{"id":1627,"depth":739,"text":1628},"Convert a package with dozens of bare throws to an evlog catalog in five ordered steps, without a breaking release and without a big-bang rewrite.","md",null,{},{"title":480,"icon":483},{"title":480,"description":1778},"FNJjlwONiSGwNJOlhaXDzDRGKtpQng1pCyw18PuoyLw",[1786,1788],{"title":475,"path":476,"stem":477,"description":1787,"icon":478,"children":-1},"Generate your package's error reference from the catalog: a Markdown page for humans, a JSON file for tooling, and an llms.txt section for agents.",{"title":485,"path":486,"stem":487,"description":1789,"icon":488,"children":-1},"Test the events your package emits and the errors it throws: a collecting drain, the memory drain, and factory codes that fail on rename.",1789294039855]