| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| README.md | 2026-04-04 | 3.9 kB | |
| v4.0.0 source code.tar.gz | 2026-04-04 | 89.0 kB | |
| v4.0.0 source code.zip | 2026-04-04 | 101.8 kB | |
| Totals: 3 Items | 194.6 kB | 0 | |
π v4.0.0
A major release that modernizes the entire stack and ships features the community has been asking for β while making the cache API significantly cleaner.
π₯ Breaking Changes
Node.js >= 18 and axios >= 1.0.0 required
v4 drops support for legacy runtimes. Upgrade Node and axios before updating.
Cache options consolidated: enabledByDefault & cacheFlag removed
The old multi-knob cache config (enabledByDefault, cacheFlag) is replaced by a single cacheable predicate:
:::ts
cacheAdapterEnhancer(adapter, {
cacheable: (config) => config.method === 'get',
});
Quick migration recipes:
:::ts
// v3: opt-in caching
cacheAdapterEnhancer(adapter, { enabledByDefault: false });
// v4:
cacheAdapterEnhancer(adapter, {
cacheable: (config) => (config.cache ?? false) && config.method === 'get',
});
// v3: custom cacheFlag
cacheAdapterEnhancer(adapter, { enabledByDefault: false, cacheFlag: 'useCache' });
// v4:
cacheAdapterEnhancer(adapter, {
cacheable: (config) => config.method === 'get' ? (config.useCache ?? false) : false,
});
π See the full Migration Guide (v3 β v4) for all scenarios.
Cache export is now built on tiny-lru instead of lru-cache
If you relied on lru-cache-specific APIs, switch to the cache-like contract: get(key), set(key, value), delete(key).
β¨ New Features
π Custom cache key generation (#116)
Pass a keyGenerator to control how cache keys are built β useful for method-aware or body-sensitive caching strategies.
:::ts
// Cache POST requests with body-aware keys
cacheAdapterEnhancer(adapter, {
cacheable: (config) => config.method === 'get' || config.method === 'post',
keyGenerator: (config) => `${config.method}:${config.url}:${JSON.stringify(config.data)}`,
});
π·οΈ Cache hit indicator (#119)
Cached responses now carry __fromCache: true, so your app can easily tell whether data came from cache or a fresh request.
:::ts
const response = await http.get('/users');
if (response.__fromCache) {
console.log('Served from cache');
}
π― Cacheable predicate (#118)
The new cacheable option gives you full control over which requests should be cached β replacing the old enabledByDefault + cacheFlag combo.
:::ts
// Only cache GET requests to specific API paths
cacheAdapterEnhancer(adapter, {
cacheable: (config) => config.method === 'get' && config.url?.startsWith('/api/'),
});
// Per-request cache instance
import Cache from 'axios-extensions/Cache';
const userCache = new Cache({ ttl: 60000, max: 50 });
cacheAdapterEnhancer(adapter, {
cacheable: (config) => {
if (config.url?.startsWith('/api/users')) return userCache;
return config.method === 'get';
},
});
β±οΈ Per-request throttle threshold override (#120)
throttleAdapterEnhancer now accepts a threshold on individual requests, overriding the global default.
:::ts
const http = axios.create({
adapter: throttleAdapterEnhancer(axios.defaults.adapter, { threshold: 1000 }),
});
// This specific request gets a longer throttle window
http.get('/slow-endpoint', { threshold: 5000 });
// This one uses the default 1000ms
http.get('/fast-endpoint');
π Bug Fixes
- Fix
process undefinedcrash in non-browser environments (#115) - Fix axios 1.x adapter config compatibility (#114)
π§ Internal
- Build & test stack migrated to Vite + Vitest (#111, [#117])
- Source files included in build output for proper source map support (#105)
- Release pipeline migrated to semantic-release (#122)
Full Changelog: https://github.com/kuitos/axios-extensions/compare/v3.1.7...v4.0.0