1 2/** 3 * Module exports. 4 */ 5 6module.exports = deprecate; 7 8/** 9 * Mark that a method should not be used. 10 * Returns a modified function which warns once by default. 11 * 12 * If `localStorage.noDeprecation = true` is set, then it is a no-op. 13 * 14 * If `localStorage.throwDeprecation = true` is set, then deprecated functions 15 * will throw an Error when invoked. 16 * 17 * If `localStorage.traceDeprecation = true` is set, then deprecated functions 18 * will invoke `console.trace()` instead of `console.error()`. 19 * 20 * @param {Function} fn - the function to deprecate 21 * @param {String} msg - the string to print to the console when `fn` is invoked 22 * @returns {Function} a new "deprecated" version of `fn` 23 * @api public 24 */ 25 26function deprecate (fn, msg) { 27 if (config('noDeprecation')) { 28 return fn; 29 } 30 31 var warned = false; 32 function deprecated() { 33 if (!warned) { 34 if (config('throwDeprecation')) { 35 throw new Error(msg); 36 } else if (config('traceDeprecation')) { 37 console.trace(msg); 38 } else { 39 console.warn(msg); 40 } 41 warned = true; 42 } 43 return fn.apply(this, arguments); 44 } 45 46 return deprecated; 47} 48 49/** 50 * Checks `localStorage` for boolean values for the given `name`. 51 * 52 * @param {String} name 53 * @returns {Boolean} 54 * @api private 55 */ 56 57function config (name) { 58 // accessing global.localStorage can trigger a DOMException in sandboxed iframes 59 try { 60 if (!global.localStorage) return false; 61 } catch (_) { 62 return false; 63 } 64 var val = global.localStorage[name]; 65 if (null == val) return false; 66 return String(val).toLowerCase() === 'true'; 67} 68