@zayne-labs/toolkit-react 0.8.24 → 0.8.25

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.
@@ -23,7 +23,7 @@ declare const getSlotElement: <TProps>(children: React.ReactNode, SlotWrapper: R
23
23
  declare const getOtherChildren: <TProps, TChildren extends React.ReactNode = react.ReactNode>(children: TChildren, SlotWrapperOrWrappers: Array<React.FunctionComponent<TProps>> | React.FunctionComponent<TProps>) => TChildren extends unknown[] ? TChildren : TChildren[];
24
24
 
25
25
  type UnknownProps = Record<string, unknown>;
26
- declare const mergeProps: (slotProps: UnknownProps | undefined, childProps: UnknownProps | undefined) => UnknownProps;
26
+ declare const mergeProps: <TProps extends UnknownProps>(slotProps: TProps | undefined, childProps: TProps | undefined) => TProps;
27
27
 
28
28
  type ForwardedRefType<TComponent extends HTMLElement | React.ElementType> = TComponent extends React.ElementType ? React.ForwardedRef<React.Ref<TComponent>> : React.ForwardedRef<TComponent>;
29
29
  type InferProps<TComponent extends HTMLElement | React.ElementType> = TComponent extends React.ElementType ? React.ComponentPropsWithRef<TComponent> : React.HTMLAttributes<TComponent>;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/composeRefs.ts","../../../src/utils/getSlotElement.ts","../../../src/utils/mergeProps.ts"],"names":["isFunction"],"mappings":"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","file":"index.js","sourcesContent":["import { isFunction } from \"@zayne-labs/toolkit-type-helpers\";\nimport type { RefCallback } from \"react\";\n\ntype PossibleRef<TRef> = React.Ref<TRef> | undefined;\n\n/**\n * @description Set a given ref to a given value.\n *\n * This utility takes care of different types of refs: callback refs and RefObject(s)\n */\nexport const setRef = <TRef>(ref: PossibleRef<TRef>, node: TRef): ReturnType<RefCallback<TRef>> => {\n\tif (!ref) return;\n\n\tif (isFunction(ref)) {\n\t\treturn ref(node);\n\t}\n\n\t// eslint-disable-next-line no-param-reassign -- Mutation is needed here\n\tref.current = node;\n};\n\n/**\n * @description A utility to combine refs. Accepts callback refs and RefObject(s)\n */\nexport const composeRefs = <TRef>(refs: Array<PossibleRef<TRef>>) => {\n\tconst refCallBack: RefCallback<TRef> = (node) => {\n\t\tconst cleanupFnArray = refs.map((ref) => setRef(ref, node));\n\n\t\tconst cleanupFn = () => cleanupFnArray.forEach((cleanup) => cleanup?.());\n\n\t\t// == React 18 may not call the cleanup function so we need to call it manually on element unmount\n\t\tif (!node) {\n\t\t\tcleanupFn();\n\t\t\treturn;\n\t\t}\n\n\t\treturn cleanupFn;\n\t};\n\n\treturn refCallBack;\n};\n","import { toArray } from \"@zayne-labs/toolkit-core\";\nimport { AssertionError, isArray } from \"@zayne-labs/toolkit-type-helpers\";\nimport { isValidElement } from \"react\";\n\ntype Noop = () => void;\ntype WithSlot = { slot?: string };\n\n// TODO - Add support for thing like <div slot=\"foo\"> OR <Slot name=\"foo\">\nexport const isSlotElement = <TProps>(\n\tchild: React.ReactNode,\n\tSlotWrapper: React.FunctionComponent<TProps>\n) => {\n\tif (!isValidElement(child)) {\n\t\treturn false;\n\t}\n\n\tif ((child.type as WithSlot).slot === (SlotWrapper as WithSlot).slot) {\n\t\treturn true;\n\t}\n\n\tif ((child.type as Noop).name === (SlotWrapper as Noop).name) {\n\t\treturn true;\n\t}\n\n\tif (child.type === SlotWrapper) {\n\t\treturn true;\n\t}\n\n\treturn child.type.toString() === SlotWrapper.toString();\n};\n\ntype SlotOptions = {\n\terrorMessage?: string;\n\tthrowOnMultipleSlotMatch?: boolean;\n};\n\nexport const getSlotElement = <TProps>(\n\tchildren: React.ReactNode,\n\tSlotWrapper: React.FunctionComponent<TProps>,\n\toptions: SlotOptions = {}\n) => {\n\tconst {\n\t\terrorMessage = \"Only one instance of the SlotComponent is allowed\",\n\t\tthrowOnMultipleSlotMatch = false,\n\t} = options;\n\n\tconst childrenArray = toArray<React.ReactNode>(children);\n\n\tconst Slot = childrenArray.filter((child) => isSlotElement(child, SlotWrapper));\n\n\tif (throwOnMultipleSlotMatch && Slot.length > 1) {\n\t\tthrow new AssertionError(errorMessage);\n\t}\n\n\treturn Slot[0] as React.ReactElement<TProps> | undefined;\n};\n\nconst isSlotElementMultiple = <TProps>(\n\tchild: React.ReactNode,\n\tSlotWrapperArray: Array<React.FunctionComponent<TProps>>\n) => SlotWrapperArray.some((slotWrapper) => isSlotElement(child, slotWrapper));\n\n// Check if the child is a Slot element by matching any in the SlotWrapperArray\nexport const getOtherChildren = <TProps, TChildren extends React.ReactNode = React.ReactNode>(\n\tchildren: TChildren,\n\tSlotWrapperOrWrappers: Array<React.FunctionComponent<TProps>> | React.FunctionComponent<TProps>\n) => {\n\tconst childrenArray = toArray<TChildren>(children);\n\n\tconst otherChildren = isArray(SlotWrapperOrWrappers)\n\t\t? childrenArray.filter((child) => !isSlotElementMultiple(child, SlotWrapperOrWrappers))\n\t\t: childrenArray.filter((child) => !isSlotElement(child, SlotWrapperOrWrappers));\n\n\treturn otherChildren as TChildren extends unknown[] ? TChildren : TChildren[];\n};\n","import { isFunction, isPlainObject } from \"@zayne-labs/toolkit-type-helpers\";\n\ntype UnknownProps = Record<string, unknown>;\n\nconst mergeProps = (\n\tslotProps: UnknownProps | undefined,\n\tchildProps: UnknownProps | undefined\n): UnknownProps => {\n\tif (!slotProps || !childProps) {\n\t\treturn childProps ?? slotProps ?? {};\n\t}\n\n\t// == all child props should override slotProps\n\tconst overrideProps = { ...childProps };\n\n\tfor (const propName of Object.keys(slotProps)) {\n\t\tconst slotPropValue = slotProps[propName];\n\t\tconst childPropValue = childProps[propName];\n\n\t\t// == if it's `style`, we merge them\n\t\tif (propName === \"style\" && isPlainObject(slotPropValue) && isPlainObject(childPropValue)) {\n\t\t\toverrideProps[propName] = { ...slotPropValue, ...childPropValue };\n\t\t}\n\n\t\tif (propName === \"className\" || propName === \"class\") {\n\t\t\toverrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(\" \");\n\t\t}\n\n\t\tconst isHandler = propName.startsWith(\"on\");\n\n\t\tif (!isHandler) continue;\n\n\t\t// == if the handler exists on both, we compose them\n\t\tif (isFunction(slotPropValue) && isFunction(childPropValue)) {\n\t\t\toverrideProps[propName] = (...args: unknown[]) => {\n\t\t\t\tchildPropValue(...args);\n\t\t\t\tslotPropValue(...args);\n\t\t\t};\n\t\t}\n\n\t\t// == but if it exists only on the slot, we use only that one\n\t\tif (isFunction(slotPropValue)) {\n\t\t\toverrideProps[propName] = slotPropValue;\n\t\t}\n\t}\n\n\treturn { ...slotProps, ...overrideProps };\n};\n\nexport { mergeProps };\n"]}
