NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #2213 most downloaded on npm
Smart Config Loader
Last release 12 days ago
22 Sep 2026
Release timing varies
gaps range from 1 weeks to 4 months
Most releases are documented
notes for 36 of 56 stable releases
1 version withdrawn
withdrawn after publishing
5 years old
67 releases · first in 2022
One column per quarter.
dotenv: Support ${VAR:-default} fallback syntax
${VAR:-default} fallback syntax (#337)parse option (c299035)envName (7cd4a6d)node:fs watcher instead of chokidar (#342)schema option for standard schema validation (#343)$VAR reference at a : (#339)node:fs watcher instead of chokidar (#342)Read global rc from xdg config dir
pkg-types only when it is needed (#330)--ignore-workspace (#318)install option (72709ac).json configs with JSON.parse (6a4dfc6).jsonc configs (ef6eb78) createDefineConfig and $meta (#327)pkg-types only when it is needed (#330)--ignore-workspace (#318)install option (72709ac).json configs with JSON.parse (6a4dfc6).jsonc configs (ef6eb78)Add genapi to the 'Used Projects' list
jitiOptions (e968ad7)jitiOptions (c918506)Bust ESM module cache for native js config imports
Disable expandFileReferences by default
expandFileReferences by default (#303)c12 install size is now down to 380kB from 3.44MB ( 20 deps to 7 deps ).
c12 install size is now down to 380kB from 3.44MB (20 deps to 7 deps).
Loading TypeScript files is significantly faster (on cold cache) — simple TS config loads ~2.5x faster (bench).
extends feature with remote/git source, install giget as a peer dependency (docs)watchConfig, install chokidar as a peer dependency (docs).jiti as a peer dependency (c12 automatically falls back) or provide a custom import config (docs).dotenv as a peer dependency only for legacy/Deno support.chokidar optional peer dependency (8b7c6a2)_FILE references (#297)See https://github.com/unjs/c12/releases/tag/v4.0.0-beta.2
compare changes 🏡 Chore Update deps ( fe676ce ) Bump giget to v3 ( 3cecdd3 ) 📦 Build Simplify exports field
compare changes 📦 Build Update chokidar to 5.x
Relax magicast peer dependency range
globalRc option (#281)Extend with explicit extensions only
Support loading config with array exports
cwd is optional (#273)dotenv section with multiple files example (#270)Support context for function configs
context for function configs (#258)configFileRequired (#241)context for function config (#258)configFileRequired (#241)Pass raw configs to function sources
compare changes ### 🩹 Fixes - Handle watcher reload errors
Check if .env/ is a directory before accessing
.env/ is a directory before accessing (#238)src for coverage report (#242)compare changes ### 🏡 Chore - Update exsolve to 1.0.0
Fix windows related resolve issues
Migrate from mlly to exsolve for module resolution (822af14, 146899e)
mlly to exsolve for module resolution (822af14)compare changes ### 📦 Build - Fix typo in exports
compare changes ### 💅 Refactors - Upgrade to ohash v2 (#230) ### 📦 Build - Update exports
exports (acee667)compare changes ### 🩹 Fixes - Preserve meta for main config (#227) ### 📖 Documentation - Add kysely-ctl to readme (#225) ### 🏡 Chore - Update pathe to
meta for main config (#227)compare changes - Update to jiti 2.3
Allow disabling remote extend using giget: false
fca09ee
jiti v2 now natively supports ESM import and resolution with new API await jiti.import(id) and jiti.esmResolve(id) . This allows top-level await and native+faster importing of ES-only modules with increased compatibility
You can now directly import .jsx / .tsx files with jiti! See examples with nano-js , preact , React and Vue . This feature is opt-in for now (using jsx: true or JITI_JSX=true ). Jiti is considering a smarter lib detection for wider support before enabling JSX support by default.
jiti package exports are now in a dual (ESM/CJS) format for better importing of jiti in ESM contexts.
As native ESM and Typescript support is being increased across runtimes, a new export in jiti allows easing up the transition by giving the same API of jiti but instead only depending on runtime import.meta.resolve and dynamic import() support. This is possible by making an alias for jiti to jiti/native .
You can globally register jiti using Node.js global hooks (experimental).
CLI:
npx jiti index.ts node --import jiti/register index.tsProgrammatic:
import "jiti/register" ; // or await import ( "jiti/register" ) ;
You can inspect what jiti internals using debug option or JITI_DEBUG=1 environment variable. The output is now more readable and with colors to easily find slow imports.
jiti will also use node_modules/.cache/jiti directory instead of temp dir (if node_modules exists) to store caches for easier local inspections.
Upgrade jiti dependency to ^2.0.0 in package.json
Use new createJiti named export :
ESM:
--- import createJiti from "jiti" +++ import { createJiti } from "jiti" const jiti = createJiti(import.meta.url)
CommonJS:
--- const createJiti = require("jiti") +++ const { createJiti } = require("jiti") const jiti = createJiti(__filename)
Migrate from CommonJS to ESM API: ( highly recommended! )
Importing modules:
--- const mood = jiti('mod') +++ const mood = await jiti.import('mod')
Resolving modules:
--- const path = jiti.resolve('mod') +++ const path = jiti.esmResolve('mod')
This release wasn't possible without valuable ecosystem feedback and contributors . With the trust of users with astonishing 60M+ monthly downloads , i hope jiti v2 can help speed up the ecosystem transition to ESM and Typescript.
compare changes
top-level await support ( #239 )
Native ESM support ( #259 )
Add experimental ESM loader support ( #266 )
Allow try and other resolve options for jiti.esmResolve ( #268 )
Allow configure interopDefault using JITI_INTEROP_DEFAULT env ( 1c080a1 )
jiti/native subpath ( #289 ) ( #294 ) ( #293 )
Handle data: imports ( #299 )
Support opt-in JSX ( #200 )
Eval ESM modules with fallback loader ( #300 )
Support import.meta.resolve ( #301 )
Overhaul package exports ( #262 )
Fix type resolution issue ( #269 )
Reduce overhead of jiti sub-instances ( #265 )
Use native createRequire ( 69da3c5 )
Use distinct cache paths for async mode ( 6e8ec7a )
Resolve with ESM conditions in async context ( #264 )
cache: Prefer node_modules/.cache if exists ( 832f206 )
Use native ESM import for built-ins ( 54d6b4a )
Respect interopDefault in babel transform ( 485b4e9 )
Split cache based on interopDefault ( f820a15 )
Remove extention from cache path ( 50b1b3a )
Properly resolve .mts / .cts with .mjs / .cjs imports ( a5aefad )
resolve: Make sure parentURL is a dir ( d224e84 )
Handle global URL instance mismatch ( #298 )
Optional access to Reflect.metadata for typescript decorators ( #165 )
Only pass paths option to native require.resolve ( 50e4280 )
Split option normalization ( #172 )
Split logic ( #240 )
Remove legacy Node.js syntax polyfills ( #260 )
3rd arg to createJiti is optional ( 60a23e3 )
Upgrade cache version to 8 ( 99224ae )
Use more clear fsCache and moduleCache options ( #263 )
Use ESM imports for babel plugins ( 22e259f )
Improve debug logging ( 463a8a3 )
Rename importResolve to esmResolve ( aac88e6 )
Improve env handling ( ee4489d )
Use import / require in debug logs ( 934a5bb )
Improve internal babel types ( #271 )
Rename experimentalBun option to tryNative ( #295 )
Make jiti.esmResolve consistent with import.meta.resolve ( #303 )
Update bundlephobia link ( #179 )
Add example for inline JITI_ALIAS ( a53715a )
compare changes - Update to jiti 2.0.0 (c2cc1e9) - Update chokidar to v4 (77aa9a2) - Update deps
Allow disabling remote extend with giget: false
giget: false (#181).config/[name].[ext] config (#169)compare changes ### 🚀 Enhancements - Upgrade to jiti v2 beta (#172) ### 🏡 Chore - Aadd hey-api to list of users (#171) - Update release script for bet
updateConfig: Properly resolve config relative to cwd
update: Respect falsy value of onCreate
Custom merger to replace built-in defu
config is not nullable (#161)Support auth shortcut for layer config
auth shortcut for layer config (#142)Use confbox (adds .toml, .yaml, .yml new extensions!)
Use default export of json5 for parsing
.config dir (#136)json5 for parsing (#135)compare changes ### 🚀 Enhancements - .jsonc config support (#132) - .json5 config support (#133) ### ❤️ Contributors - Pooya Parsa (@pi0)
Preserve cloned dir if install option provided
Option to omit $ prefixed keys from resolved config
$ prefixed keys from resolved config (#100)install for source options (#126)configFile and source (#48)node_modules/.c12 (#125)http:// prefixes with giget (6c09735)configFile and source (#48)node_modules/.c12 (#125)http:// prefixes with giget as well (6c09735)This release improves extending config from remote (git) sources by improving unjs/giget integration. This improves experience for frameworks that rel
This release improves extending config from remote (git) sources by improving unjs/giget integration. This improves experience for frameworks that rely on extends feature for multi layer applications (such as Nuxt Layers).
Now when you clone a config layer from a git remote source, it will be cloned into <your_project_dir>/node_modules/.giget/{name} this way any dependencies from the main project will be also available for extending the config layer.
Also, you can provide additional cloning options for each config layer. This allows setting custom registry, auth token, and to enable dependency auto install for GitHub remote layers (tracker https://github.com/unjs/c12/issues/51):
export default defineConfig({
extends: [
["gh:user/repo", { giget: { auth: process.env.GITHUB_AUTH } }],
]
})
You can refer to the remote config docs for more examples.
We will be improving this feature with improved types and easier-to-use top-level shortcuts. Stay tuned!
Nothing published for this version
Allow extends dir to start with dot
configFile (#83)configFile (#83)watchConfig: Handle custom config names
watchConfig utility with HMR support (#77, #78)
Use rm instead of rmdir for recursive remove
rm instead of rmdir for recursive remove (#69)rm instead of rmdir for recursive remove (#69)Environment specific configuration
package.json (#52)envName config (4a0227d)compare changes ### 🏡 Chore - Update dependencies (efac912) ### ❤️ Contributors - Pooya Parsa
compare changes ### 🏡 Chore - Update mlly (b085c9b) ### 🎨 Styles - Format with prettier (f66ddd6) ### ❤️ Contributors - Pooya Parsa
### Features - use giget to clone github urls (4c7590a) ### Bug Fixes - remove tmp dir to clone (020e0b0) ### 1.0.1 (2022-11-15)
Nothing published for this version
defaultConfig to be applied before extending
defaultConfig to be applied before extending (1c4e898)jiti and jitiOptions (bfd1be5)MODULE_NOT_FOUND when message contains configFile (e067a56)Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →