Commit 4ce814ba by Ryan McKinley Committed by GitHub

Utils: avoid calling console.warn() too often for deprecation warnings (#18269)

parent 8c49d277
import { deprecationWarning } from './deprecationWarning';
test('It should not output deprecation warnings too often', () => {
let dateNowValue = 10000000;
const spyConsoleWarn = jest.spyOn(console, 'warn').mockImplementation();
const spyDateNow = jest.spyOn(global.Date, 'now').mockImplementation(() => dateNowValue);
// Make sure the mock works
expect(Date.now()).toEqual(dateNowValue);
expect(console.warn).toHaveBeenCalledTimes(0);
// Call the deprecation many times
deprecationWarning('file', 'oldName', 'newName');
deprecationWarning('file', 'oldName', 'newName');
deprecationWarning('file', 'oldName', 'newName');
deprecationWarning('file', 'oldName', 'newName');
deprecationWarning('file', 'oldName', 'newName');
expect(console.warn).toHaveBeenCalledTimes(1);
// Increment the time by 1min
dateNowValue += 60000;
deprecationWarning('file', 'oldName', 'newName');
deprecationWarning('file', 'oldName', 'newName');
expect(console.warn).toHaveBeenCalledTimes(2);
deprecationWarning('file2', 'oldName', 'newName');
deprecationWarning('file2', 'oldName', 'newName');
deprecationWarning('file2', 'oldName', 'newName');
expect(console.warn).toHaveBeenCalledTimes(3);
// or restoreMocks automatically?
spyConsoleWarn.mockRestore();
spyDateNow.mockRestore();
});
import { KeyValue } from '../types/index';
// Avoid writing the warning message more than once every 10s
const history: KeyValue<number> = {};
export const deprecationWarning = (file: string, oldName: string, newName?: string) => {
let message = `[Deprecation warning] ${file}: ${oldName} is deprecated`;
if (newName) {
message += `. Use ${newName} instead`;
}
console.warn(message);
const now = Date.now();
const last = history[message];
if (!last || now - last > 10000) {
console.warn(message);
history[message] = now;
}
};
......@@ -229,7 +229,7 @@ kbn.slugifyForUrl = str => {
.replace(/ +/g, '-');
};
/** deprecated since 6.1, use grafana/ui */
/** deprecated since 6.1, use grafana/data */
kbn.stringToJsRegex = str => {
deprecationWarning('kbn.ts', 'kbn.stringToJsRegex()', '@grafana/data');
return stringToJsRegex(str);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment