yummies 6.3.2 → 6.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/mobx.cjs CHANGED
@@ -32,12 +32,20 @@ const createRef = (cfg) => {
32
32
  return;
33
33
  }
34
34
  mobx.runInAction(() => {
35
+ const prevLastValue = lastValue;
35
36
  lastValue = ref.current ?? void 0;
36
37
  ref.current = nextValue;
38
+ let isNextValueIgnored = false;
37
39
  ref.listeners.forEach((listener) => {
38
- listener(ref.current, lastValue);
40
+ const listenerResult = listener(ref.current, lastValue);
41
+ if (listenerResult === false) {
42
+ isNextValueIgnored = true;
43
+ }
39
44
  });
40
- if (ref.current === null && lastValue !== void 0) {
45
+ if (isNextValueIgnored) {
46
+ lastValue = prevLastValue;
47
+ ref.current = lastValue ?? null;
48
+ } else if (ref.current === null && lastValue !== void 0) {
41
49
  lastValue = void 0;
42
50
  }
43
51
  });
package/mobx.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mobx.cjs","sources":["../src/mobx/apply-observable.ts","../src/mobx/create-enhanced-atom.ts","../src/mobx/create-ref.ts","../src/mobx/deep-observable-struct.ts","../src/mobx/get-mobx-administration.ts","../src/mobx/lazy-observe.ts"],"sourcesContent":["import { makeObservable } from 'mobx';\nimport type { AnyObject } from 'yummies/types';\n\nexport type ObservableAnnotationsArray = [string, any][];\n\nexport const applyObservable = (\n context: AnyObject,\n annotationsArray: ObservableAnnotationsArray,\n useDecorators?: boolean,\n) => {\n if (useDecorators) {\n annotationsArray.forEach(([field, annotation]) => {\n annotation(context, field);\n });\n\n makeObservable(context);\n } else {\n makeObservable(context, Object.fromEntries(annotationsArray));\n }\n};\n","import { createAtom, type IAtom } from 'mobx';\nimport type { AnyObject } from 'yummies/types';\n\nexport interface IEnhancedAtom<TMeta extends AnyObject = AnyObject>\n extends IAtom {\n meta: TMeta;\n}\n\n/**\n * Creates an enhanced atom with meta data\n * And bind `reportChanged` and `reportObserved` method to the atom\n */\nexport const createEnhancedAtom = <TMeta extends AnyObject>(\n name: string,\n onBecomeObservedHandler?: (atom: IEnhancedAtom<TMeta>) => void,\n onBecomeUnobservedHandler?: (atom: IEnhancedAtom<TMeta>) => void,\n meta?: TMeta,\n): IEnhancedAtom<TMeta> => {\n const atom = createAtom(\n name,\n onBecomeObservedHandler && (() => onBecomeObservedHandler(atom)),\n onBecomeUnobservedHandler && (() => onBecomeUnobservedHandler(atom)),\n ) as IEnhancedAtom<TMeta>;\n atom.meta = meta ?? ({} as TMeta);\n atom.reportChanged = atom.reportChanged.bind(atom);\n atom.reportObserved = atom.reportObserved.bind(atom);\n return atom;\n};\n","import {\n type IEqualsComparer,\n makeObservable,\n comparer as mobxComparer,\n observable,\n runInAction,\n} from 'mobx';\nimport type { AnyObject, Maybe } from 'yummies/types';\n\nexport type RefChangeListener<T> = (\n value: T | null,\n prevValue: T | undefined,\n) => void;\n\n/**\n * Alternative to React.createRef but works in MobX world.\n * Typically it the should be the same React.LegacyRef (fn style)\n */\nexport interface Ref<T = any, TMeta = AnyObject> {\n /**\n * Setter function\n */\n (value: Maybe<T>): void;\n\n listeners: Set<RefChangeListener<NoInfer<T>>>;\n current: NoInfer<T> | null;\n meta: TMeta;\n}\n\nexport interface CreateRefConfig<T = any, TMeta = AnyObject> {\n onSet?: (node: T, prevValue: T | undefined) => void;\n onUnset?: (lastValue: T | undefined) => void;\n onChange?: RefChangeListener<T>;\n meta?: TMeta;\n initial?: Maybe<T>;\n comparer?: IEqualsComparer<T | null>;\n}\n\n/**\n * Creates ref thing to attach HTMLElements in React and all other\n */\nexport const createRef = <T = any, TMeta = AnyObject>(\n cfg?: CreateRefConfig<T, TMeta>,\n): Ref<T, TMeta> => {\n let lastValue: T | undefined;\n const comparer = cfg?.comparer ?? mobxComparer.default;\n\n const ref = ((value: Maybe<T>) => {\n const nextValue = value ?? null;\n\n if (comparer(ref.current, nextValue)) {\n return;\n }\n\n runInAction(() => {\n lastValue = ref.current ?? undefined;\n ref.current = nextValue;\n\n ref.listeners.forEach((listener) => {\n listener(ref.current, lastValue);\n });\n\n if (ref.current === null && lastValue !== undefined) {\n lastValue = undefined;\n }\n });\n }) as Ref<T, TMeta>;\n\n ref.listeners = new Set(cfg?.onChange ? [cfg.onChange] : []);\n\n if (cfg?.onSet || cfg?.onUnset) {\n ref.listeners.add((value, prevValue) => {\n if (value) {\n cfg.onSet?.(value, prevValue);\n } else {\n cfg.onUnset?.(prevValue);\n }\n });\n }\n\n ref.current = cfg?.initial ?? null;\n ref.meta = cfg?.meta ?? ({} as TMeta);\n\n makeObservable(ref, {\n current: observable.ref,\n meta: observable,\n });\n\n return ref;\n};\n\nexport const isRef = <T, TMeta = any>(\n value: T | Ref<T, TMeta>,\n): value is Ref<T, TMeta> => {\n return typeof value === 'function' && 'current' in value;\n};\n\nexport const toRef = <T, TMeta = any>(\n value: T | Ref<T, TMeta>,\n cfg?: Omit<CreateRefConfig<T, TMeta>, 'initial'>,\n): Ref<T, TMeta> => {\n return isRef(value) ? value : createRef({ initial: value, ...cfg });\n};\n","import { action, makeObservable, observable } from 'mobx';\nimport { typeGuard } from 'yummies/type-guard';\nimport type { AnyObject } from 'yummies/types';\n\nexport class DeepObservableStruct<TData extends AnyObject> {\n data: TData;\n\n constructor(data: TData) {\n this.data = data;\n\n makeObservable(this, {\n data: observable.deep,\n set: action,\n });\n }\n\n set(newData: Partial<TData>) {\n type StackItem = [key: string, currObservable: AnyObject, new: AnyObject];\n\n const stack: StackItem[] = Object.keys(this.data).map((key) => [\n key,\n this.data,\n newData,\n ]);\n\n let currentIndex = 0;\n let stackLength = stack.length;\n\n while (currentIndex < stackLength) {\n const [key, currObservableData, newData] = stack[currentIndex];\n const newValue = newData[key];\n const currValue = currObservableData[key];\n\n currentIndex++;\n\n if (key in newData) {\n if (typeGuard.isObject(newValue) && typeGuard.isObject(currValue)) {\n const newValueKeys = Object.keys(newValue);\n\n Object.keys(currValue).forEach((childKey) => {\n if (!(childKey in newValue)) {\n delete currObservableData[key][childKey];\n }\n });\n\n newValueKeys.forEach((childKey) => {\n const length = stack.push([\n childKey,\n currObservableData[key],\n newValue,\n ]);\n stackLength = length;\n });\n } else if (newValue !== currValue) {\n currObservableData[key] = newValue;\n }\n } else {\n delete currObservableData[key];\n }\n }\n\n Object.keys(newData).forEach((newDataKey) => {\n if (!this.data[newDataKey]) {\n // @ts-expect-error\n this.data[newDataKey] = newData[newDataKey];\n }\n });\n }\n}\n","import { $mobx, type AnnotationMapEntry } from 'mobx';\nimport type { AnyObject } from 'yummies/types';\n\ntype ObservableObjectAdministration = Parameters<\n Exclude<AnnotationMapEntry, boolean>['make_']\n>[0];\n\nexport const getMobxAdministration = (\n context: AnyObject,\n): ObservableObjectAdministration => context[$mobx];\n","import { onBecomeObserved, onBecomeUnobserved } from 'mobx';\n\n/**\n * When ONE OF the properties is becomes observed then `onStart` function is called.\n * WHen ALL properties are unobserved then `onEnd` function is called with the `metaData` that was returned by `onStart`.\n *\n * It uses `onBecomeObserved` and `onBecomeUnobserved` mobx hooks to perform lazy observation.\n */\nexport const lazyObserve = <TMetaData = void>({\n context,\n property,\n onStart,\n onEnd,\n endDelay = false,\n}: {\n context?: any;\n property: any | any[];\n onStart?: () => TMetaData;\n onEnd?: (metaData: TMetaData, cleanupFn: VoidFunction) => void;\n endDelay?: number | false;\n}) => {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let metaData: TMetaData | undefined;\n const observingProps = new Set<string>();\n const properties = Array.isArray(property) ? property : [property];\n\n const cleanup = () => {\n observingProps.clear();\n\n if (endDelay === false) {\n onEnd?.(metaData!, cleanup);\n metaData = undefined;\n return;\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n timeoutId = setTimeout(() => {\n onEnd?.(metaData!, cleanup);\n timeoutId = undefined;\n metaData = undefined;\n }, endDelay);\n };\n\n const start = (property: string) => {\n const isAlreadyObserving = observingProps.size > 0;\n observingProps.add(property);\n\n if (isAlreadyObserving) {\n return;\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n metaData = onStart?.();\n };\n\n const stop = (property: string) => {\n const isAlreadyNotObserving = !observingProps.size;\n\n observingProps.delete(property);\n\n const isObserving = observingProps.size > 0;\n\n if (isAlreadyNotObserving || isObserving) {\n return;\n }\n\n cleanup();\n };\n\n properties.forEach((property) => {\n if (context) {\n onBecomeObserved(context, property, () => start(property));\n onBecomeUnobserved(context, property, () => stop(property));\n } else {\n onBecomeObserved(property, () => start(property));\n onBecomeUnobserved(property, () => stop(property));\n }\n });\n\n return cleanup;\n};\n"],"names":["makeObservable","createAtom","mobxComparer","runInAction","observable","action","newData","typeGuard","$mobx","property","onBecomeObserved","onBecomeUnobserved"],"mappings":"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"}
1
+ {"version":3,"file":"mobx.cjs","sources":["../src/mobx/apply-observable.ts","../src/mobx/create-enhanced-atom.ts","../src/mobx/create-ref.ts","../src/mobx/deep-observable-struct.ts","../src/mobx/get-mobx-administration.ts","../src/mobx/lazy-observe.ts"],"sourcesContent":["import { makeObservable } from 'mobx';\nimport type { AnyObject } from 'yummies/types';\n\nexport type ObservableAnnotationsArray = [string, any][];\n\nexport const applyObservable = (\n context: AnyObject,\n annotationsArray: ObservableAnnotationsArray,\n useDecorators?: boolean,\n) => {\n if (useDecorators) {\n annotationsArray.forEach(([field, annotation]) => {\n annotation(context, field);\n });\n\n makeObservable(context);\n } else {\n makeObservable(context, Object.fromEntries(annotationsArray));\n }\n};\n","import { createAtom, type IAtom } from 'mobx';\nimport type { AnyObject } from 'yummies/types';\n\nexport interface IEnhancedAtom<TMeta extends AnyObject = AnyObject>\n extends IAtom {\n meta: TMeta;\n}\n\n/**\n * Creates an enhanced atom with meta data\n * And bind `reportChanged` and `reportObserved` method to the atom\n */\nexport const createEnhancedAtom = <TMeta extends AnyObject>(\n name: string,\n onBecomeObservedHandler?: (atom: IEnhancedAtom<TMeta>) => void,\n onBecomeUnobservedHandler?: (atom: IEnhancedAtom<TMeta>) => void,\n meta?: TMeta,\n): IEnhancedAtom<TMeta> => {\n const atom = createAtom(\n name,\n onBecomeObservedHandler && (() => onBecomeObservedHandler(atom)),\n onBecomeUnobservedHandler && (() => onBecomeUnobservedHandler(atom)),\n ) as IEnhancedAtom<TMeta>;\n atom.meta = meta ?? ({} as TMeta);\n atom.reportChanged = atom.reportChanged.bind(atom);\n atom.reportObserved = atom.reportObserved.bind(atom);\n return atom;\n};\n","import {\n type IEqualsComparer,\n makeObservable,\n comparer as mobxComparer,\n observable,\n runInAction,\n} from 'mobx';\nimport type { AnyObject, Maybe } from 'yummies/types';\n\n/**\n * You can return `false` if you don't want to change the value in this ref\n */\nexport type RefChangeListener<T> = (\n value: T | null,\n prevValue: T | undefined,\n) => void | false;\n\n/**\n * Alternative to React.createRef but works in MobX world.\n * Typically it the should be the same React.LegacyRef (fn style)\n */\nexport interface Ref<T = any, TMeta = AnyObject> {\n /**\n * Setter function\n */\n (value: Maybe<T>): void;\n\n listeners: Set<RefChangeListener<NoInfer<T>>>;\n current: NoInfer<T> | null;\n meta: TMeta;\n}\n\nexport interface CreateRefConfig<T = any, TMeta = AnyObject> {\n onSet?: (node: T, prevValue: T | undefined) => void;\n onUnset?: (lastValue: T | undefined) => void;\n onChange?: RefChangeListener<T>;\n meta?: TMeta;\n initial?: Maybe<T>;\n comparer?: IEqualsComparer<T | null>;\n}\n\n/**\n * Creates ref thing to attach HTMLElements in React and all other\n */\nexport const createRef = <T = any, TMeta = AnyObject>(\n cfg?: CreateRefConfig<T, TMeta>,\n): Ref<T, TMeta> => {\n let lastValue: T | undefined;\n const comparer = cfg?.comparer ?? mobxComparer.default;\n\n const ref = ((value: Maybe<T>) => {\n const nextValue = value ?? null;\n\n if (comparer(ref.current, nextValue)) {\n return;\n }\n\n runInAction(() => {\n const prevLastValue = lastValue;\n lastValue = ref.current ?? undefined;\n ref.current = nextValue;\n\n let isNextValueIgnored = false;\n\n ref.listeners.forEach((listener) => {\n const listenerResult = listener(ref.current, lastValue);\n\n if (listenerResult === false) {\n isNextValueIgnored = true;\n }\n });\n\n if (isNextValueIgnored) {\n lastValue = prevLastValue;\n ref.current = lastValue ?? null;\n } else if (ref.current === null && lastValue !== undefined) {\n lastValue = undefined;\n }\n });\n }) as Ref<T, TMeta>;\n\n ref.listeners = new Set(cfg?.onChange ? [cfg.onChange] : []);\n\n if (cfg?.onSet || cfg?.onUnset) {\n ref.listeners.add((value, prevValue) => {\n if (value) {\n cfg.onSet?.(value, prevValue);\n } else {\n cfg.onUnset?.(prevValue);\n }\n });\n }\n\n ref.current = cfg?.initial ?? null;\n ref.meta = cfg?.meta ?? ({} as TMeta);\n\n makeObservable(ref, {\n current: observable.ref,\n meta: observable,\n });\n\n return ref;\n};\n\nexport const isRef = <T, TMeta = any>(\n value: T | Ref<T, TMeta>,\n): value is Ref<T, TMeta> => {\n return typeof value === 'function' && 'current' in value;\n};\n\nexport const toRef = <T, TMeta = any>(\n value: T | Ref<T, TMeta>,\n cfg?: Omit<CreateRefConfig<T, TMeta>, 'initial'>,\n): Ref<T, TMeta> => {\n return isRef(value) ? value : createRef({ initial: value, ...cfg });\n};\n","import { action, makeObservable, observable } from 'mobx';\nimport { typeGuard } from 'yummies/type-guard';\nimport type { AnyObject } from 'yummies/types';\n\nexport class DeepObservableStruct<TData extends AnyObject> {\n data: TData;\n\n constructor(data: TData) {\n this.data = data;\n\n makeObservable(this, {\n data: observable.deep,\n set: action,\n });\n }\n\n set(newData: Partial<TData>) {\n type StackItem = [key: string, currObservable: AnyObject, new: AnyObject];\n\n const stack: StackItem[] = Object.keys(this.data).map((key) => [\n key,\n this.data,\n newData,\n ]);\n\n let currentIndex = 0;\n let stackLength = stack.length;\n\n while (currentIndex < stackLength) {\n const [key, currObservableData, newData] = stack[currentIndex];\n const newValue = newData[key];\n const currValue = currObservableData[key];\n\n currentIndex++;\n\n if (key in newData) {\n if (typeGuard.isObject(newValue) && typeGuard.isObject(currValue)) {\n const newValueKeys = Object.keys(newValue);\n\n Object.keys(currValue).forEach((childKey) => {\n if (!(childKey in newValue)) {\n delete currObservableData[key][childKey];\n }\n });\n\n newValueKeys.forEach((childKey) => {\n const length = stack.push([\n childKey,\n currObservableData[key],\n newValue,\n ]);\n stackLength = length;\n });\n } else if (newValue !== currValue) {\n currObservableData[key] = newValue;\n }\n } else {\n delete currObservableData[key];\n }\n }\n\n Object.keys(newData).forEach((newDataKey) => {\n if (!this.data[newDataKey]) {\n // @ts-expect-error\n this.data[newDataKey] = newData[newDataKey];\n }\n });\n }\n}\n","import { $mobx, type AnnotationMapEntry } from 'mobx';\nimport type { AnyObject } from 'yummies/types';\n\ntype ObservableObjectAdministration = Parameters<\n Exclude<AnnotationMapEntry, boolean>['make_']\n>[0];\n\nexport const getMobxAdministration = (\n context: AnyObject,\n): ObservableObjectAdministration => context[$mobx];\n","import { onBecomeObserved, onBecomeUnobserved } from 'mobx';\n\n/**\n * When ONE OF the properties is becomes observed then `onStart` function is called.\n * WHen ALL properties are unobserved then `onEnd` function is called with the `metaData` that was returned by `onStart`.\n *\n * It uses `onBecomeObserved` and `onBecomeUnobserved` mobx hooks to perform lazy observation.\n */\nexport const lazyObserve = <TMetaData = void>({\n context,\n property,\n onStart,\n onEnd,\n endDelay = false,\n}: {\n context?: any;\n property: any | any[];\n onStart?: () => TMetaData;\n onEnd?: (metaData: TMetaData, cleanupFn: VoidFunction) => void;\n endDelay?: number | false;\n}) => {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let metaData: TMetaData | undefined;\n const observingProps = new Set<string>();\n const properties = Array.isArray(property) ? property : [property];\n\n const cleanup = () => {\n observingProps.clear();\n\n if (endDelay === false) {\n onEnd?.(metaData!, cleanup);\n metaData = undefined;\n return;\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n timeoutId = setTimeout(() => {\n onEnd?.(metaData!, cleanup);\n timeoutId = undefined;\n metaData = undefined;\n }, endDelay);\n };\n\n const start = (property: string) => {\n const isAlreadyObserving = observingProps.size > 0;\n observingProps.add(property);\n\n if (isAlreadyObserving) {\n return;\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n metaData = onStart?.();\n };\n\n const stop = (property: string) => {\n const isAlreadyNotObserving = !observingProps.size;\n\n observingProps.delete(property);\n\n const isObserving = observingProps.size > 0;\n\n if (isAlreadyNotObserving || isObserving) {\n return;\n }\n\n cleanup();\n };\n\n properties.forEach((property) => {\n if (context) {\n onBecomeObserved(context, property, () => start(property));\n onBecomeUnobserved(context, property, () => stop(property));\n } else {\n onBecomeObserved(property, () => start(property));\n onBecomeUnobserved(property, () => stop(property));\n }\n });\n\n return cleanup;\n};\n"],"names":["makeObservable","createAtom","mobxComparer","runInAction","observable","action","newData","typeGuard","$mobx","property","onBecomeObserved","onBecomeUnobserved"],"mappings":"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"}
package/mobx.d.ts CHANGED
@@ -13,7 +13,10 @@ interface IEnhancedAtom<TMeta extends AnyObject = AnyObject> extends IAtom {
13
13
  */
14
14
  declare const createEnhancedAtom: <TMeta extends AnyObject>(name: string, onBecomeObservedHandler?: (atom: IEnhancedAtom<TMeta>) => void, onBecomeUnobservedHandler?: (atom: IEnhancedAtom<TMeta>) => void, meta?: TMeta) => IEnhancedAtom<TMeta>;
15
15
 
16
- type RefChangeListener<T> = (value: T | null, prevValue: T | undefined) => void;
16
+ /**
17
+ * You can return `false` if you don't want to change the value in this ref
18
+ */
19
+ type RefChangeListener<T> = (value: T | null, prevValue: T | undefined) => void | false;
17
20
  /**
18
21
  * Alternative to React.createRef but works in MobX world.
19
22
  * Typically it the should be the same React.LegacyRef (fn style)
package/mobx.js CHANGED
@@ -30,12 +30,20 @@ const createRef = (cfg) => {
30
30
  return;
31
31
  }
32
32
  runInAction(() => {
33
+ const prevLastValue = lastValue;
33
34
  lastValue = ref.current ?? void 0;
34
35
  ref.current = nextValue;
36
+ let isNextValueIgnored = false;
35
37
  ref.listeners.forEach((listener) => {
36
- listener(ref.current, lastValue);
38
+ const listenerResult = listener(ref.current, lastValue);
39
+ if (listenerResult === false) {
40
+ isNextValueIgnored = true;
41
+ }
37
42
  });
38
- if (ref.current === null && lastValue !== void 0) {
43
+ if (isNextValueIgnored) {
44
+ lastValue = prevLastValue;
45
+ ref.current = lastValue ?? null;
46
+ } else if (ref.current === null && lastValue !== void 0) {
39
47
  lastValue = void 0;
40
48
  }
41
49
  });
package/mobx.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mobx.js","sources":["../src/mobx/apply-observable.ts","../src/mobx/create-enhanced-atom.ts","../src/mobx/create-ref.ts","../src/mobx/deep-observable-struct.ts","../src/mobx/get-mobx-administration.ts","../src/mobx/lazy-observe.ts"],"sourcesContent":["import { makeObservable } from 'mobx';\nimport type { AnyObject } from 'yummies/types';\n\nexport type ObservableAnnotationsArray = [string, any][];\n\nexport const applyObservable = (\n context: AnyObject,\n annotationsArray: ObservableAnnotationsArray,\n useDecorators?: boolean,\n) => {\n if (useDecorators) {\n annotationsArray.forEach(([field, annotation]) => {\n annotation(context, field);\n });\n\n makeObservable(context);\n } else {\n makeObservable(context, Object.fromEntries(annotationsArray));\n }\n};\n","import { createAtom, type IAtom } from 'mobx';\nimport type { AnyObject } from 'yummies/types';\n\nexport interface IEnhancedAtom<TMeta extends AnyObject = AnyObject>\n extends IAtom {\n meta: TMeta;\n}\n\n/**\n * Creates an enhanced atom with meta data\n * And bind `reportChanged` and `reportObserved` method to the atom\n */\nexport const createEnhancedAtom = <TMeta extends AnyObject>(\n name: string,\n onBecomeObservedHandler?: (atom: IEnhancedAtom<TMeta>) => void,\n onBecomeUnobservedHandler?: (atom: IEnhancedAtom<TMeta>) => void,\n meta?: TMeta,\n): IEnhancedAtom<TMeta> => {\n const atom = createAtom(\n name,\n onBecomeObservedHandler && (() => onBecomeObservedHandler(atom)),\n onBecomeUnobservedHandler && (() => onBecomeUnobservedHandler(atom)),\n ) as IEnhancedAtom<TMeta>;\n atom.meta = meta ?? ({} as TMeta);\n atom.reportChanged = atom.reportChanged.bind(atom);\n atom.reportObserved = atom.reportObserved.bind(atom);\n return atom;\n};\n","import {\n type IEqualsComparer,\n makeObservable,\n comparer as mobxComparer,\n observable,\n runInAction,\n} from 'mobx';\nimport type { AnyObject, Maybe } from 'yummies/types';\n\nexport type RefChangeListener<T> = (\n value: T | null,\n prevValue: T | undefined,\n) => void;\n\n/**\n * Alternative to React.createRef but works in MobX world.\n * Typically it the should be the same React.LegacyRef (fn style)\n */\nexport interface Ref<T = any, TMeta = AnyObject> {\n /**\n * Setter function\n */\n (value: Maybe<T>): void;\n\n listeners: Set<RefChangeListener<NoInfer<T>>>;\n current: NoInfer<T> | null;\n meta: TMeta;\n}\n\nexport interface CreateRefConfig<T = any, TMeta = AnyObject> {\n onSet?: (node: T, prevValue: T | undefined) => void;\n onUnset?: (lastValue: T | undefined) => void;\n onChange?: RefChangeListener<T>;\n meta?: TMeta;\n initial?: Maybe<T>;\n comparer?: IEqualsComparer<T | null>;\n}\n\n/**\n * Creates ref thing to attach HTMLElements in React and all other\n */\nexport const createRef = <T = any, TMeta = AnyObject>(\n cfg?: CreateRefConfig<T, TMeta>,\n): Ref<T, TMeta> => {\n let lastValue: T | undefined;\n const comparer = cfg?.comparer ?? mobxComparer.default;\n\n const ref = ((value: Maybe<T>) => {\n const nextValue = value ?? null;\n\n if (comparer(ref.current, nextValue)) {\n return;\n }\n\n runInAction(() => {\n lastValue = ref.current ?? undefined;\n ref.current = nextValue;\n\n ref.listeners.forEach((listener) => {\n listener(ref.current, lastValue);\n });\n\n if (ref.current === null && lastValue !== undefined) {\n lastValue = undefined;\n }\n });\n }) as Ref<T, TMeta>;\n\n ref.listeners = new Set(cfg?.onChange ? [cfg.onChange] : []);\n\n if (cfg?.onSet || cfg?.onUnset) {\n ref.listeners.add((value, prevValue) => {\n if (value) {\n cfg.onSet?.(value, prevValue);\n } else {\n cfg.onUnset?.(prevValue);\n }\n });\n }\n\n ref.current = cfg?.initial ?? null;\n ref.meta = cfg?.meta ?? ({} as TMeta);\n\n makeObservable(ref, {\n current: observable.ref,\n meta: observable,\n });\n\n return ref;\n};\n\nexport const isRef = <T, TMeta = any>(\n value: T | Ref<T, TMeta>,\n): value is Ref<T, TMeta> => {\n return typeof value === 'function' && 'current' in value;\n};\n\nexport const toRef = <T, TMeta = any>(\n value: T | Ref<T, TMeta>,\n cfg?: Omit<CreateRefConfig<T, TMeta>, 'initial'>,\n): Ref<T, TMeta> => {\n return isRef(value) ? value : createRef({ initial: value, ...cfg });\n};\n","import { action, makeObservable, observable } from 'mobx';\nimport { typeGuard } from 'yummies/type-guard';\nimport type { AnyObject } from 'yummies/types';\n\nexport class DeepObservableStruct<TData extends AnyObject> {\n data: TData;\n\n constructor(data: TData) {\n this.data = data;\n\n makeObservable(this, {\n data: observable.deep,\n set: action,\n });\n }\n\n set(newData: Partial<TData>) {\n type StackItem = [key: string, currObservable: AnyObject, new: AnyObject];\n\n const stack: StackItem[] = Object.keys(this.data).map((key) => [\n key,\n this.data,\n newData,\n ]);\n\n let currentIndex = 0;\n let stackLength = stack.length;\n\n while (currentIndex < stackLength) {\n const [key, currObservableData, newData] = stack[currentIndex];\n const newValue = newData[key];\n const currValue = currObservableData[key];\n\n currentIndex++;\n\n if (key in newData) {\n if (typeGuard.isObject(newValue) && typeGuard.isObject(currValue)) {\n const newValueKeys = Object.keys(newValue);\n\n Object.keys(currValue).forEach((childKey) => {\n if (!(childKey in newValue)) {\n delete currObservableData[key][childKey];\n }\n });\n\n newValueKeys.forEach((childKey) => {\n const length = stack.push([\n childKey,\n currObservableData[key],\n newValue,\n ]);\n stackLength = length;\n });\n } else if (newValue !== currValue) {\n currObservableData[key] = newValue;\n }\n } else {\n delete currObservableData[key];\n }\n }\n\n Object.keys(newData).forEach((newDataKey) => {\n if (!this.data[newDataKey]) {\n // @ts-expect-error\n this.data[newDataKey] = newData[newDataKey];\n }\n });\n }\n}\n","import { $mobx, type AnnotationMapEntry } from 'mobx';\nimport type { AnyObject } from 'yummies/types';\n\ntype ObservableObjectAdministration = Parameters<\n Exclude<AnnotationMapEntry, boolean>['make_']\n>[0];\n\nexport const getMobxAdministration = (\n context: AnyObject,\n): ObservableObjectAdministration => context[$mobx];\n","import { onBecomeObserved, onBecomeUnobserved } from 'mobx';\n\n/**\n * When ONE OF the properties is becomes observed then `onStart` function is called.\n * WHen ALL properties are unobserved then `onEnd` function is called with the `metaData` that was returned by `onStart`.\n *\n * It uses `onBecomeObserved` and `onBecomeUnobserved` mobx hooks to perform lazy observation.\n */\nexport const lazyObserve = <TMetaData = void>({\n context,\n property,\n onStart,\n onEnd,\n endDelay = false,\n}: {\n context?: any;\n property: any | any[];\n onStart?: () => TMetaData;\n onEnd?: (metaData: TMetaData, cleanupFn: VoidFunction) => void;\n endDelay?: number | false;\n}) => {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let metaData: TMetaData | undefined;\n const observingProps = new Set<string>();\n const properties = Array.isArray(property) ? property : [property];\n\n const cleanup = () => {\n observingProps.clear();\n\n if (endDelay === false) {\n onEnd?.(metaData!, cleanup);\n metaData = undefined;\n return;\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n timeoutId = setTimeout(() => {\n onEnd?.(metaData!, cleanup);\n timeoutId = undefined;\n metaData = undefined;\n }, endDelay);\n };\n\n const start = (property: string) => {\n const isAlreadyObserving = observingProps.size > 0;\n observingProps.add(property);\n\n if (isAlreadyObserving) {\n return;\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n metaData = onStart?.();\n };\n\n const stop = (property: string) => {\n const isAlreadyNotObserving = !observingProps.size;\n\n observingProps.delete(property);\n\n const isObserving = observingProps.size > 0;\n\n if (isAlreadyNotObserving || isObserving) {\n return;\n }\n\n cleanup();\n };\n\n properties.forEach((property) => {\n if (context) {\n onBecomeObserved(context, property, () => start(property));\n onBecomeUnobserved(context, property, () => stop(property));\n } else {\n onBecomeObserved(property, () => start(property));\n onBecomeUnobserved(property, () => stop(property));\n }\n });\n\n return cleanup;\n};\n"],"names":["comparer","mobxComparer","newData","property"],"mappings":"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"}
1
+ {"version":3,"file":"mobx.js","sources":["../src/mobx/apply-observable.ts","../src/mobx/create-enhanced-atom.ts","../src/mobx/create-ref.ts","../src/mobx/deep-observable-struct.ts","../src/mobx/get-mobx-administration.ts","../src/mobx/lazy-observe.ts"],"sourcesContent":["import { makeObservable } from 'mobx';\nimport type { AnyObject } from 'yummies/types';\n\nexport type ObservableAnnotationsArray = [string, any][];\n\nexport const applyObservable = (\n context: AnyObject,\n annotationsArray: ObservableAnnotationsArray,\n useDecorators?: boolean,\n) => {\n if (useDecorators) {\n annotationsArray.forEach(([field, annotation]) => {\n annotation(context, field);\n });\n\n makeObservable(context);\n } else {\n makeObservable(context, Object.fromEntries(annotationsArray));\n }\n};\n","import { createAtom, type IAtom } from 'mobx';\nimport type { AnyObject } from 'yummies/types';\n\nexport interface IEnhancedAtom<TMeta extends AnyObject = AnyObject>\n extends IAtom {\n meta: TMeta;\n}\n\n/**\n * Creates an enhanced atom with meta data\n * And bind `reportChanged` and `reportObserved` method to the atom\n */\nexport const createEnhancedAtom = <TMeta extends AnyObject>(\n name: string,\n onBecomeObservedHandler?: (atom: IEnhancedAtom<TMeta>) => void,\n onBecomeUnobservedHandler?: (atom: IEnhancedAtom<TMeta>) => void,\n meta?: TMeta,\n): IEnhancedAtom<TMeta> => {\n const atom = createAtom(\n name,\n onBecomeObservedHandler && (() => onBecomeObservedHandler(atom)),\n onBecomeUnobservedHandler && (() => onBecomeUnobservedHandler(atom)),\n ) as IEnhancedAtom<TMeta>;\n atom.meta = meta ?? ({} as TMeta);\n atom.reportChanged = atom.reportChanged.bind(atom);\n atom.reportObserved = atom.reportObserved.bind(atom);\n return atom;\n};\n","import {\n type IEqualsComparer,\n makeObservable,\n comparer as mobxComparer,\n observable,\n runInAction,\n} from 'mobx';\nimport type { AnyObject, Maybe } from 'yummies/types';\n\n/**\n * You can return `false` if you don't want to change the value in this ref\n */\nexport type RefChangeListener<T> = (\n value: T | null,\n prevValue: T | undefined,\n) => void | false;\n\n/**\n * Alternative to React.createRef but works in MobX world.\n * Typically it the should be the same React.LegacyRef (fn style)\n */\nexport interface Ref<T = any, TMeta = AnyObject> {\n /**\n * Setter function\n */\n (value: Maybe<T>): void;\n\n listeners: Set<RefChangeListener<NoInfer<T>>>;\n current: NoInfer<T> | null;\n meta: TMeta;\n}\n\nexport interface CreateRefConfig<T = any, TMeta = AnyObject> {\n onSet?: (node: T, prevValue: T | undefined) => void;\n onUnset?: (lastValue: T | undefined) => void;\n onChange?: RefChangeListener<T>;\n meta?: TMeta;\n initial?: Maybe<T>;\n comparer?: IEqualsComparer<T | null>;\n}\n\n/**\n * Creates ref thing to attach HTMLElements in React and all other\n */\nexport const createRef = <T = any, TMeta = AnyObject>(\n cfg?: CreateRefConfig<T, TMeta>,\n): Ref<T, TMeta> => {\n let lastValue: T | undefined;\n const comparer = cfg?.comparer ?? mobxComparer.default;\n\n const ref = ((value: Maybe<T>) => {\n const nextValue = value ?? null;\n\n if (comparer(ref.current, nextValue)) {\n return;\n }\n\n runInAction(() => {\n const prevLastValue = lastValue;\n lastValue = ref.current ?? undefined;\n ref.current = nextValue;\n\n let isNextValueIgnored = false;\n\n ref.listeners.forEach((listener) => {\n const listenerResult = listener(ref.current, lastValue);\n\n if (listenerResult === false) {\n isNextValueIgnored = true;\n }\n });\n\n if (isNextValueIgnored) {\n lastValue = prevLastValue;\n ref.current = lastValue ?? null;\n } else if (ref.current === null && lastValue !== undefined) {\n lastValue = undefined;\n }\n });\n }) as Ref<T, TMeta>;\n\n ref.listeners = new Set(cfg?.onChange ? [cfg.onChange] : []);\n\n if (cfg?.onSet || cfg?.onUnset) {\n ref.listeners.add((value, prevValue) => {\n if (value) {\n cfg.onSet?.(value, prevValue);\n } else {\n cfg.onUnset?.(prevValue);\n }\n });\n }\n\n ref.current = cfg?.initial ?? null;\n ref.meta = cfg?.meta ?? ({} as TMeta);\n\n makeObservable(ref, {\n current: observable.ref,\n meta: observable,\n });\n\n return ref;\n};\n\nexport const isRef = <T, TMeta = any>(\n value: T | Ref<T, TMeta>,\n): value is Ref<T, TMeta> => {\n return typeof value === 'function' && 'current' in value;\n};\n\nexport const toRef = <T, TMeta = any>(\n value: T | Ref<T, TMeta>,\n cfg?: Omit<CreateRefConfig<T, TMeta>, 'initial'>,\n): Ref<T, TMeta> => {\n return isRef(value) ? value : createRef({ initial: value, ...cfg });\n};\n","import { action, makeObservable, observable } from 'mobx';\nimport { typeGuard } from 'yummies/type-guard';\nimport type { AnyObject } from 'yummies/types';\n\nexport class DeepObservableStruct<TData extends AnyObject> {\n data: TData;\n\n constructor(data: TData) {\n this.data = data;\n\n makeObservable(this, {\n data: observable.deep,\n set: action,\n });\n }\n\n set(newData: Partial<TData>) {\n type StackItem = [key: string, currObservable: AnyObject, new: AnyObject];\n\n const stack: StackItem[] = Object.keys(this.data).map((key) => [\n key,\n this.data,\n newData,\n ]);\n\n let currentIndex = 0;\n let stackLength = stack.length;\n\n while (currentIndex < stackLength) {\n const [key, currObservableData, newData] = stack[currentIndex];\n const newValue = newData[key];\n const currValue = currObservableData[key];\n\n currentIndex++;\n\n if (key in newData) {\n if (typeGuard.isObject(newValue) && typeGuard.isObject(currValue)) {\n const newValueKeys = Object.keys(newValue);\n\n Object.keys(currValue).forEach((childKey) => {\n if (!(childKey in newValue)) {\n delete currObservableData[key][childKey];\n }\n });\n\n newValueKeys.forEach((childKey) => {\n const length = stack.push([\n childKey,\n currObservableData[key],\n newValue,\n ]);\n stackLength = length;\n });\n } else if (newValue !== currValue) {\n currObservableData[key] = newValue;\n }\n } else {\n delete currObservableData[key];\n }\n }\n\n Object.keys(newData).forEach((newDataKey) => {\n if (!this.data[newDataKey]) {\n // @ts-expect-error\n this.data[newDataKey] = newData[newDataKey];\n }\n });\n }\n}\n","import { $mobx, type AnnotationMapEntry } from 'mobx';\nimport type { AnyObject } from 'yummies/types';\n\ntype ObservableObjectAdministration = Parameters<\n Exclude<AnnotationMapEntry, boolean>['make_']\n>[0];\n\nexport const getMobxAdministration = (\n context: AnyObject,\n): ObservableObjectAdministration => context[$mobx];\n","import { onBecomeObserved, onBecomeUnobserved } from 'mobx';\n\n/**\n * When ONE OF the properties is becomes observed then `onStart` function is called.\n * WHen ALL properties are unobserved then `onEnd` function is called with the `metaData` that was returned by `onStart`.\n *\n * It uses `onBecomeObserved` and `onBecomeUnobserved` mobx hooks to perform lazy observation.\n */\nexport const lazyObserve = <TMetaData = void>({\n context,\n property,\n onStart,\n onEnd,\n endDelay = false,\n}: {\n context?: any;\n property: any | any[];\n onStart?: () => TMetaData;\n onEnd?: (metaData: TMetaData, cleanupFn: VoidFunction) => void;\n endDelay?: number | false;\n}) => {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let metaData: TMetaData | undefined;\n const observingProps = new Set<string>();\n const properties = Array.isArray(property) ? property : [property];\n\n const cleanup = () => {\n observingProps.clear();\n\n if (endDelay === false) {\n onEnd?.(metaData!, cleanup);\n metaData = undefined;\n return;\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n timeoutId = setTimeout(() => {\n onEnd?.(metaData!, cleanup);\n timeoutId = undefined;\n metaData = undefined;\n }, endDelay);\n };\n\n const start = (property: string) => {\n const isAlreadyObserving = observingProps.size > 0;\n observingProps.add(property);\n\n if (isAlreadyObserving) {\n return;\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n metaData = onStart?.();\n };\n\n const stop = (property: string) => {\n const isAlreadyNotObserving = !observingProps.size;\n\n observingProps.delete(property);\n\n const isObserving = observingProps.size > 0;\n\n if (isAlreadyNotObserving || isObserving) {\n return;\n }\n\n cleanup();\n };\n\n properties.forEach((property) => {\n if (context) {\n onBecomeObserved(context, property, () => start(property));\n onBecomeUnobserved(context, property, () => stop(property));\n } else {\n onBecomeObserved(property, () => start(property));\n onBecomeUnobserved(property, () => stop(property));\n }\n });\n\n return cleanup;\n};\n"],"names":["comparer","mobxComparer","newData","property"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yummies",
3
- "version": "6.3.2",
3
+ "version": "6.5.0",
4
4
  "keywords": [
5
5
  "javascript",
6
6
  "typescript",
package/react.cjs CHANGED
@@ -1,6 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const react = require("react");
4
+ const attachRefs = (value, ...refs) => refs.forEach((ref) => {
5
+ if (typeof ref === "function") {
6
+ ref(value);
7
+ } else if (ref && typeof ref !== "string") {
8
+ ref.current = value;
9
+ }
10
+ });
4
11
  const useConstant = (defineValue) => {
5
12
  const ref = react.useRef();
6
13
  if (!ref.current) {
@@ -192,6 +199,7 @@ const useVisibilityState = () => {
192
199
  }, []);
193
200
  return state;
194
201
  };
202
+ exports.attachRefs = attachRefs;
195
203
  exports.createUseInstanceHook = createUseInstanceHook;
196
204
  exports.useAbortController = useAbortController;
197
205
  exports.useAbortSignal = useAbortSignal;
package/react.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"react.cjs","sources":["../src/react/hooks/use-constant.ts","../src/react/hooks/use-abort-controller.ts","../src/react/hooks/use-abort-signal.ts","../src/react/hooks/use-sync-ref.ts","../src/react/hooks/use-event-listener.ts","../src/react/hooks/use-click-outside.ts","../src/react/hooks/use-define-ref.ts","../src/react/hooks/use-element-ref.ts","../src/react/hooks/use-event.ts","../src/react/hooks/use-flag.ts","../src/react/hooks/use-force-update.ts","../src/react/hooks/use-initial-height.ts","../src/react/hooks/use-instance.ts","../src/react/hooks/use-intersection-observer.ts","../src/react/hooks/use-last-defined-value.ts","../src/react/hooks/use-last-value-ref.ts","../src/react/hooks/use-life-cycle.ts","../src/react/hooks/use-resize-observer.ts","../src/react/hooks/use-toggle.ts","../src/react/hooks/use-value.ts","../src/react/hooks/use-visibility-state.ts"],"sourcesContent":["import { useRef } from 'react';\n\n/**\n * React hook for creating a value exactly once.\n * useMemo doesn't give this guarantee unfortunately -\n * https://reactjs.org/docs/hooks-faq.html#how-to-create-expensive-objects-lazily\n * https://reactjs.org/docs/hooks-reference.html#usememo\n * @param defineValue Function which returns defined value.\n */\nexport const useConstant = <T>(defineValue: () => T): T => {\n const ref = useRef<{ value: T }>();\n\n if (!ref.current) {\n ref.current = { value: defineValue() };\n }\n\n return ref.current.value;\n};\n","import { useEffect } from 'react';\n\nimport { useConstant } from './use-constant.js';\n\nexport const useAbortController = () => {\n const controller = useConstant(() => new AbortController());\n\n useEffect(() => {\n return () => {\n controller.abort();\n };\n }, []);\n\n return controller;\n};\n","import { useAbortController } from './use-abort-controller.js';\n\nexport const useAbortSignal = () => {\n return useAbortController().signal;\n};\n","import { useRef } from 'react';\n\nexport const useSyncRef = <T>(value: T) => {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n};\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { useEffect } from 'react';\nimport { useSyncRef } from './use-sync-ref.js';\n\nexport const useEventListener = <EventName extends keyof HTMLElementEventMap>({\n event,\n handler,\n options,\n deps = [],\n node = document,\n}: {\n event: EventName;\n handler: (e: HTMLElementEventMap[EventName]) => void;\n options?: boolean | AddEventListenerOptions;\n deps?: unknown[];\n node?: HTMLElement | Document | Window;\n}) => {\n const handlerRef = useSyncRef(handler);\n\n useEffect(() => {\n const handleEvent = (e: HTMLElementEventMap[EventName]) =>\n handlerRef.current(e);\n\n // @ts-expect-error\n node.addEventListener(event, handleEvent, options);\n // @ts-expect-error\n return () => node.removeEventListener(event, handleEvent, options);\n }, deps);\n};\n","import type { MutableRefObject } from 'react';\nimport { useEventListener } from './use-event-listener.js';\n\ntype ClickOutsideInput = {\n contentRef: MutableRefObject<HTMLElement | null>;\n onClick: VoidFunction;\n options?: AddEventListenerOptions;\n};\n\nexport const useClickOutside = ({\n contentRef,\n onClick,\n options,\n}: ClickOutsideInput) => {\n useEventListener({\n event: 'mousedown',\n handler: (event) => {\n if (\n contentRef.current &&\n !contentRef.current.contains(event.target as Node)\n ) {\n onClick();\n }\n },\n options,\n });\n};\n","import { type MutableRefObject, useRef } from 'react';\n\n/**\n * React hook for creating a value exactly once.\n * useMemo doesn't give this guarantee unfortunately -\n * https://reactjs.org/docs/hooks-faq.html#how-to-create-expensive-objects-lazily\n * https://reactjs.org/docs/hooks-reference.html#usememo\n * @param defineFn Function which returns defined value.\n */\nexport const useDefineRef = <T>(defineFn: () => T): MutableRefObject<T> => {\n const ref = useRef<T>(void 0 as T);\n\n if (!ref.current) {\n ref.current = defineFn();\n }\n\n return ref;\n};\n","import { useLayoutEffect, useRef } from 'react';\n\nexport const useElementRef = <T extends HTMLElement>(selector: () => T) => {\n const ref = useRef<T>();\n\n useLayoutEffect(() => {\n ref.current = selector();\n }, []);\n\n return ref;\n};\n","/**\n * A Hook to define an event handler with an always-stable function identity.\n *\n * borrowed from @gaeron\n * https://github.com/reactjs/rfcs/blob/useevent/text/0000-useevent.md\n */\nimport { useCallback, useLayoutEffect, useRef } from 'react';\nimport type { AnyFunction } from 'yummies/types';\n\nexport const useEvent = <H extends AnyFunction>(handler: H): H => {\n const handlerRef = useRef<H>(handler);\n\n // In a real implementation, this would run before layout effects\n useLayoutEffect(() => {\n handlerRef.current = handler;\n });\n\n return useCallback((...args: unknown[]) => {\n // In a real implementation, this would throw if called during render\n const fn = handlerRef.current as AnyFunction;\n return fn(...args);\n }, []) as unknown as H;\n};\n","import { useCallback, useRef, useState } from 'react';\n\nexport interface FlagHook {\n enabled: boolean;\n toggle: VoidFunction;\n enable: VoidFunction;\n disable: VoidFunction;\n}\n\nexport const useFlag = (defaultValue = false): FlagHook => {\n const [enabled, setEnabled] = useState(defaultValue);\n\n const toggle = useCallback(() => setEnabled((value) => !value), []);\n const enable = useCallback(() => setEnabled(true), []);\n const disable = useCallback(() => setEnabled(false), []);\n\n const flagObjRef = useRef<FlagHook>({\n enabled,\n toggle,\n enable,\n disable,\n });\n\n flagObjRef.current.enabled = enabled;\n\n return flagObjRef.current;\n};\n","import { useCallback, useState } from 'react';\n\nexport const useForceUpdate = () => {\n const [, setState] = useState<unknown>(null);\n\n return useCallback(() => {\n setState({});\n }, []);\n};\n","import { useEffect, useRef, useState } from 'react';\n\nexport const useInitialHeight = <T extends HTMLElement>() => {\n const ref = useRef<T | null>(null);\n const [initialHeight, setInitialHeight] = useState<number | undefined>(\n undefined,\n );\n\n useEffect(() => {\n if (ref.current && !initialHeight) {\n setInitialHeight(ref.current.offsetHeight);\n }\n }, [initialHeight]);\n\n return { ref, initialHeight };\n};\n","import { useLayoutEffect } from 'react';\nimport { useAbortSignal } from './use-abort-signal.js';\nimport { useConstant } from './use-constant.js';\n\nexport type InstanceCreateConfig<TPayload, TExtension = {}> = TExtension & {\n abortSignal: AbortSignal;\n payload: TPayload;\n};\n\nexport const createUseInstanceHook =\n <TExtension = {}>(extension?: TExtension) =>\n <TInstance, TPayload>(\n factory: (\n config: InstanceCreateConfig<NoInfer<TPayload>, TExtension>,\n ) => TInstance,\n config?: {\n payload?: TPayload;\n onUpdate?: (payload: TPayload) => void;\n },\n ) => {\n const abortSignal = useAbortSignal();\n\n const instance = useConstant(() =>\n factory({\n ...(extension as TExtension),\n abortSignal,\n payload: config?.payload as any,\n }),\n );\n\n useLayoutEffect(() => {\n config?.onUpdate?.(config.payload!);\n }, [config?.payload]);\n\n return instance;\n };\n\n/**\n * The `useInstance` hook is used to create and manage an instance of an object\n * that requires access to the root store and an abort signal.\n *\n * You can create YOUR OWN CUSTOM `useInstance` hook using `createUseInstanceHook` if you need\n * to provide some specific data\n *\n * @param factory - A factory function that takes a configuration and returns an instance.\n * @param config - An optional configuration containing additional input parameters and an update function.\n * @returns An instance created by the factory function.\n */\nexport const useInstance = createUseInstanceHook();\n","import { useEffect, useState } from 'react';\n\nexport const useIntersectionObserver = (\n callback: IntersectionObserverCallback,\n options?: IntersectionObserverInit,\n) => {\n const [intersectionObserver] = useState(\n () => new IntersectionObserver(callback, options),\n );\n\n useEffect(() => {\n return () => {\n intersectionObserver.disconnect();\n };\n }, []);\n\n return intersectionObserver;\n};\n","import { useRef } from 'react';\n\nexport const useLastDefinedValue = <T>(value: T) => {\n const ref = useRef(value);\n if (value != null) {\n ref.current = value;\n }\n return ref.current;\n};\n","import { useRef } from 'react';\n\nexport const useLastValueRef = <T>(value: T | null | undefined) => {\n const ref = useRef(value);\n\n if (value != null) {\n ref.current = value;\n }\n\n return ref;\n};\n","import { useEffect } from 'react';\nimport { useSyncRef } from './use-sync-ref.js';\n\nexport const useLifeCycle = (\n fn: () => {\n mount?: VoidFunction;\n unmount?: VoidFunction;\n },\n) => {\n const fnRef = useSyncRef(fn);\n\n useEffect(() => {\n const fnOperation = fnRef.current();\n fnOperation.mount?.();\n return fnOperation.unmount?.();\n }, []);\n};\n","import { useLayoutEffect } from 'react';\nimport { useDefineRef } from './use-define-ref.js';\n\nexport const useResizeObserver = (callback: ResizeObserverCallback) => {\n const resizeObserverRef = useDefineRef(() => new ResizeObserver(callback));\n\n useLayoutEffect(() => {\n return () => {\n resizeObserverRef.current.disconnect();\n };\n }, []);\n\n return resizeObserverRef;\n};\n","import { useCallback, useState } from 'react';\n\nexport const useToggle = (initialState?: boolean) => {\n const [toggled, setToggled] = useState(!!initialState);\n\n const toggle = useCallback(() => setToggled((toggled) => !toggled), []);\n\n return [toggled, toggle, setToggled] as const;\n};\n","import { useState } from 'react';\n\nexport const useValue = <T>(defaults: T | (() => T)) => {\n const [value, setValue] = useState<T>(defaults);\n\n return {\n value,\n set: setValue,\n };\n};\n","import { useEffect, useState } from 'react';\n\nexport const useVisibilityState = () => {\n const [state, setState] = useState<DocumentVisibilityState>();\n\n useEffect(() => {\n const handleVisibilityChange = () => {\n setState(document.visibilityState);\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n };\n }, []);\n\n return state;\n};\n"],"names":["useRef","useEffect","useLayoutEffect","useCallback","useState","toggled"],"mappings":"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"}
1
+ {"version":3,"file":"react.cjs","sources":["../src/react/attach-refs.ts","../src/react/hooks/use-constant.ts","../src/react/hooks/use-abort-controller.ts","../src/react/hooks/use-abort-signal.ts","../src/react/hooks/use-sync-ref.ts","../src/react/hooks/use-event-listener.ts","../src/react/hooks/use-click-outside.ts","../src/react/hooks/use-define-ref.ts","../src/react/hooks/use-element-ref.ts","../src/react/hooks/use-event.ts","../src/react/hooks/use-flag.ts","../src/react/hooks/use-force-update.ts","../src/react/hooks/use-initial-height.ts","../src/react/hooks/use-instance.ts","../src/react/hooks/use-intersection-observer.ts","../src/react/hooks/use-last-defined-value.ts","../src/react/hooks/use-last-value-ref.ts","../src/react/hooks/use-life-cycle.ts","../src/react/hooks/use-resize-observer.ts","../src/react/hooks/use-toggle.ts","../src/react/hooks/use-value.ts","../src/react/hooks/use-visibility-state.ts"],"sourcesContent":["import type { LegacyRef, RefObject } from 'react';\nimport type { Maybe } from 'yummies/types';\n\nexport const attachRefs = <T>(\n value: T | null,\n ...refs: Maybe<RefObject<T> | RefObject<T | null> | LegacyRef<T>>[]\n) =>\n refs.forEach((ref) => {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref && typeof ref !== 'string') {\n // @ts-expect-error\n ref.current = value;\n }\n });\n","import { useRef } from 'react';\n\n/**\n * React hook for creating a value exactly once.\n * useMemo doesn't give this guarantee unfortunately -\n * https://reactjs.org/docs/hooks-faq.html#how-to-create-expensive-objects-lazily\n * https://reactjs.org/docs/hooks-reference.html#usememo\n * @param defineValue Function which returns defined value.\n */\nexport const useConstant = <T>(defineValue: () => T): T => {\n const ref = useRef<{ value: T }>();\n\n if (!ref.current) {\n ref.current = { value: defineValue() };\n }\n\n return ref.current.value;\n};\n","import { useEffect } from 'react';\n\nimport { useConstant } from './use-constant.js';\n\nexport const useAbortController = () => {\n const controller = useConstant(() => new AbortController());\n\n useEffect(() => {\n return () => {\n controller.abort();\n };\n }, []);\n\n return controller;\n};\n","import { useAbortController } from './use-abort-controller.js';\n\nexport const useAbortSignal = () => {\n return useAbortController().signal;\n};\n","import { useRef } from 'react';\n\nexport const useSyncRef = <T>(value: T) => {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n};\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { useEffect } from 'react';\nimport { useSyncRef } from './use-sync-ref.js';\n\nexport const useEventListener = <EventName extends keyof HTMLElementEventMap>({\n event,\n handler,\n options,\n deps = [],\n node = document,\n}: {\n event: EventName;\n handler: (e: HTMLElementEventMap[EventName]) => void;\n options?: boolean | AddEventListenerOptions;\n deps?: unknown[];\n node?: HTMLElement | Document | Window;\n}) => {\n const handlerRef = useSyncRef(handler);\n\n useEffect(() => {\n const handleEvent = (e: HTMLElementEventMap[EventName]) =>\n handlerRef.current(e);\n\n // @ts-expect-error\n node.addEventListener(event, handleEvent, options);\n // @ts-expect-error\n return () => node.removeEventListener(event, handleEvent, options);\n }, deps);\n};\n","import type { MutableRefObject } from 'react';\nimport { useEventListener } from './use-event-listener.js';\n\ntype ClickOutsideInput = {\n contentRef: MutableRefObject<HTMLElement | null>;\n onClick: VoidFunction;\n options?: AddEventListenerOptions;\n};\n\nexport const useClickOutside = ({\n contentRef,\n onClick,\n options,\n}: ClickOutsideInput) => {\n useEventListener({\n event: 'mousedown',\n handler: (event) => {\n if (\n contentRef.current &&\n !contentRef.current.contains(event.target as Node)\n ) {\n onClick();\n }\n },\n options,\n });\n};\n","import { type MutableRefObject, useRef } from 'react';\n\n/**\n * React hook for creating a value exactly once.\n * useMemo doesn't give this guarantee unfortunately -\n * https://reactjs.org/docs/hooks-faq.html#how-to-create-expensive-objects-lazily\n * https://reactjs.org/docs/hooks-reference.html#usememo\n * @param defineFn Function which returns defined value.\n */\nexport const useDefineRef = <T>(defineFn: () => T): MutableRefObject<T> => {\n const ref = useRef<T>(void 0 as T);\n\n if (!ref.current) {\n ref.current = defineFn();\n }\n\n return ref;\n};\n","import { useLayoutEffect, useRef } from 'react';\n\nexport const useElementRef = <T extends HTMLElement>(selector: () => T) => {\n const ref = useRef<T>();\n\n useLayoutEffect(() => {\n ref.current = selector();\n }, []);\n\n return ref;\n};\n","/**\n * A Hook to define an event handler with an always-stable function identity.\n *\n * borrowed from @gaeron\n * https://github.com/reactjs/rfcs/blob/useevent/text/0000-useevent.md\n */\nimport { useCallback, useLayoutEffect, useRef } from 'react';\nimport type { AnyFunction } from 'yummies/types';\n\nexport const useEvent = <H extends AnyFunction>(handler: H): H => {\n const handlerRef = useRef<H>(handler);\n\n // In a real implementation, this would run before layout effects\n useLayoutEffect(() => {\n handlerRef.current = handler;\n });\n\n return useCallback((...args: unknown[]) => {\n // In a real implementation, this would throw if called during render\n const fn = handlerRef.current as AnyFunction;\n return fn(...args);\n }, []) as unknown as H;\n};\n","import { useCallback, useRef, useState } from 'react';\n\nexport interface FlagHook {\n enabled: boolean;\n toggle: VoidFunction;\n enable: VoidFunction;\n disable: VoidFunction;\n}\n\nexport const useFlag = (defaultValue = false): FlagHook => {\n const [enabled, setEnabled] = useState(defaultValue);\n\n const toggle = useCallback(() => setEnabled((value) => !value), []);\n const enable = useCallback(() => setEnabled(true), []);\n const disable = useCallback(() => setEnabled(false), []);\n\n const flagObjRef = useRef<FlagHook>({\n enabled,\n toggle,\n enable,\n disable,\n });\n\n flagObjRef.current.enabled = enabled;\n\n return flagObjRef.current;\n};\n","import { useCallback, useState } from 'react';\n\nexport const useForceUpdate = () => {\n const [, setState] = useState<unknown>(null);\n\n return useCallback(() => {\n setState({});\n }, []);\n};\n","import { useEffect, useRef, useState } from 'react';\n\nexport const useInitialHeight = <T extends HTMLElement>() => {\n const ref = useRef<T | null>(null);\n const [initialHeight, setInitialHeight] = useState<number | undefined>(\n undefined,\n );\n\n useEffect(() => {\n if (ref.current && !initialHeight) {\n setInitialHeight(ref.current.offsetHeight);\n }\n }, [initialHeight]);\n\n return { ref, initialHeight };\n};\n","import { useLayoutEffect } from 'react';\nimport { useAbortSignal } from './use-abort-signal.js';\nimport { useConstant } from './use-constant.js';\n\nexport type InstanceCreateConfig<TPayload, TExtension = {}> = TExtension & {\n abortSignal: AbortSignal;\n payload: TPayload;\n};\n\nexport const createUseInstanceHook =\n <TExtension = {}>(extension?: TExtension) =>\n <TInstance, TPayload>(\n factory: (\n config: InstanceCreateConfig<NoInfer<TPayload>, TExtension>,\n ) => TInstance,\n config?: {\n payload?: TPayload;\n onUpdate?: (payload: TPayload) => void;\n },\n ) => {\n const abortSignal = useAbortSignal();\n\n const instance = useConstant(() =>\n factory({\n ...(extension as TExtension),\n abortSignal,\n payload: config?.payload as any,\n }),\n );\n\n useLayoutEffect(() => {\n config?.onUpdate?.(config.payload!);\n }, [config?.payload]);\n\n return instance;\n };\n\n/**\n * The `useInstance` hook is used to create and manage an instance of an object\n * that requires access to the root store and an abort signal.\n *\n * You can create YOUR OWN CUSTOM `useInstance` hook using `createUseInstanceHook` if you need\n * to provide some specific data\n *\n * @param factory - A factory function that takes a configuration and returns an instance.\n * @param config - An optional configuration containing additional input parameters and an update function.\n * @returns An instance created by the factory function.\n */\nexport const useInstance = createUseInstanceHook();\n","import { useEffect, useState } from 'react';\n\nexport const useIntersectionObserver = (\n callback: IntersectionObserverCallback,\n options?: IntersectionObserverInit,\n) => {\n const [intersectionObserver] = useState(\n () => new IntersectionObserver(callback, options),\n );\n\n useEffect(() => {\n return () => {\n intersectionObserver.disconnect();\n };\n }, []);\n\n return intersectionObserver;\n};\n","import { useRef } from 'react';\n\nexport const useLastDefinedValue = <T>(value: T) => {\n const ref = useRef(value);\n if (value != null) {\n ref.current = value;\n }\n return ref.current;\n};\n","import { useRef } from 'react';\n\nexport const useLastValueRef = <T>(value: T | null | undefined) => {\n const ref = useRef(value);\n\n if (value != null) {\n ref.current = value;\n }\n\n return ref;\n};\n","import { useEffect } from 'react';\nimport { useSyncRef } from './use-sync-ref.js';\n\nexport const useLifeCycle = (\n fn: () => {\n mount?: VoidFunction;\n unmount?: VoidFunction;\n },\n) => {\n const fnRef = useSyncRef(fn);\n\n useEffect(() => {\n const fnOperation = fnRef.current();\n fnOperation.mount?.();\n return fnOperation.unmount?.();\n }, []);\n};\n","import { useLayoutEffect } from 'react';\nimport { useDefineRef } from './use-define-ref.js';\n\nexport const useResizeObserver = (callback: ResizeObserverCallback) => {\n const resizeObserverRef = useDefineRef(() => new ResizeObserver(callback));\n\n useLayoutEffect(() => {\n return () => {\n resizeObserverRef.current.disconnect();\n };\n }, []);\n\n return resizeObserverRef;\n};\n","import { useCallback, useState } from 'react';\n\nexport const useToggle = (initialState?: boolean) => {\n const [toggled, setToggled] = useState(!!initialState);\n\n const toggle = useCallback(() => setToggled((toggled) => !toggled), []);\n\n return [toggled, toggle, setToggled] as const;\n};\n","import { useState } from 'react';\n\nexport const useValue = <T>(defaults: T | (() => T)) => {\n const [value, setValue] = useState<T>(defaults);\n\n return {\n value,\n set: setValue,\n };\n};\n","import { useEffect, useState } from 'react';\n\nexport const useVisibilityState = () => {\n const [state, setState] = useState<DocumentVisibilityState>();\n\n useEffect(() => {\n const handleVisibilityChange = () => {\n setState(document.visibilityState);\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n };\n }, []);\n\n return state;\n};\n"],"names":["useRef","useEffect","useLayoutEffect","useCallback","useState","toggled"],"mappings":"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"}
package/react.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  import * as react from 'react';
2
- import { MutableRefObject } from 'react';
3
- import { AnyFunction } from 'yummies/types';
2
+ import { RefObject, LegacyRef, MutableRefObject } from 'react';
3
+ import { Maybe, AnyFunction } from 'yummies/types';
4
+
5
+ declare const attachRefs: <T>(value: T | null, ...refs: Maybe<RefObject<T> | RefObject<T | null> | LegacyRef<T>>[]) => void;
4
6
 
5
7
  declare const useAbortController: () => AbortController;
6
8
 
@@ -109,5 +111,5 @@ declare const useValue: <T>(defaults: T | (() => T)) => {
109
111
 
110
112
  declare const useVisibilityState: () => DocumentVisibilityState | undefined;
111
113
 
112
- export { createUseInstanceHook, useAbortController, useAbortSignal, useClickOutside, useConstant, useDefineRef, useElementRef, useEvent, useEventListener, useFlag, useForceUpdate, useInitialHeight, useInstance, useIntersectionObserver, useLastDefinedValue, useLastValueRef, useLifeCycle, useResizeObserver, useSyncRef, useToggle, useValue, useVisibilityState };
114
+ export { attachRefs, createUseInstanceHook, useAbortController, useAbortSignal, useClickOutside, useConstant, useDefineRef, useElementRef, useEvent, useEventListener, useFlag, useForceUpdate, useInitialHeight, useInstance, useIntersectionObserver, useLastDefinedValue, useLastValueRef, useLifeCycle, useResizeObserver, useSyncRef, useToggle, useValue, useVisibilityState };
113
115
  export type { FlagHook, InstanceCreateConfig };
package/react.js CHANGED
@@ -1,4 +1,11 @@
1
1
  import { useRef, useEffect, useLayoutEffect, useCallback, useState } from "react";
2
+ const attachRefs = (value, ...refs) => refs.forEach((ref) => {
3
+ if (typeof ref === "function") {
4
+ ref(value);
5
+ } else if (ref && typeof ref !== "string") {
6
+ ref.current = value;
7
+ }
8
+ });
2
9
  const useConstant = (defineValue) => {
3
10
  const ref = useRef();
4
11
  if (!ref.current) {
@@ -191,6 +198,7 @@ const useVisibilityState = () => {
191
198
  return state;
192
199
  };
193
200
  export {
201
+ attachRefs,
194
202
  createUseInstanceHook,
195
203
  useAbortController,
196
204
  useAbortSignal,
package/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","sources":["../src/react/hooks/use-constant.ts","../src/react/hooks/use-abort-controller.ts","../src/react/hooks/use-abort-signal.ts","../src/react/hooks/use-sync-ref.ts","../src/react/hooks/use-event-listener.ts","../src/react/hooks/use-click-outside.ts","../src/react/hooks/use-define-ref.ts","../src/react/hooks/use-element-ref.ts","../src/react/hooks/use-event.ts","../src/react/hooks/use-flag.ts","../src/react/hooks/use-force-update.ts","../src/react/hooks/use-initial-height.ts","../src/react/hooks/use-instance.ts","../src/react/hooks/use-intersection-observer.ts","../src/react/hooks/use-last-defined-value.ts","../src/react/hooks/use-last-value-ref.ts","../src/react/hooks/use-life-cycle.ts","../src/react/hooks/use-resize-observer.ts","../src/react/hooks/use-toggle.ts","../src/react/hooks/use-value.ts","../src/react/hooks/use-visibility-state.ts"],"sourcesContent":["import { useRef } from 'react';\n\n/**\n * React hook for creating a value exactly once.\n * useMemo doesn't give this guarantee unfortunately -\n * https://reactjs.org/docs/hooks-faq.html#how-to-create-expensive-objects-lazily\n * https://reactjs.org/docs/hooks-reference.html#usememo\n * @param defineValue Function which returns defined value.\n */\nexport const useConstant = <T>(defineValue: () => T): T => {\n const ref = useRef<{ value: T }>();\n\n if (!ref.current) {\n ref.current = { value: defineValue() };\n }\n\n return ref.current.value;\n};\n","import { useEffect } from 'react';\n\nimport { useConstant } from './use-constant.js';\n\nexport const useAbortController = () => {\n const controller = useConstant(() => new AbortController());\n\n useEffect(() => {\n return () => {\n controller.abort();\n };\n }, []);\n\n return controller;\n};\n","import { useAbortController } from './use-abort-controller.js';\n\nexport const useAbortSignal = () => {\n return useAbortController().signal;\n};\n","import { useRef } from 'react';\n\nexport const useSyncRef = <T>(value: T) => {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n};\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { useEffect } from 'react';\nimport { useSyncRef } from './use-sync-ref.js';\n\nexport const useEventListener = <EventName extends keyof HTMLElementEventMap>({\n event,\n handler,\n options,\n deps = [],\n node = document,\n}: {\n event: EventName;\n handler: (e: HTMLElementEventMap[EventName]) => void;\n options?: boolean | AddEventListenerOptions;\n deps?: unknown[];\n node?: HTMLElement | Document | Window;\n}) => {\n const handlerRef = useSyncRef(handler);\n\n useEffect(() => {\n const handleEvent = (e: HTMLElementEventMap[EventName]) =>\n handlerRef.current(e);\n\n // @ts-expect-error\n node.addEventListener(event, handleEvent, options);\n // @ts-expect-error\n return () => node.removeEventListener(event, handleEvent, options);\n }, deps);\n};\n","import type { MutableRefObject } from 'react';\nimport { useEventListener } from './use-event-listener.js';\n\ntype ClickOutsideInput = {\n contentRef: MutableRefObject<HTMLElement | null>;\n onClick: VoidFunction;\n options?: AddEventListenerOptions;\n};\n\nexport const useClickOutside = ({\n contentRef,\n onClick,\n options,\n}: ClickOutsideInput) => {\n useEventListener({\n event: 'mousedown',\n handler: (event) => {\n if (\n contentRef.current &&\n !contentRef.current.contains(event.target as Node)\n ) {\n onClick();\n }\n },\n options,\n });\n};\n","import { type MutableRefObject, useRef } from 'react';\n\n/**\n * React hook for creating a value exactly once.\n * useMemo doesn't give this guarantee unfortunately -\n * https://reactjs.org/docs/hooks-faq.html#how-to-create-expensive-objects-lazily\n * https://reactjs.org/docs/hooks-reference.html#usememo\n * @param defineFn Function which returns defined value.\n */\nexport const useDefineRef = <T>(defineFn: () => T): MutableRefObject<T> => {\n const ref = useRef<T>(void 0 as T);\n\n if (!ref.current) {\n ref.current = defineFn();\n }\n\n return ref;\n};\n","import { useLayoutEffect, useRef } from 'react';\n\nexport const useElementRef = <T extends HTMLElement>(selector: () => T) => {\n const ref = useRef<T>();\n\n useLayoutEffect(() => {\n ref.current = selector();\n }, []);\n\n return ref;\n};\n","/**\n * A Hook to define an event handler with an always-stable function identity.\n *\n * borrowed from @gaeron\n * https://github.com/reactjs/rfcs/blob/useevent/text/0000-useevent.md\n */\nimport { useCallback, useLayoutEffect, useRef } from 'react';\nimport type { AnyFunction } from 'yummies/types';\n\nexport const useEvent = <H extends AnyFunction>(handler: H): H => {\n const handlerRef = useRef<H>(handler);\n\n // In a real implementation, this would run before layout effects\n useLayoutEffect(() => {\n handlerRef.current = handler;\n });\n\n return useCallback((...args: unknown[]) => {\n // In a real implementation, this would throw if called during render\n const fn = handlerRef.current as AnyFunction;\n return fn(...args);\n }, []) as unknown as H;\n};\n","import { useCallback, useRef, useState } from 'react';\n\nexport interface FlagHook {\n enabled: boolean;\n toggle: VoidFunction;\n enable: VoidFunction;\n disable: VoidFunction;\n}\n\nexport const useFlag = (defaultValue = false): FlagHook => {\n const [enabled, setEnabled] = useState(defaultValue);\n\n const toggle = useCallback(() => setEnabled((value) => !value), []);\n const enable = useCallback(() => setEnabled(true), []);\n const disable = useCallback(() => setEnabled(false), []);\n\n const flagObjRef = useRef<FlagHook>({\n enabled,\n toggle,\n enable,\n disable,\n });\n\n flagObjRef.current.enabled = enabled;\n\n return flagObjRef.current;\n};\n","import { useCallback, useState } from 'react';\n\nexport const useForceUpdate = () => {\n const [, setState] = useState<unknown>(null);\n\n return useCallback(() => {\n setState({});\n }, []);\n};\n","import { useEffect, useRef, useState } from 'react';\n\nexport const useInitialHeight = <T extends HTMLElement>() => {\n const ref = useRef<T | null>(null);\n const [initialHeight, setInitialHeight] = useState<number | undefined>(\n undefined,\n );\n\n useEffect(() => {\n if (ref.current && !initialHeight) {\n setInitialHeight(ref.current.offsetHeight);\n }\n }, [initialHeight]);\n\n return { ref, initialHeight };\n};\n","import { useLayoutEffect } from 'react';\nimport { useAbortSignal } from './use-abort-signal.js';\nimport { useConstant } from './use-constant.js';\n\nexport type InstanceCreateConfig<TPayload, TExtension = {}> = TExtension & {\n abortSignal: AbortSignal;\n payload: TPayload;\n};\n\nexport const createUseInstanceHook =\n <TExtension = {}>(extension?: TExtension) =>\n <TInstance, TPayload>(\n factory: (\n config: InstanceCreateConfig<NoInfer<TPayload>, TExtension>,\n ) => TInstance,\n config?: {\n payload?: TPayload;\n onUpdate?: (payload: TPayload) => void;\n },\n ) => {\n const abortSignal = useAbortSignal();\n\n const instance = useConstant(() =>\n factory({\n ...(extension as TExtension),\n abortSignal,\n payload: config?.payload as any,\n }),\n );\n\n useLayoutEffect(() => {\n config?.onUpdate?.(config.payload!);\n }, [config?.payload]);\n\n return instance;\n };\n\n/**\n * The `useInstance` hook is used to create and manage an instance of an object\n * that requires access to the root store and an abort signal.\n *\n * You can create YOUR OWN CUSTOM `useInstance` hook using `createUseInstanceHook` if you need\n * to provide some specific data\n *\n * @param factory - A factory function that takes a configuration and returns an instance.\n * @param config - An optional configuration containing additional input parameters and an update function.\n * @returns An instance created by the factory function.\n */\nexport const useInstance = createUseInstanceHook();\n","import { useEffect, useState } from 'react';\n\nexport const useIntersectionObserver = (\n callback: IntersectionObserverCallback,\n options?: IntersectionObserverInit,\n) => {\n const [intersectionObserver] = useState(\n () => new IntersectionObserver(callback, options),\n );\n\n useEffect(() => {\n return () => {\n intersectionObserver.disconnect();\n };\n }, []);\n\n return intersectionObserver;\n};\n","import { useRef } from 'react';\n\nexport const useLastDefinedValue = <T>(value: T) => {\n const ref = useRef(value);\n if (value != null) {\n ref.current = value;\n }\n return ref.current;\n};\n","import { useRef } from 'react';\n\nexport const useLastValueRef = <T>(value: T | null | undefined) => {\n const ref = useRef(value);\n\n if (value != null) {\n ref.current = value;\n }\n\n return ref;\n};\n","import { useEffect } from 'react';\nimport { useSyncRef } from './use-sync-ref.js';\n\nexport const useLifeCycle = (\n fn: () => {\n mount?: VoidFunction;\n unmount?: VoidFunction;\n },\n) => {\n const fnRef = useSyncRef(fn);\n\n useEffect(() => {\n const fnOperation = fnRef.current();\n fnOperation.mount?.();\n return fnOperation.unmount?.();\n }, []);\n};\n","import { useLayoutEffect } from 'react';\nimport { useDefineRef } from './use-define-ref.js';\n\nexport const useResizeObserver = (callback: ResizeObserverCallback) => {\n const resizeObserverRef = useDefineRef(() => new ResizeObserver(callback));\n\n useLayoutEffect(() => {\n return () => {\n resizeObserverRef.current.disconnect();\n };\n }, []);\n\n return resizeObserverRef;\n};\n","import { useCallback, useState } from 'react';\n\nexport const useToggle = (initialState?: boolean) => {\n const [toggled, setToggled] = useState(!!initialState);\n\n const toggle = useCallback(() => setToggled((toggled) => !toggled), []);\n\n return [toggled, toggle, setToggled] as const;\n};\n","import { useState } from 'react';\n\nexport const useValue = <T>(defaults: T | (() => T)) => {\n const [value, setValue] = useState<T>(defaults);\n\n return {\n value,\n set: setValue,\n };\n};\n","import { useEffect, useState } from 'react';\n\nexport const useVisibilityState = () => {\n const [state, setState] = useState<DocumentVisibilityState>();\n\n useEffect(() => {\n const handleVisibilityChange = () => {\n setState(document.visibilityState);\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n };\n }, []);\n\n return state;\n};\n"],"names":["toggled"],"mappings":"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"}
1
+ {"version":3,"file":"react.js","sources":["../src/react/attach-refs.ts","../src/react/hooks/use-constant.ts","../src/react/hooks/use-abort-controller.ts","../src/react/hooks/use-abort-signal.ts","../src/react/hooks/use-sync-ref.ts","../src/react/hooks/use-event-listener.ts","../src/react/hooks/use-click-outside.ts","../src/react/hooks/use-define-ref.ts","../src/react/hooks/use-element-ref.ts","../src/react/hooks/use-event.ts","../src/react/hooks/use-flag.ts","../src/react/hooks/use-force-update.ts","../src/react/hooks/use-initial-height.ts","../src/react/hooks/use-instance.ts","../src/react/hooks/use-intersection-observer.ts","../src/react/hooks/use-last-defined-value.ts","../src/react/hooks/use-last-value-ref.ts","../src/react/hooks/use-life-cycle.ts","../src/react/hooks/use-resize-observer.ts","../src/react/hooks/use-toggle.ts","../src/react/hooks/use-value.ts","../src/react/hooks/use-visibility-state.ts"],"sourcesContent":["import type { LegacyRef, RefObject } from 'react';\nimport type { Maybe } from 'yummies/types';\n\nexport const attachRefs = <T>(\n value: T | null,\n ...refs: Maybe<RefObject<T> | RefObject<T | null> | LegacyRef<T>>[]\n) =>\n refs.forEach((ref) => {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref && typeof ref !== 'string') {\n // @ts-expect-error\n ref.current = value;\n }\n });\n","import { useRef } from 'react';\n\n/**\n * React hook for creating a value exactly once.\n * useMemo doesn't give this guarantee unfortunately -\n * https://reactjs.org/docs/hooks-faq.html#how-to-create-expensive-objects-lazily\n * https://reactjs.org/docs/hooks-reference.html#usememo\n * @param defineValue Function which returns defined value.\n */\nexport const useConstant = <T>(defineValue: () => T): T => {\n const ref = useRef<{ value: T }>();\n\n if (!ref.current) {\n ref.current = { value: defineValue() };\n }\n\n return ref.current.value;\n};\n","import { useEffect } from 'react';\n\nimport { useConstant } from './use-constant.js';\n\nexport const useAbortController = () => {\n const controller = useConstant(() => new AbortController());\n\n useEffect(() => {\n return () => {\n controller.abort();\n };\n }, []);\n\n return controller;\n};\n","import { useAbortController } from './use-abort-controller.js';\n\nexport const useAbortSignal = () => {\n return useAbortController().signal;\n};\n","import { useRef } from 'react';\n\nexport const useSyncRef = <T>(value: T) => {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n};\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { useEffect } from 'react';\nimport { useSyncRef } from './use-sync-ref.js';\n\nexport const useEventListener = <EventName extends keyof HTMLElementEventMap>({\n event,\n handler,\n options,\n deps = [],\n node = document,\n}: {\n event: EventName;\n handler: (e: HTMLElementEventMap[EventName]) => void;\n options?: boolean | AddEventListenerOptions;\n deps?: unknown[];\n node?: HTMLElement | Document | Window;\n}) => {\n const handlerRef = useSyncRef(handler);\n\n useEffect(() => {\n const handleEvent = (e: HTMLElementEventMap[EventName]) =>\n handlerRef.current(e);\n\n // @ts-expect-error\n node.addEventListener(event, handleEvent, options);\n // @ts-expect-error\n return () => node.removeEventListener(event, handleEvent, options);\n }, deps);\n};\n","import type { MutableRefObject } from 'react';\nimport { useEventListener } from './use-event-listener.js';\n\ntype ClickOutsideInput = {\n contentRef: MutableRefObject<HTMLElement | null>;\n onClick: VoidFunction;\n options?: AddEventListenerOptions;\n};\n\nexport const useClickOutside = ({\n contentRef,\n onClick,\n options,\n}: ClickOutsideInput) => {\n useEventListener({\n event: 'mousedown',\n handler: (event) => {\n if (\n contentRef.current &&\n !contentRef.current.contains(event.target as Node)\n ) {\n onClick();\n }\n },\n options,\n });\n};\n","import { type MutableRefObject, useRef } from 'react';\n\n/**\n * React hook for creating a value exactly once.\n * useMemo doesn't give this guarantee unfortunately -\n * https://reactjs.org/docs/hooks-faq.html#how-to-create-expensive-objects-lazily\n * https://reactjs.org/docs/hooks-reference.html#usememo\n * @param defineFn Function which returns defined value.\n */\nexport const useDefineRef = <T>(defineFn: () => T): MutableRefObject<T> => {\n const ref = useRef<T>(void 0 as T);\n\n if (!ref.current) {\n ref.current = defineFn();\n }\n\n return ref;\n};\n","import { useLayoutEffect, useRef } from 'react';\n\nexport const useElementRef = <T extends HTMLElement>(selector: () => T) => {\n const ref = useRef<T>();\n\n useLayoutEffect(() => {\n ref.current = selector();\n }, []);\n\n return ref;\n};\n","/**\n * A Hook to define an event handler with an always-stable function identity.\n *\n * borrowed from @gaeron\n * https://github.com/reactjs/rfcs/blob/useevent/text/0000-useevent.md\n */\nimport { useCallback, useLayoutEffect, useRef } from 'react';\nimport type { AnyFunction } from 'yummies/types';\n\nexport const useEvent = <H extends AnyFunction>(handler: H): H => {\n const handlerRef = useRef<H>(handler);\n\n // In a real implementation, this would run before layout effects\n useLayoutEffect(() => {\n handlerRef.current = handler;\n });\n\n return useCallback((...args: unknown[]) => {\n // In a real implementation, this would throw if called during render\n const fn = handlerRef.current as AnyFunction;\n return fn(...args);\n }, []) as unknown as H;\n};\n","import { useCallback, useRef, useState } from 'react';\n\nexport interface FlagHook {\n enabled: boolean;\n toggle: VoidFunction;\n enable: VoidFunction;\n disable: VoidFunction;\n}\n\nexport const useFlag = (defaultValue = false): FlagHook => {\n const [enabled, setEnabled] = useState(defaultValue);\n\n const toggle = useCallback(() => setEnabled((value) => !value), []);\n const enable = useCallback(() => setEnabled(true), []);\n const disable = useCallback(() => setEnabled(false), []);\n\n const flagObjRef = useRef<FlagHook>({\n enabled,\n toggle,\n enable,\n disable,\n });\n\n flagObjRef.current.enabled = enabled;\n\n return flagObjRef.current;\n};\n","import { useCallback, useState } from 'react';\n\nexport const useForceUpdate = () => {\n const [, setState] = useState<unknown>(null);\n\n return useCallback(() => {\n setState({});\n }, []);\n};\n","import { useEffect, useRef, useState } from 'react';\n\nexport const useInitialHeight = <T extends HTMLElement>() => {\n const ref = useRef<T | null>(null);\n const [initialHeight, setInitialHeight] = useState<number | undefined>(\n undefined,\n );\n\n useEffect(() => {\n if (ref.current && !initialHeight) {\n setInitialHeight(ref.current.offsetHeight);\n }\n }, [initialHeight]);\n\n return { ref, initialHeight };\n};\n","import { useLayoutEffect } from 'react';\nimport { useAbortSignal } from './use-abort-signal.js';\nimport { useConstant } from './use-constant.js';\n\nexport type InstanceCreateConfig<TPayload, TExtension = {}> = TExtension & {\n abortSignal: AbortSignal;\n payload: TPayload;\n};\n\nexport const createUseInstanceHook =\n <TExtension = {}>(extension?: TExtension) =>\n <TInstance, TPayload>(\n factory: (\n config: InstanceCreateConfig<NoInfer<TPayload>, TExtension>,\n ) => TInstance,\n config?: {\n payload?: TPayload;\n onUpdate?: (payload: TPayload) => void;\n },\n ) => {\n const abortSignal = useAbortSignal();\n\n const instance = useConstant(() =>\n factory({\n ...(extension as TExtension),\n abortSignal,\n payload: config?.payload as any,\n }),\n );\n\n useLayoutEffect(() => {\n config?.onUpdate?.(config.payload!);\n }, [config?.payload]);\n\n return instance;\n };\n\n/**\n * The `useInstance` hook is used to create and manage an instance of an object\n * that requires access to the root store and an abort signal.\n *\n * You can create YOUR OWN CUSTOM `useInstance` hook using `createUseInstanceHook` if you need\n * to provide some specific data\n *\n * @param factory - A factory function that takes a configuration and returns an instance.\n * @param config - An optional configuration containing additional input parameters and an update function.\n * @returns An instance created by the factory function.\n */\nexport const useInstance = createUseInstanceHook();\n","import { useEffect, useState } from 'react';\n\nexport const useIntersectionObserver = (\n callback: IntersectionObserverCallback,\n options?: IntersectionObserverInit,\n) => {\n const [intersectionObserver] = useState(\n () => new IntersectionObserver(callback, options),\n );\n\n useEffect(() => {\n return () => {\n intersectionObserver.disconnect();\n };\n }, []);\n\n return intersectionObserver;\n};\n","import { useRef } from 'react';\n\nexport const useLastDefinedValue = <T>(value: T) => {\n const ref = useRef(value);\n if (value != null) {\n ref.current = value;\n }\n return ref.current;\n};\n","import { useRef } from 'react';\n\nexport const useLastValueRef = <T>(value: T | null | undefined) => {\n const ref = useRef(value);\n\n if (value != null) {\n ref.current = value;\n }\n\n return ref;\n};\n","import { useEffect } from 'react';\nimport { useSyncRef } from './use-sync-ref.js';\n\nexport const useLifeCycle = (\n fn: () => {\n mount?: VoidFunction;\n unmount?: VoidFunction;\n },\n) => {\n const fnRef = useSyncRef(fn);\n\n useEffect(() => {\n const fnOperation = fnRef.current();\n fnOperation.mount?.();\n return fnOperation.unmount?.();\n }, []);\n};\n","import { useLayoutEffect } from 'react';\nimport { useDefineRef } from './use-define-ref.js';\n\nexport const useResizeObserver = (callback: ResizeObserverCallback) => {\n const resizeObserverRef = useDefineRef(() => new ResizeObserver(callback));\n\n useLayoutEffect(() => {\n return () => {\n resizeObserverRef.current.disconnect();\n };\n }, []);\n\n return resizeObserverRef;\n};\n","import { useCallback, useState } from 'react';\n\nexport const useToggle = (initialState?: boolean) => {\n const [toggled, setToggled] = useState(!!initialState);\n\n const toggle = useCallback(() => setToggled((toggled) => !toggled), []);\n\n return [toggled, toggle, setToggled] as const;\n};\n","import { useState } from 'react';\n\nexport const useValue = <T>(defaults: T | (() => T)) => {\n const [value, setValue] = useState<T>(defaults);\n\n return {\n value,\n set: setValue,\n };\n};\n","import { useEffect, useState } from 'react';\n\nexport const useVisibilityState = () => {\n const [state, setState] = useState<DocumentVisibilityState>();\n\n useEffect(() => {\n const handleVisibilityChange = () => {\n setState(document.visibilityState);\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n };\n }, []);\n\n return state;\n};\n"],"names":["toggled"],"mappings":"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"}