Files
16gagent/scripts/lib/deprecation-warning.mjs
2026-06-06 10:40:48 +08:00

75 lines
1.9 KiB
JavaScript

/**
* PR-C Deprecation Warning Utility
* Provides `warnOnce(key, message)` — same key won't print twice.
* Used by deprecation checks across all modules.
*/
const _warned = new Set();
/**
* Emit a deprecation warning once per process lifetime.
* @param {string} key - unique key for this warning (e.g. "active-memory.blocking")
* @param {string} message - human-readable message
* @param {object} [opts]
* @param {boolean} [opts.force] - if true, emit even if already warned
* @returns {boolean} true if warning was emitted, false if skipped (duplicate)
*/
export function warnOnce(key, message, opts = {}) {
if (!opts.force && _warned.has(key)) {
return false;
}
_warned.add(key);
console.warn(`[DEPRECATED][OpenClaw v2] ${key}: ${message}`);
return true;
}
/**
* Reset all warned keys (for testing).
*/
export function resetWarnings() {
_warned.clear();
}
/**
* Get count of unique warnings emitted so far.
*/
export function getWarningCount() {
return _warned.size;
}
/**
* Get all warned keys.
*/
export function getWarnedKeys() {
return [..._warned];
}
/**
* Emit multiple deprecation warnings with deduplication.
* @param {Array<{key: string, message: string}>} warnings
*/
export function warnMany(warnings) {
const emitted = [];
for (const w of warnings) {
if (warnOnce(w.key, w.message)) {
emitted.push(w);
}
}
return emitted;
}
/**
* Run a deprecation check function and collect warnings.
* @param {string} checkName - name of the check
* @param {() => Array<{key:string, message:string}>} fn - check function
* @returns {{ name: string, warnings: Array<{key:string, message:string}> }}
*/
export function runDeprecationCheck(checkName, fn) {
try {
const warnings = fn();
return { name: checkName, warnings };
} catch (e) {
return { name: checkName, warnings: [{ key: checkName, message: `Check failed: ${e.message}` }] };
}
}