diff --git a/packages/core/src/decorators/deprecated.ts b/packages/core/src/decorators/deprecated.ts new file mode 100644 index 00000000..bbe0867e --- /dev/null +++ b/packages/core/src/decorators/deprecated.ts @@ -0,0 +1,29 @@ +import {deprecate} from '../utils'; + +/** + * Create a deprecated decorator that marks methods as deprecated. + */ +export function deprecated(remarks?: string): MethodDecorator { + return function ( + target: any, + propertyKey: string | symbol, + descriptor: PropertyDescriptor, + ) { + const name = target.constructor.name + ? `${target.constructor.name}.${propertyKey}` + : propertyKey; + const message = `${name}() has been deprecated.`; + + if (descriptor.value) { + descriptor.value = deprecate(descriptor.value, message, remarks); + } + if (descriptor.get) { + descriptor.get = deprecate(descriptor.get, message, remarks); + } + if (descriptor.set) { + descriptor.set = deprecate(descriptor.set, message, remarks); + } + + return descriptor; + }; +} diff --git a/packages/core/src/utils/useRef.ts b/packages/core/src/utils/createRef.ts similarity index 90% rename from packages/core/src/utils/useRef.ts rename to packages/core/src/utils/createRef.ts index e37ffdda..e88dad77 100644 --- a/packages/core/src/utils/useRef.ts +++ b/packages/core/src/utils/createRef.ts @@ -4,7 +4,7 @@ export type Reference = TValue extends (config: { ? TReference : {value: TValue}; -export function useRef(): Reference { +export function createRef(): Reference { return {} as Reference; } diff --git a/packages/core/src/utils/deprecate.ts b/packages/core/src/utils/deprecate.ts new file mode 100644 index 00000000..1f8ed5da --- /dev/null +++ b/packages/core/src/utils/deprecate.ts @@ -0,0 +1,19 @@ +import {useLogger} from './useProject'; + +/** + * Mark the given function as deprecated. + * + * @param fn - The function to deprecate. + * @param message - The log message. + * @param remarks - The optional log remarks. + */ +export function deprecate( + fn: (this: TThis, ...args: TArgs) => TReturn, + message: string, + remarks?: string, +): (this: TThis, ...args: TArgs) => TReturn { + return function (...args) { + useLogger().warn({message, remarks, stack: new Error().stack}); + return fn.apply(this, args); + }; +} diff --git a/packages/core/src/utils/index.ts b/packages/core/src/utils/index.ts index 08217d21..edc2b672 100644 --- a/packages/core/src/utils/index.ts +++ b/packages/core/src/utils/index.ts @@ -4,15 +4,55 @@ * @packageDocumentation */ +import {deprecate} from './deprecate'; + export * from './capitalize'; +export * from './deprecate'; export * from './DetailedError'; export * from './errorToLog'; export * from './getContext'; export * from './range'; export * from './useProject'; export * from './useRandom'; -export * from './useRef'; +export * from './createRef'; export * from './useScene'; export * from './useThread'; export * from './useTime'; export * from './useContext'; + +import {createRef} from './createRef'; +import { + createSignal as createSignalNew, + createComputed as createComputedNew, +} from '../signals'; + +/** + * @deprecated Use {@link createRef} instead. + */ +const useRef = deprecate( + createRef, + 'useRef() has been deprecated.', + `Use createRef() instead: +
import {createRef} from '@motion-canvas/core/lib/utils';
`, +); + +/** + * @deprecated Use {@link createSignal} instead. + */ +const createSignal = deprecate( + createSignalNew, + 'createSignal() has been moved.', + `Import createSignal() from here instead: +
import {createSignal} from '@motion-canvas/core/lib/signals';
`, +); + +/** + * @deprecated Use {@link createComputed} instead. + */ +const createComputed = deprecate( + createComputedNew, + 'createSignal() has been moved.', + `Import createComputed() from here instead: +
import {createComputed} from '@motion-canvas/core/lib/signals';
`, +); +export {useRef, createSignal, createComputed}; diff --git a/packages/examples/src/scenes/quickstart.tsx b/packages/examples/src/scenes/quickstart.tsx index b46c69ca..ecaaeb7e 100644 --- a/packages/examples/src/scenes/quickstart.tsx +++ b/packages/examples/src/scenes/quickstart.tsx @@ -1,10 +1,10 @@ import {makeScene2D} from '@motion-canvas/2d/lib/scenes'; import {Circle} from '@motion-canvas/2d/lib/components'; -import {useRef} from '@motion-canvas/core/lib/utils'; +import {createRef} from '@motion-canvas/core/lib/utils'; import {all} from '@motion-canvas/core/lib/flow'; export default makeScene2D(function* (view) { - const myCircle = useRef(); + const myCircle = createRef(); view.add( (); + const circle = createRef(); view.add( (); + const circle = createRef(); view.add( (); + const circle = createRef(); view.add( (); + const circle = createRef(); view.add( (); + const circle = createRef(); view.add( ,