@seznam/compose-react-refs
Advanced tools
| import {MutableRefObject, Ref} from 'react' | ||
| type OptionalRef<T> = Ref<T> | undefined | ||
| export default function composeRefs<T>(...refs: [OptionalRef<T>, OptionalRef<T>, ...Array<OptionalRef<T>>]): Ref<T> { | ||
| if (refs.length === 2) { // micro-optimize the hot path | ||
| return composeTwoRefs(refs[0], refs[1]) || null | ||
| } | ||
| const composedRef = refs.slice(1).reduce( | ||
| (semiCombinedRef: OptionalRef<T>, refToInclude: OptionalRef<T>) => composeTwoRefs(semiCombinedRef, refToInclude), | ||
| refs[0], | ||
| ) | ||
| return composedRef || null | ||
| } | ||
| type NonNullRef<T> = NonNullable<Ref<T>> | ||
| const composedRefCache = new WeakMap<NonNullRef<unknown>, WeakMap<NonNullRef<unknown>, NonNullRef<unknown>>>() | ||
| function composeTwoRefs<T>(ref1: OptionalRef<T>, ref2: OptionalRef<T>): OptionalRef<T> { | ||
| if (ref1 && ref2) { | ||
| const ref1Cache = composedRefCache.get(ref1) || new WeakMap<NonNullRef<unknown>, NonNullRef<unknown>>() | ||
| composedRefCache.set(ref1, ref1Cache) | ||
| const composedRef = ref1Cache.get(ref2) || ((instance: T): void => { | ||
| updateRef(ref1, instance) | ||
| updateRef(ref2, instance) | ||
| }) | ||
| ref1Cache.set(ref2, composedRef) | ||
| return composedRef as NonNullRef<T> | ||
| } | ||
| if (!ref1) { | ||
| return ref2 | ||
| } else { | ||
| return ref1 | ||
| } | ||
| } | ||
| function updateRef<T>(ref: NonNullRef<T>, instance: null | T): void { | ||
| if (typeof ref === 'function') { | ||
| ref(instance) | ||
| } else { | ||
| (ref as MutableRefObject<T | null>).current = instance | ||
| } | ||
| } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"composeRefs.d.ts","sourceRoot":"","sources":["../composeRefs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,GAAG,EAAC,MAAM,OAAO,CAAA;AAE3C,aAAK,WAAW,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;AAExC,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAUlH"} | ||
| {"version":3,"file":"composeRefs.d.ts","sourceRoot":"./","sources":["composeRefs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,GAAG,EAAC,MAAM,OAAO,CAAA;AAE3C,aAAK,WAAW,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;AAExC,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAUlH"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"composeRefs.js","sourceRoot":"","sources":["../composeRefs.ts"],"names":[],"mappings":";;AAIA,SAAwB,WAAW;IAAI,cAAmE;SAAnE,UAAmE,EAAnE,qBAAmE,EAAnE,IAAmE;QAAnE,yBAAmE;;IACxG,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,8BAA8B;QACrD,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;KAChD;IAED,IAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CACtC,UAAC,eAA+B,EAAE,YAA4B,IAAK,OAAA,cAAc,CAAC,eAAe,EAAE,YAAY,CAAC,EAA7C,CAA6C,EAChH,IAAI,CAAC,CAAC,CAAC,CACR,CAAA;IACD,OAAO,WAAW,IAAI,IAAI,CAAA;AAC5B,CAAC;AAVD,8BAUC;AAGD,IAAM,gBAAgB,GAAG,IAAI,OAAO,EAA0E,CAAA;AAE9G,SAAS,cAAc,CAAI,IAAoB,EAAE,IAAoB;IACnE,IAAI,IAAI,IAAI,IAAI,EAAE;QAChB,IAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,EAA4C,CAAA;QACvG,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QAErC,IAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAC,QAAW;YACtD,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;YACzB,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAC3B,CAAC,CAAC,CAAA;QACF,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;QAEhC,OAAO,WAA4B,CAAA;KACpC;IAED,IAAI,CAAC,IAAI,EAAE;QACT,OAAO,IAAI,CAAA;KACZ;SAAM;QACL,OAAO,IAAI,CAAA;KACZ;AACH,CAAC;AAED,SAAS,SAAS,CAAI,GAAkB,EAAE,QAAkB;IAC1D,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE;QAC7B,GAAG,CAAC,QAAQ,CAAC,CAAA;KACd;SAAM;QACJ,GAAkC,CAAC,OAAO,GAAG,QAAQ,CAAA;KACvD;AACH,CAAC"} | ||
| {"version":3,"file":"composeRefs.js","sourceRoot":"./","sources":["composeRefs.ts"],"names":[],"mappings":";;AAIA,SAAwB,WAAW;IAAI,cAAmE;SAAnE,UAAmE,EAAnE,qBAAmE,EAAnE,IAAmE;QAAnE,yBAAmE;;IACxG,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,8BAA8B;QACrD,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;KAChD;IAED,IAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CACtC,UAAC,eAA+B,EAAE,YAA4B,IAAK,OAAA,cAAc,CAAC,eAAe,EAAE,YAAY,CAAC,EAA7C,CAA6C,EAChH,IAAI,CAAC,CAAC,CAAC,CACR,CAAA;IACD,OAAO,WAAW,IAAI,IAAI,CAAA;AAC5B,CAAC;AAVD,8BAUC;AAGD,IAAM,gBAAgB,GAAG,IAAI,OAAO,EAA0E,CAAA;AAE9G,SAAS,cAAc,CAAI,IAAoB,EAAE,IAAoB;IACnE,IAAI,IAAI,IAAI,IAAI,EAAE;QAChB,IAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,EAA4C,CAAA;QACvG,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QAErC,IAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAC,QAAW;YACtD,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;YACzB,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAC3B,CAAC,CAAC,CAAA;QACF,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;QAEhC,OAAO,WAA4B,CAAA;KACpC;IAED,IAAI,CAAC,IAAI,EAAE;QACT,OAAO,IAAI,CAAA;KACZ;SAAM;QACL,OAAO,IAAI,CAAA;KACZ;AACH,CAAC;AAED,SAAS,SAAS,CAAI,GAAkB,EAAE,QAAkB;IAC1D,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE;QAC7B,GAAG,CAAC,QAAQ,CAAC,CAAA;KACd;SAAM;QACJ,GAAkC,CAAC,OAAO,GAAG,QAAQ,CAAA;KACvD;AACH,CAAC"} |
+2
-2
| { | ||
| "name": "@seznam/compose-react-refs", | ||
| "version": "1.0.4", | ||
| "version": "1.0.5", | ||
| "description": "A simple utility for composing two or more react refs into a single callback ref.", | ||
| "main": "composeRefs.js", | ||
| "scripts": { | ||
| "build": "rm -rf dist/ && npm test && npm run compile && cp LICENSE package.json README.md dist/", | ||
| "build": "rm -rf dist/ && npm test && npm run compile && cp LICENSE package.json README.md composeRefs.ts dist/", | ||
| "compile": "tsc --project .", | ||
@@ -9,0 +9,0 @@ "prepublishOnly": "echo 'Run \\'npm run publish-package\\' instead' && exit 1", |
9456
18.11%8
14.29%83
84.44%