1import{_ as i,o as a,i as n,ak as h}from"./chunks/framework.CIfHljvi.js";const d=JSON.parse('{"title":"Migration Guide","description":"","frontmatter":{},"headers":[],"relativePath":"migration.md","filePath":"migration.md","lastUpdated":1758421350000}'),l={name:"migration.md"};function t(p,s,k,e,r,E){return a(),n("div",null,[...s[0]||(s[0]=[h(`<h1 id="migration-guide" tabindex="-1">Migration Guide <a class="header-anchor" href="#migration-guide" aria-label="Permalink to "Migration Guide"">â</a></h1><p>This guide helps you migrate from other configuration libraries to bunfig, providing step-by-step instructions and code examples for common migration scenarios.</p><h2 id="from-dotenv" tabindex="-1">From dotenv <a class="header-anchor" href="#from-dotenv" aria-label="Permalink to "From dotenv"">â</a></h2><p>If you're using dotenv (<code>.env</code> files), bunfig can automatically read environment variables and merge them with your configuration.</p><h3 id="before-dotenv" tabindex="-1">Before (dotenv) <a class="header-anchor" href="#before-dotenv" aria-label="Permalink to "Before (dotenv)"">â</a></h3><div class="language-js vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// .env file content</span></span> 2<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// PORT=3000</span></span> 3<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// HOST=localhost</span></span> 4<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// DATABASE_URL=postgresql://localhost:5432/myapp</span></span> 5<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// REDIS_URL=redis://localhost:6379</span></span> 6<span class="line"></span> 7<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// app.js</span></span> 8<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">require</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'dotenv'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span></span> 9<span class="line"></span> 10<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> config</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 11<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> port: process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">PORT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ||</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 3000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 12<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> host: process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">HOST</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ||</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'localhost'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 13<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> database: {</span></span> 14<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> url: process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">DATABASE_URL</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ||</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'postgresql://localhost:5432/default'</span></span> 15<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 16<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> redis: {</span></span> 17<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> url: process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">REDIS_URL</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ||</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'redis://localhost:6379'</span></span> 18<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 19<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><h3 id="after-bunfig" tabindex="-1">After (bunfig) <a class="header-anchor" href="#after-bunfig" aria-label="Permalink to "After (bunfig)"">â</a></h3><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span>
19<pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// app.config.ts</span></span> 20<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// app.ts</span></span> 21<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { config } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'bunfig'</span></span> 22<span class="line"></span> 23<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 24<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> port: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 25<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> host: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'localhost'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 26<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> database: {</span></span> 27<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> url: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'postgresql://localhost:5432/myapp'</span></span> 28<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 29<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> redis: {</span></span> 30<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> url: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'redis://localhost:6379'</span></span> 31<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 32<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span> 33<span class="line"></span> 34<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> appConfig</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span> 35<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'app'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 36<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Environment variables automatically override config values</span></span> 37<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // APP_PORT, APP_HOST, APP_DATABASE_URL, APP_REDIS_URL</span></span> 38<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">})</span></span></code></pre></div><p><strong>Migration Benefits:</strong></p><ul><li>â Automatic environment variable detection</li><li>â Type safety with TypeScript</li><li>â No manual <code>process.env</code> parsing</li><li>â Built-in validation and error handling</li><li>â Multiple configuration sources (files, env vars, package.json)</li></ul><h2 id="from-node-config" tabindex="-1">From node-config <a class="header-anchor" href="#from-node-config" aria-label="Permalink to "From node-config"">â</a></h2><p>The <code>config</code> npm package uses directory-based configuration files.</p><h3 id="before-node-config" tabindex="-1">Before (node-config) <a class="header-anchor" href="#before-node-config" aria-label="Permalink to "Before (node-config)"">â</a></h3><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span>
38<pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// config/default.json</span></span> 39<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span> 40<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "server"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span> 41<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "port"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 42<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "host"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"localhost"</span></span> 43<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 44<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "database"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span> 45<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "host"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"localhost"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 46<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "port"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">5432</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 47<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "name"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"myapp"</span></span> 48<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 49<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// config/production.json</span></span> 50<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span> 51<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "server"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span> 52<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "port"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">8080</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 53<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "host"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"0.0.0.0"</span></span> 54<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 55<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "database"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span> 56<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "host"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"prod-db.example.com"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 57<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "ssl"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span> 58<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 59<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><div class="language-js vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">js</span>
59<pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// app.js</span></span> 60<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> config</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> require</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'config'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span> 61<span class="line"></span> 62<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> server</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> config.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">
62get</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'server'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span> 63<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> database</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> config.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">get</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'database'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span></code></pre></div><h3 id="after-bunfig-1" tabindex="-1">After (bunfig) <a class="header-anchor" href="#after-bunfig-1" aria-label="Permalink to "After (bunfig)"">â</a></h3><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// app.ts</span></span> 64<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { config } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'bunfig'</span></span> 65<span class="line"></span> 66<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// config/base.config.ts</span></span> 67<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// config/production.config.ts</span></span> 68<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> base </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> './base.config'</span></span> 69<span class="line"></span> 70<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 71<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> server: {</span></span> 72<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> port: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 73<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> host: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'localhost'</span></span> 74<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 75<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> database: {</span></span> 76<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> host: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'localhost'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 77<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> port: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">5432</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 78<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'myapp'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 79<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">
79 ssl: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span> 80<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 81<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span> 82<span class="line"></span> 83<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 84<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">base,</span></span> 85<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> server: {</span></span> 86<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">base.server,</span></span> 87<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> port: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">8080</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 88<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> host: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'0.0.0.0'</span></span> 89<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 90<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> database: {</span></span> 91<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">base.database,</span></span> 92<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> host: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'prod-db.example.com'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 93<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ssl: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span> 94<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 95<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span> 96<span class="line"></span> 97<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> environment</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">NODE_ENV</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ||</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'base'</span></span> 98<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> appConfig</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span> 99<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> name: environment,</span></span> 100<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> cwd: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'./config'</span></span> 101<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">})</span></span></code></pre></div><p><strong>Migration Benefits:</strong></p><ul><li>â Better TypeScript support</li><li>â More flexible file formats (TS, JS, JSON)</li><li>â Built-in environment variable integration</li><li>â Validation and error handling</li><li>â Home directory configuration support</li></ul><h2 id="from-rc-files" tabindex="-1">From rc files <a class="header-anchor" href="#from-rc-files" aria-label="Permalink to "From rc files"">â</a></h2><p>RC configuration libraries use dotfiles with JSON configuration.</p><h3 id="before-rc" tabindex="-1">Before (rc) <a class="header-anchor" href="#before-rc" aria-label="Permalink to "Before (rc)"">â</a></h3><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span>
101<pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span> 102<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "port"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 103<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "host"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"localhost"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 104<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "database"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span> 105<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "url"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"postgresql://localhost:5432/myapp"</span></span> 106<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 107<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><div class="language-js vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// app.js</span></span> 108<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> rc</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> require</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'rc'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span> 109<span class="line"></span> 110<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Load config with defaults</span></span> 111<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> rcResult</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> rc</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'myapp'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, {</span></span> 112<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> port: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 113<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> host: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'localhost'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 114<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> database: {</span></span> 115<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> url: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'postgresql://localhost:5432/default'</span></span> 116<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 117<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">})</span></span></code></pre></div><h3 id="after-bunfig-2" tabindex="-1">After (bunfig) <a class="header-anchor" href="#after-bunfig-2" aria-label="Permalink to "After (bunfig)"">â</a></h3><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span>
117<pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// .myapp.config.ts</span></span> 118<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { config } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'bunfig'</span></span> 119<span class="line"></span> 120<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 121<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> port: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 122<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> host: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'localhost'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 123<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> database: {</span></span> 124<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> url: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'postgresql://localhost:5432/myapp'</span></span> 125<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 126<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span> 127<span class="line"></span> 128<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> appConfig</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span> 129<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'myapp'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 130<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> defaultConfig: {</span></span> 131<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> port: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 132<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> host: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'localhost'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 133<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> database: {</span></span> 134<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> url: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'postgresql://localhost:5432/default'</span></span> 135<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 136<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 137<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">})</span></span></code></pre></div><p><strong>Migration Benefits:</strong></p><ul><li>â TypeScript support for better development experience</li><li>â More file format options</li><li>â Better error handling and validation</li><li>â Environment variable integration</li><li>â Package.json integration</li></ul><h2 id="from-cosmiconfig" tabindex="-1">From Cosmiconfig <a class="header-anchor" href="#from-cosmiconfig" aria-label="Permalink to "From Cosmiconfig"">â</a></h2><p>Cosmiconfig searches for configuration files in various formats.</p><h3 id="before-cosmiconfig" tabindex="-1">Before (cosmiconfig) <a class="header-anchor" href="#before-cosmiconfig" aria-label="Permalink to "Before (cosmiconfig)"">â</a></h3><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span>
137<pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// package.json</span></span> 138<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span> 139<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "name"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"my-project"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 140<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "version"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"1.0.0"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 141<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "myapp"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span> 142<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "port"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 143<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "host"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"localhost"</span></span> 144<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 145<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// .myapprc.json</span></span> 146<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span> 147<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "port"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 148<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "host"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"localhost"</span></span> 149<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><div class="language-js vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// myapp.config.js</span></span> 150<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">exports</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 151<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> port: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 152<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> host: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'localhost'</span></span> 153<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><div class="language-js vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">js</span>
153<pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// app.js</span></span> 154<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">cosmiconfigSync</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> require</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'cosmiconfig'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span> 155<span class="line"></span> 156<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> explorer</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> cosmiconfigSync</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'myapp'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span> 157<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> result</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> explorer.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">search</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span></span> 158<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> config</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> result </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> result.config </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {}</span></span></code></pre></div><h3 id="after-bunfig-3" tabindex="-1">After (bunfig) <a class="header-anchor" href="#after-bunfig-3" aria-label="Permalink to "After (bunfig)"">â</a></h3><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Any of these work automatically:</span></span> 159<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// - myapp.config.ts</span></span> 160<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// - .myapp.config.ts</span></span> 161<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// - myapp.config.js</span></span> 162<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// - package.json (with "myapp" field)</span></span> 163<span class="line"></span> 164<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// myapp.config.ts</span></span> 165<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// app.ts</span></span> 166<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { config } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'bunfig'</span></span> 167<span class="line"></span> 168<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 169<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> port: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 170<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> host: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'localhost'</span></span> 171<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span> 172<span class="line"></span> 173<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> appConfig</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({ name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'myapp'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> })</span></span></code></pre></div><p><strong>Migration Benefits:</strong></p><ul><li>
173â Built-in support for all common file locations</li><li>â TypeScript and modern ES modules</li><li>â Environment variable integration</li><li>â Validation and error handling</li><li>â Better performance with caching</li></ul><h2 id="from-environment-variables-only" tabindex="-1">From Environment Variables Only <a class="header-anchor" href="#from-environment-variables-only" aria-label="Permalink to "From Environment Variables Only"">â</a></h2><p>If you're only using environment variables, bunfig makes it easier to organize and validate them.</p><h3 id="before-environment-variables" tabindex="-1">Before (environment variables) <a class="header-anchor" href="#before-environment-variables" aria-label="Permalink to "Before (environment variables)"">â</a></h3><div class="language-js vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// app.js</span></span> 174<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> config</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 175<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> server: {</span></span> 176<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> port: Number.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">parseInt</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">PORT</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">||</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 3000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 177<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> host: process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">HOST</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ||</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'localhost'</span></span> 178<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 179<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> database: {</span></span> 180<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> url: process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">DATABASE_URL</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ||</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'postgresql://localhost:5432/default'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 181<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> pool: Number.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">parseInt</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">DB_POOL</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">||</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 182<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ssl: process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">DB_SSL</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'true'</span></span> 183<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 184<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> redis: {</span></span> 185<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> url: process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">REDIS_URL</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ||</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'redis://localhost:6379'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 186<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> db: Number.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">parseInt</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">REDIS_DB</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">||</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span></span> 187<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 188<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> features: {</span></span> 189<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> enableCache: process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">ENABLE_CACHE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'true'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 190<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> enableMetrics: process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">ENABLE_METRICS</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'true'</span></span> 191<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 192<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span> 193<span class="line"></span> 194<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Manual validation</span></span> 195<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">!</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">config.database.url) {</span></span> 196<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> throw</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Error</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'DATABASE_URL is required'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span> 197<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span> 198<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (config.server.port </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"><</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ||</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> config.server.port </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 65535</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span> 199<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> throw</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Error</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'PORT must be between 1 and 65535'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span> 200<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><h3 id="after-bunfig-4" tabindex="-1">After (bunfig) <a class="header-anchor" href="#after-bunfig-4" aria-label="Permalink to "After (bunfig)"">â</a></h3><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span>
200<pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// app.config.ts</span></span> 201<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// app.ts</span></span> 202<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { config } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'bunfig'</span></span> 203<span class="line"></span> 204<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 205<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> server: {</span></span> 206<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> port: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 207<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> host: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'localhost'</span></span> 208<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 209<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> database: {</span></span> 210<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> url: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'postgresql://localhost:5432/default'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 211<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> pool: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 212<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ssl: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span> 213<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 214<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> redis: {</span></span> 215<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> url: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'redis://localhost:6379'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 216<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> db: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span></span> 217<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 218<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> features: {</span></span> 219<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> enableCache: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 220<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> enableMetrics: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span> 221<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 222<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span> 223<span class="line"></span> 224<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> appConfig</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">
224({</span></span> 225<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'app'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 226<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> schema: {</span></span> 227<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> type: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'object'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 228<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> properties: {</span></span> 229<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> server: {</span></span> 230<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> type: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'object'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 231<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> properties: {</span></span> 232<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> port: { type: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'number'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, minimum: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, maximum: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">65535</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 233<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> host: { type: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'string'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, minLength: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 234<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 235<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> required: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'port'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'host'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span> 236<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 237<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> database: {</span></span> 238<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> type: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'object'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 239<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> properties: {</span></span> 240<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> url: { type: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'string'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, pattern: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'^postgresql://'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 241<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> pool: { type: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'number'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, minimum: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, maximum: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">100</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 242<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 243<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> required: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'url'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span> 244<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 245<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 246<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> required: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'server'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'database'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span> 247<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 248<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">})</span></span> 249<span class="line"></span> 250<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Environment variables automatically override:</span></span> 251<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// APP_SERVER_PORT=8080</span></span> 252<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// APP_DATABASE_URL=postgresql://prod:5432/app</span></span> 253<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// APP_FEATURES_ENABLECACHE=true</span></span></code></pre></div><p><strong>Migration Benefits:</strong></p><ul><li>â Automatic type conversion (string â number, string â boolean)</li><li>â Built-in validation with JSON Schema</li><li>â Default values in configuration files</li><li>â Better error messages for invalid values</li><li>
253â No manual parsing or validation code</li></ul><h2 id="migration-checklist" tabindex="-1">Migration Checklist <a class="header-anchor" href="#migration-checklist" aria-label="Permalink to "Migration Checklist"">â</a></h2><h3 id="step-1-install-bunfig" tabindex="-1">Step 1: Install bunfig <a class="header-anchor" href="#step-1-install-bunfig" aria-label="Permalink to "Step 1: Install bunfig"">â</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Remove old dependencies</span></span> 254<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bun</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> remove</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dotenv</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> config</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> rc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> cosmiconfig</span></span> 255<span class="line"></span> 256<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Install bunfig</span></span> 257<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bun</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bunfig</span></span></code></pre></div><h3 id="step-2-create-configuration-files" tabindex="-1">Step 2: Create Configuration Files <a class="header-anchor" href="#step-2-create-configuration-files" aria-label="Permalink to "Step 2: Create Configuration Files"">â</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Create your first config file</span></span> 258<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">touch</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> app.config.ts</span></span> 259<span class="line"></span> 260<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Or organize by feature</span></span> 261<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">mkdir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> config</span></span> 262<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">touch</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> config/server.config.ts</span></span> 263<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">touch</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> config/database.config.ts</span></span></code></pre></div><h3 id="step-3-convert-configuration" tabindex="-1">Step 3: Convert Configuration <a class="header-anchor" href="#step-3-convert-configuration" aria-label="Permalink to "Step 3: Convert Configuration"">â</a></h3><ol><li><strong>Extract defaults</strong> from your code into configuration files</li><li><strong>Remove manual environment variable parsing</strong></li><li><strong>Add TypeScript interfaces</strong> for type safety</li><li><strong>Add validation schemas</strong> for critical settings</li></ol><h3 id="step-4-update-application-code" tabindex="-1">Step 4: Update Application Code <a class="header-anchor" href="#step-4-update-application-code" aria-label="Permalink to "Step 4: Update Application Code"">â</a></h3><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span>
263<pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Before</span></span> 264<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// After</span></span> 265<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { config } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'bunfig'</span></span> 266<span class="line"></span> 267<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> config</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> require</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'config'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span> 268<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> port</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">PORT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ||</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> config.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">
268get</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'server.port'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span> 269<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">server</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({ name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'app'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> })</span></span> 270<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> port</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> server.port </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Already includes env var overrides</span></span></code></pre></div><h3 id="step-5-update-environment-variables" tabindex="-1">Step 5: Update Environment Variables <a class="header-anchor" href="#step-5-update-environment-variables" aria-label="Permalink to "Step 5: Update Environment Variables"">â</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Before (dotenv style)</span></span> 271<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">PORT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">3000</span></span> 272<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">DATABASE_URL</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">postgresql://localhost:5432/app</span></span> 273<span class="line"></span> 274<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># After (bunfig style with prefixes)</span></span> 275<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">APP_SERVER_PORT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">3000</span></span> 276<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">APP_DATABASE_URL</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">postgresql://localhost:5432/app</span></span></code></pre></div><h3 id="step-6-add-validation-optional" tabindex="-1">Step 6: Add Validation (Optional) <a class="header-anchor" href="#step-6-add-validation-optional" aria-label="Permalink to "Step 6: Add Validation (Optional)"">â</a></h3><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> appConfig</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">
276({</span></span> 277<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'app'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 278<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> schema: {</span></span> 279<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> type: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'object'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 280<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> properties: {</span></span> 281<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> server: {</span></span> 282<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> type: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'object'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 283<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> properties: {</span></span> 284<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> port: { type: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'number'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, minimum: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, maximum: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">65535</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 285<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 286<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> required: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'port'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span> 287<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 288<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 289<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 290<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">})</span></span></code></pre></div><h3 id="step-7-test-migration" tabindex="-1">Step 7: Test Migration <a class="header-anchor" href="#step-7-test-migration" aria-label="Permalink to "Step 7: Test Migration"">â</a></h3><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Create a test to verify migration</span></span> 291<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { describe, expect, it } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'bun:test'</span></span> 292<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { config } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'bunfig'</span></span> 293<span class="line"></span> 294<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">describe</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Configuration Migration'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">
294, () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 295<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> it</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'should load configuration with defaults'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">async</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 296<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> cfg</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({ name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'app'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> })</span></span> 297<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> expect</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(cfg.server.port).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">toBe</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span> 298<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> expect</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(cfg.database.url).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">toBeDefined</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span></span> 299<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> })</span></span> 300<span class="line"></span> 301<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> it</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'should override with environment variables'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">async</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 302<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">APP_SERVER_PORT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> '8080'</span></span> 303<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> cfg</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({ name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'app'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> })</span></span> 304<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> expect</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(cfg.server.port).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">toBe</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">8080</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span> 305<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> delete</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">APP_SERVER_PORT</span></span> 306<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> })</span></span> 307<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">})</span></span></code></pre></div><h2 id="common-migration-issues" tabindex="-1">Common Migration Issues <a class="header-anchor" href="#common-migration-issues" aria-label="Permalink to "Common Migration Issues"">â</a></h2><h3 id="environment-variable-naming" tabindex="-1">Environment Variable Naming <a class="header-anchor" href="#environment-variable-naming" aria-label="Permalink to "Environment Variable Naming"">â</a></h3><p><strong>Issue:</strong> Environment variables not being picked up.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span>
307<pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// â Wrong: dotenv style variables</span></span> 308<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">PORT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> '3000'</span></span> 309<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">DATABASE_URL</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'postgresql://...'</span></span> 310<span class="line"></span> 311<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// â Correct: bunfig requires prefixed variables</span></span> 312<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">APP_SERVER_PORT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> '3000'</span></span> 313<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">APP_DATABASE_URL</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'postgresql://...'</span></span></code></pre></div><h3 id="nested-configuration" tabindex="-1">Nested Configuration <a class="header-anchor" href="#nested-configuration" aria-label="Permalink to "Nested Configuration"">â</a></h3><p><strong>Issue:</strong> Complex nested configurations not working.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// â Wrong: flat environment variables</span></span> 314<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">SERVER_DATABASE_POOL_SIZE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> '10'</span></span> 315<span class="line"></span> 316<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// â Correct: use underscores for nesting</span></span> 317<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">APP_DATABASE_POOL_SIZE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> '10'</span></span> 318<span class="line"></span> 319<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Which maps to:</span></span> 320<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// {</span></span> 321<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// database: {</span></span> 322<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// pool: {</span></span> 323<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// size: 10</span></span> 324<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// }</span></span> 325<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// }</span></span> 326<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// }</span></span></code></pre></div><h3 id="type-conversion" tabindex="-1">Type Conversion <a class="header-anchor" href="#type-conversion" aria-label="Permalink to "Type Conversion"">â</a></h3><p><strong>Issue:</strong> Environment variables staying as strings.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span>
326<pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// â Manual conversion needed before</span></span> 327<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> port</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Number.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">parseInt</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">PORT</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">||</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 3000</span></span> 328<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> enabled</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">ENABLE_FEATURE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'true'</span></span> 329<span class="line"></span> 330<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// â Automatic conversion with bunfig</span></span> 331<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Set defaults with correct types in config file:</span></span> 332<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 333<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> port: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// number type</span></span> 334<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> enabled: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // boolean type</span></span> 335<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span> 336<span class="line"></span> 337<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Environment variables automatically converted:</span></span> 338<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// APP_PORT=8080 â port: 8080 (number)</span></span> 339<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// APP_ENABLED=true â enabled: true (boolean)</span></span></code></pre></div><h3 id="file-locations" tabindex="-1">File Locations <a class="header-anchor" href="#file-locations" aria-label="Permalink to "File Locations"">â</a></h3><p><strong>Issue:</strong> Configuration files not found.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// â Wrong: files in wrong location or wrong name</span></span> 340<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// These files won't be detected by bunfig:</span></span> 341<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// config/default.json</span></span> 342<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// .env</span></span> 343<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// .myapprc</span></span> 344<span class="line"></span> 345<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// â Correct: bunfig file patterns</span></span> 346<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> correctPatterns</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [</span></span> 347<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'app.config.ts'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Primary</span></span> 348<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> '.app.config.ts'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Alternative</span></span> 349<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'config/app.config.ts'</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // In subdirectory</span></span> 350<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span></code></pre></div><h2 id="advanced-migration-patterns" tabindex="-1">Advanced Migration Patterns <a class="header-anchor" href="#advanced-migration-patterns" aria-label="Permalink to "Advanced Migration Patterns"">â</a></h2><h3 id="gradual-migration" tabindex="-1">Gradual Migration <a class="header-anchor" href="#gradual-migration" aria-label="Permalink to "Gradual Migration"">â</a></h3><p>Migrate piece by piece instead of all at once:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span>
350<pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Phase 1: Keep existing config, add bunfig for new features</span></span> 351<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> legacyConfig</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> require</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'config'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span> 352<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> newFeatures</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({ name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'features'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> })</span></span> 353<span class="line"></span> 354<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> combinedConfig</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 355<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">legacyConfig,</span></span> 356<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> features: newFeatures</span></span> 357<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span> 358<span class="line"></span> 359<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Phase 2: Migrate critical services</span></span> 360<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> database</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({ name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'database'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> })</span></span> 361<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> combinedConfig</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 362<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">legacyConfig,</span></span> 363<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> database,</span></span> 364<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> features: newFeatures</span></span> 365<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span> 366<span class="line"></span> 367<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Phase 3: Complete migration</span></span> 368<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> appConfig</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({ name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'app'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> })</span></span></code></pre></div><h3 id="configuration-validation-migration" tabindex="-1">Configuration Validation Migration <a class="header-anchor" href="#configuration-validation-migration" aria-label="Permalink to "Configuration Validation Migration"">â</a></h3><p>Add validation gradually:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span>
368<pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Phase 1: Basic loading without validation</span></span> 369<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> config</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> loadConfig</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({ name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'app'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> })</span></span> 370<span class="line"></span> 371<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Phase 2: Add basic validation</span></span> 372<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> config</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> loadConfig</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span> 373<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'app'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 374<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> schema: {</span></span> 375<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> type: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'object'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 376<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> required: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'server'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'database'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span> 377<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 378<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">})</span></span> 379<span class="line"></span> 380<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Phase 3: Comprehensive validation</span></span> 381<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> config</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> loadConfig</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span> 382<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'app'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 383<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> schema: detailedSchema,</span></span> 384<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> validate: customValidationFunction</span></span> 385<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">})</span></span></code></pre></div><h3 id="environment-strategy-migration" tabindex="-1">Environment Strategy Migration <a class="header-anchor" href="#environment-strategy-migration" aria-label="Permalink to "Environment Strategy Migration"">â</a></h3><p>Transition environment strategies:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span>
385<pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Before: Manual environment detection</span></span> 386<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> environment</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">NODE_ENV</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ||</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'development'</span></span> 387<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> configFile</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> \`config/\${</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">environment</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">}.json\`</span></span> 388<span class="line"></span> 389<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// During migration: Support both</span></span> 390<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> legacyConfig</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> require</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(configFile)</span></span> 391<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> bunfigConfig</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span> 392<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> name: environment,</span></span> 393<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> cwd: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'./config'</span></span> 394<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">})</span></span> 395<span class="line"></span> 396<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// After migration: Pure bunfig</span></span> 397<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> appConfig</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span> 398<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> name: process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">NODE_ENV</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ||</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'development'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 399<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> cwd: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'./config'</span></span> 400<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">})</span></span></code></pre></div><h2 id="migration-tools" tabindex="-1">Migration Tools <a class="header-anchor" href="#migration-tools" aria-label="Permalink to "Migration Tools"">â</a></h2><h3 id="automated-migration-script" tabindex="-1">Automated Migration Script <a class="header-anchor" href="#automated-migration-script" aria-label="Permalink to "Automated Migration Script"">â</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span>
400<pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">#!/bin/bash</span></span> 401<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># migrate-to-bunfig.sh</span></span> 402<span class="line"></span> 403<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">echo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "ð Migrating to bunfig..."</span></span> 404<span class="line"></span> 405<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Backup existing configuration</span></span> 406<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">mkdir</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> migration-backup</span></span> 407<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">cp</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -r</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> config</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> migration-backup/</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> 2></span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">/dev/null</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ||</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> true</span></span> 408<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">cp</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .env</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">*</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> migration-backup/</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> 2></span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">/dev/null</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ||</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> true</span></span> 409<span class="line"></span> 410<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Install bunfig</span></span> 411<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">echo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "ð¦ Installing bunfig..."</span></span> 412<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bun</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bunfig</span></span> 413<span class="line"></span> 414<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Convert .env to config file</span></span> 415<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [ </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-f</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> .env ]; </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">then</span></span> 416<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> echo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "ð§ Converting .env to app.config.ts..."</span></span> 417<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">
417 node</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> migration-scripts/convert-env.js</span></span> 418<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">fi</span></span> 419<span class="line"></span> 420<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Convert rc files</span></span> 421<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> file </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">in</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .*rc</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">; </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">do</span></span> 422<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [ </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">$file</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ]; </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">then</span></span> 423<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> echo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "ð§ Converting </span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">$file</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">..."</span></span> 424<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> node</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> migration-scripts/convert-rc.js</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">$file</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"</span></span> 425<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> fi</span></span> 426<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">done</span></span> 427<span class="line"></span> 428<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">echo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "â Migration complete! Check your new configuration files."</span></span> 429<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">echo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "𧪠Run tests to verify the migration."</span></span></code></pre></div><h3 id="environment-variable-converter" tabindex="-1">Environment Variable Converter <a class="header-anchor" href="#environment-variable-converter" aria-label="Permalink to "Environment Variable Converter"">â</a></h3><div class="language-js vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark vp-code" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// migration-scripts/convert-env.js</span></span> 430<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> fs</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> require</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'node:fs'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span> 431<span class="line"></span> 432<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Read .env file</span></span> 433<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> envContent</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> fs.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">readFileSync</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'.env'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'utf8'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span> 434<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> envVars</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> envContent</span></span> 435<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">split</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">\\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span> 436<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">filter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">line</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> line.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">trim</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&&</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> !</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">line.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">startsWith</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'#'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">))</span></span> 437<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">map</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">((</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">line</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 438<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">key</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">value</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> line.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">split</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'='</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span> 439<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { key: key.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">trim</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(), value: value.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">trim</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">() }</span></span> 440<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> })</span></span> 441<span class="line"></span> 442<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Convert to config structure</span></span> 443<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> config</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {}</span></span> 444<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">envVars.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">forEach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(({ </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">key</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">value</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 445<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Convert PORT=3000 to { port: 3000 }</span></span> 446<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> configKey</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> key.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">toLowerCase</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span></span> 447<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> configValue</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Number.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">isNaN</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(value) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> value </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Number.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">parseInt</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(value)</span></span> 448<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> config[configKey] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> configValue</span></span> 449<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">})</span></span> 450<span class="line"></span> 451<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Generate TypeScript config file</span></span> 452<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> configContent</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> \`export default \${</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">JSON</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">stringify</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">config</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">null</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">2</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">}\`</span></span> 453<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">fs.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">writeFileSync</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'app.config.ts'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, configContent)</span></span> 454<span class="line"></span> 455<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'â Converted .env to app.config.ts'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span></code></pre></div><h2 id="getting-help" tabindex="-1">Getting Help <a class="header-anchor" href="#getting-help" aria-label="Permalink to "Getting Help"">â</a></h2><ul><li><strong><a href="./quick-start">Quick Start Guide</a></strong> - Get started with bunfig</li><li><strong><a href="./features/configuration-loading">Configuration Loading</a></strong> - Understand how bunfig loads configuration</li><li><strong><a href="./features/environment-variables">Environment Variables</a></strong> - Learn about environment variable integration</li><li><strong><a href="https://github.com/stacksjs/bunfig/issues" target="_blank" rel="noreferrer">GitHub Issues</a></strong> - Report migration issues or get help</li></ul><h2 id="community-examples" tabindex="-1">Community Examples <a class="header-anchor" href="#community-examples" aria-label="Permalink to "Community Examples"">â</a></h2><p>Check out these real-world migration examples from the community:</p><ul><li><a href="https://github.com/stacksjs/bunfig/tree/main/examples/express-migration" target="_blank" rel="noreferrer">Express.js app migration</a></li><li><a href="https://github.com/stacksjs/bunfig/tree/main/examples/nextjs-m
455igration" target="_blank" rel="noreferrer">Next.js app migration</a></li><li><a href="https://github.com/stacksjs/bunfig/tree/main/examples/microservices-migration" target="_blank" rel="noreferrer">Microservices migration</a></li></ul><p>Have a migration story to share? <a href="https://github.com/stacksjs/bunfig/blob/main/CONTRIBUTING.md" target="_blank" rel="noreferrer">Contribute your example</a> to help others!</p>`,97)])])}const o=i(l,[["render",t]]);export{d as __pageData,o as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.