1
+ {"version":3,"sources":["../../../src/utils/composeRefs.ts","../../../src/utils/getSlotElement.ts","../../../src/utils/mergeProps.ts"],"names":["isFunction"],"mappings":"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","file":"index.js","sourcesContent":["import { isFunction } from \"@zayne-labs/toolkit-type-helpers\";\nimport type { RefCallback } from \"react\";\n\ntype PossibleRef<TRef> = React.Ref<TRef> | undefined;\n\n/**\n * @description Set a given ref to a given value.\n *\n * This utility takes care of different types of refs: callback refs and RefObject(s)\n */\nexport const setRef = <TRef>(ref: PossibleRef<TRef>, node: TRef): ReturnType<RefCallback<TRef>> => {\n\tif (!ref) return;\n\n\tif (isFunction(ref)) {\n\t\treturn ref(node);\n\t}\n\n\t// eslint-disable-next-line no-param-reassign -- Mutation is needed here\n\tref.current = node;\n};\n\n/**\n * @description A utility to combine refs. Accepts callback refs and RefObject(s)\n */\nexport const composeRefs = <TRef>(refs: Array<PossibleRef<TRef>>) => {\n\tconst refCallBack: RefCallback<TRef> = (node) => {\n\t\tconst cleanupFnArray = refs.map((ref) => setRef(ref, node));\n\n\t\tconst cleanupFn = () => cleanupFnArray.forEach((cleanup) => cleanup?.());\n\n\t\t// == React 18 may not call the cleanup function so we need to call it manually on element unmount\n\t\tif (!node) {\n\t\t\tcleanupFn();\n\t\t\treturn;\n\t\t}\n\n\t\treturn cleanupFn;\n\t};\n\n\treturn refCallBack;\n};\n","import { toArray } from \"@zayne-labs/toolkit-core\";\nimport { AssertionError, isArray } from \"@zayne-labs/toolkit-type-helpers\";\nimport { isValidElement } from \"react\";\n\ntype Noop = () => void;\ntype WithSlot = { slot?: string };\n\n// TODO - Add support for thing like <div slot=\"foo\"> OR <Slot name=\"foo\">\nexport const isSlotElement = <TProps>(\n\tchild: React.ReactNode,\n\tSlotWrapper: React.FunctionComponent<TProps>\n) => {\n\tif (!isValidElement(child)) {\n\t\treturn false;\n\t}\n\n\tif ((child.type as WithSlot).slot === (SlotWrapper as WithSlot).slot) {\n\t\treturn true;\n\t}\n\n\tif ((child.type as Noop).name === (SlotWrapper as Noop).name) {\n\t\treturn true;\n\t}\n\n\tif (child.type === SlotWrapper) {\n\t\treturn true;\n\t}\n\n\treturn child.type.toString() === SlotWrapper.toString();\n};\n\ntype SlotOptions = {\n\terrorMessage?: string;\n\tthrowOnMultipleSlotMatch?: boolean;\n};\n\nexport const getSlotElement = <TProps>(\n\tchildren: React.ReactNode,\n\tSlotWrapper: React.FunctionComponent<TProps>,\n\toptions: SlotOptions = {}\n) => {\n\tconst {\n\t\terrorMessage = \"Only one instance of the SlotComponent is allowed\",\n\t\tthrowOnMultipleSlotMatch = false,\n\t} = options;\n\n\tconst childrenArray = toArray<React.ReactNode>(children);\n\n\tconst Slot = childrenArray.filter((child) => isSlotElement(child, SlotWrapper));\n\n\tif (throwOnMultipleSlotMatch && Slot.length > 1) {\n\t\tthrow new AssertionError(errorMessage);\n\t}\n\n\treturn Slot[0] as React.ReactElement<TProps> | undefined;\n};\n\nconst isSlotElementMultiple = <TProps>(\n\tchild: React.ReactNode,\n\tSlotWrapperArray: Array<React.FunctionComponent<TProps>>\n) => SlotWrapperArray.some((slotWrapper) => isSlotElement(child, slotWrapper));\n\n// Check if the child is a Slot element by matching any in the SlotWrapperArray\nexport const getOtherChildren = <TProps, TChildren extends React.ReactNode = React.ReactNode>(\n\tchildren: TChildren,\n\tSlotWrapperOrWrappers: Array<React.FunctionComponent<TProps>> | React.FunctionComponent<TProps>\n) => {\n\tconst childrenArray = toArray<TChildren>(children);\n\n\tconst otherChildren = isArray(SlotWrapperOrWrappers)\n\t\t? childrenArray.filter((child) => !isSlotElementMultiple(child, SlotWrapperOrWrappers))\n\t\t: childrenArray.filter((child) => !isSlotElement(child, SlotWrapperOrWrappers));\n\n\treturn otherChildren as TChildren extends unknown[] ? TChildren : TChildren[];\n};\n","import { isFunction, isPlainObject } from \"@zayne-labs/toolkit-type-helpers\";\n\ntype UnknownProps = Record<string, unknown>;\n\nconst mergeProps = <TProps extends UnknownProps>(\n\tslotProps: TProps | undefined,\n\tchildProps: TProps | undefined\n): TProps => {\n\tif (!slotProps || !childProps) {\n\t\treturn childProps ?? slotProps ?? ({} as TProps);\n\t}\n\n\t// == all child props should override slotProps\n\tconst overrideProps = { ...childProps } as UnknownProps;\n\n\tfor (const propName of Object.keys(slotProps)) {\n\t\tconst slotPropValue = slotProps[propName];\n\t\tconst childPropValue = childProps[propName];\n\n\t\t// == if it's `style`, we merge them\n\t\tif (propName === \"style\" && isPlainObject(slotPropValue) && isPlainObject(childPropValue)) {\n\t\t\toverrideProps[propName] = { ...slotPropValue, ...childPropValue };\n\t\t}\n\n\t\tif (propName === \"className\" || propName === \"class\") {\n\t\t\toverrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(\" \");\n\t\t}\n\n\t\tconst isHandler = propName.startsWith(\"on\");\n\n\t\tif (!isHandler) continue;\n\n\t\t// == if the handler exists on both, we compose them\n\t\tif (isFunction(slotPropValue) && isFunction(childPropValue)) {\n\t\t\toverrideProps[propName] = (...args: unknown[]) => {\n\t\t\t\tchildPropValue(...args);\n\t\t\t\tslotPropValue(...args);\n\t\t\t};\n\t\t}\n\n\t\t// == but if it exists only on the slot, we use only that one\n\t\tif (isFunction(slotPropValue)) {\n\t\t\toverrideProps[propName] = slotPropValue;\n\t\t}\n\t}\n\n\treturn { ...slotProps, ...overrideProps };\n};\n\nexport { mergeProps };\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zayne-labs/toolkit-react",
3
3
  "type": "module",
4
- "version": "0.8.24",
4
+ "version": "0.8.25",
5
5
  "description": "A collection of utility functions, types and composables used by my other projects. Nothing too fancy but can be useful.",
6
6
  "author": "Ryan Zayne",
7
7
  "license": "MIT",
@@ -50,8 +50,8 @@
50
50
  }
51
51
  },
52
52
  "dependencies": {
53
- "@zayne-labs/toolkit-core": "0.8.24",
54
- "@zayne-labs/toolkit-type-helpers": "0.8.24"
53
+ "@zayne-labs/toolkit-core": "0.8.25",
54
+ "@zayne-labs/toolkit-type-helpers": "0.8.25"
55
55
  },
56
56
  "devDependencies": {
57
57
  "@arethetypeswrong/cli": "^0.17.2",