src/utils/deprecate.tsx (53 lines of code) (raw):

import {useRef, useCallback} from 'react' declare let __DEV__: boolean type DeprecationType = {name: string; message: string; version: string} // eslint-disable-next-line @typescript-eslint/no-empty-function const noop = () => {} // eslint-disable-next-line import/no-mutable-exports let deprecate: ({name, message, version}: DeprecationType) => void | (() => void) = noop if (__DEV__) { deprecate = ({name, message, version}: DeprecationType) => { Deprecations.deprecate({name, message, version}) } } export {deprecate} // eslint-disable-next-line import/no-mutable-exports let useDeprecation = null if (__DEV__) { useDeprecation = ({name, message, version}: DeprecationType) => { const ref = useRef(false) const logDeprecation = useCallback(() => { if (!ref.current) { ref.current = true deprecate({name, message, version}) } }, [name, message, version]) return logDeprecation } } else { useDeprecation = () => { return noop } } export {useDeprecation} export class Deprecations { static instance: Deprecations | null = null deprecations: Array<DeprecationType> static get() { if (!Deprecations.instance) { Deprecations.instance = new Deprecations() } return Deprecations.instance } constructor() { this.deprecations = [] } static deprecate({name, message, version}: DeprecationType) { const msg = `WARNING! ${name} is deprecated and will be removed in version ${version}. ${message}` // eslint-disable-next-line no-console console.warn(msg) this.get().deprecations.push({name, message, version}) } static getDeprecations() { return this.get().deprecations } static clearDeprecations() { this.get().deprecations.length = 0 } }