diff --git a/packages/grafana-ui/src/utils/deprecationWarning.test.ts b/packages/grafana-ui/src/utils/deprecationWarning.test.ts new file mode 100644 index 00000000000..6da4f0da3ec --- /dev/null +++ b/packages/grafana-ui/src/utils/deprecationWarning.test.ts @@ -0,0 +1,34 @@ +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(); +}); diff --git a/packages/grafana-ui/src/utils/deprecationWarning.ts b/packages/grafana-ui/src/utils/deprecationWarning.ts index 8bd15bb5b9e..ef0ff225d5c 100644 --- a/packages/grafana-ui/src/utils/deprecationWarning.ts +++ b/packages/grafana-ui/src/utils/deprecationWarning.ts @@ -1,7 +1,17 @@ +import { KeyValue } from '../types/index'; + +// Avoid writing the warning message more than once every 10s +const history: KeyValue = {}; + 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; + } }; diff --git a/public/app/core/utils/kbn.ts b/public/app/core/utils/kbn.ts index b97b87d9b38..02807d21720 100644 --- a/public/app/core/utils/kbn.ts +++ b/public/app/core/utils/kbn.ts @@ -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);