isomorfeus-preact 10.5.8 → 10.6.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.
- checksums.yaml +4 -4
- data/README.md +12 -11
- data/lib/isomorfeus/preact_view_helper.rb +2 -2
- data/lib/nano_css.rb +1 -1
- data/lib/preact/component/native_component_constructor.rb +2 -2
- data/lib/preact/version.rb +1 -1
- data/node_modules/.package-lock.json +6 -6
- data/node_modules/preact/compat/dist/compat.js +1 -1
- data/node_modules/preact/compat/dist/compat.js.map +1 -1
- data/node_modules/preact/compat/dist/compat.mjs +1 -1
- data/node_modules/preact/compat/dist/compat.mjs.map +1 -1
- data/node_modules/preact/compat/dist/compat.module.js +1 -1
- data/node_modules/preact/compat/dist/compat.module.js.map +1 -1
- data/node_modules/preact/compat/dist/compat.umd.js +1 -1
- data/node_modules/preact/compat/dist/compat.umd.js.map +1 -1
- data/node_modules/preact/compat/src/index.d.ts +2 -1
- data/node_modules/preact/compat/src/render.js +15 -8
- data/node_modules/preact/debug/dist/debug.js.map +1 -1
- data/node_modules/preact/debug/dist/debug.mjs.map +1 -1
- data/node_modules/preact/debug/dist/debug.module.js.map +1 -1
- data/node_modules/preact/debug/dist/debug.umd.js.map +1 -1
- data/node_modules/preact/devtools/dist/devtools.js +1 -1
- data/node_modules/preact/devtools/dist/devtools.js.map +1 -1
- data/node_modules/preact/devtools/dist/devtools.mjs +1 -1
- data/node_modules/preact/devtools/dist/devtools.mjs.map +1 -1
- data/node_modules/preact/devtools/dist/devtools.module.js +1 -1
- data/node_modules/preact/devtools/dist/devtools.module.js.map +1 -1
- data/node_modules/preact/devtools/dist/devtools.umd.js +1 -1
- data/node_modules/preact/devtools/dist/devtools.umd.js.map +1 -1
- data/node_modules/preact/devtools/src/devtools.js +1 -1
- data/node_modules/preact/dist/index.d.ts +1295 -0
- data/node_modules/preact/dist/preact.js +1 -1
- data/node_modules/preact/dist/preact.js.map +1 -1
- data/node_modules/preact/dist/preact.min.js +1 -1
- data/node_modules/preact/dist/preact.min.js.map +1 -1
- data/node_modules/preact/dist/preact.mjs +1 -1
- data/node_modules/preact/dist/preact.mjs.map +1 -1
- data/node_modules/preact/dist/preact.module.js +1 -1
- data/node_modules/preact/dist/preact.module.js.map +1 -1
- data/node_modules/preact/dist/preact.umd.js +1 -1
- data/node_modules/preact/dist/preact.umd.js.map +1 -1
- data/node_modules/preact/hooks/dist/hooks.js +1 -1
- data/node_modules/preact/hooks/dist/hooks.js.map +1 -1
- data/node_modules/preact/hooks/dist/hooks.mjs +1 -1
- data/node_modules/preact/hooks/dist/hooks.mjs.map +1 -1
- data/node_modules/preact/hooks/dist/hooks.module.js +1 -1
- data/node_modules/preact/hooks/dist/hooks.module.js.map +1 -1
- data/node_modules/preact/hooks/dist/hooks.umd.js +1 -1
- data/node_modules/preact/hooks/dist/hooks.umd.js.map +1 -1
- data/node_modules/preact/hooks/src/index.d.ts +12 -6
- data/node_modules/preact/hooks/src/index.js +1 -8
- data/node_modules/preact/jsx-runtime/dist/jsxRuntime.mjs.map +1 -0
- data/node_modules/preact/package.json +19 -8
- data/node_modules/preact/src/create-element.js +2 -1
- data/node_modules/preact/src/diff/children.js +7 -19
- data/node_modules/preact/src/diff/index.js +5 -3
- data/node_modules/preact/src/index.d.ts +1 -1
- data/node_modules/preact/src/jsx.d.ts +45 -2
- data/node_modules/preact/test-utils/dist/testUtils.mjs.map +1 -1
- data/node_modules/wouter-preact/cjs/index.js +1 -1
- data/node_modules/wouter-preact/cjs/use-location.js +6 -6
- data/node_modules/wouter-preact/index.js +1 -1
- data/node_modules/wouter-preact/package.json +1 -1
- data/node_modules/wouter-preact/use-location.js +6 -6
- data/package.json +2 -2
- metadata +27 -30
- data/node_modules/preact/compat/LICENSE +0 -21
- data/node_modules/preact/debug/LICENSE +0 -21
- data/node_modules/preact/devtools/LICENSE +0 -21
- data/node_modules/preact/hooks/LICENSE +0 -21
- data/node_modules/preact/jsx-runtime/LICENSE +0 -21
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"hooks.module.js","sources":["../src/index.js"],"sourcesContent":["import { options } from 'preact';\n\n/** @type {number} */\nlet currentIndex;\n\n/** @type {import('./internal').Component} */\nlet currentComponent;\n/**\n * Keep track of the previous component so that we can set\n * `currentComponent` to `null` and throw when a hook is invoked\n * outside of render\n * @type {import('./internal').Component}\n */\nlet previousComponent;\n\n/** @type {number} */\nlet currentHook = 0;\n\n/** @type {Array<import('./internal').Component>} */\nlet afterPaintEffects = [];\n\nlet oldBeforeDiff = options._diff;\nlet oldBeforeRender = options._render;\nlet oldAfterDiff = options.diffed;\nlet oldCommit = options._commit;\nlet oldBeforeUnmount = options.unmount;\n\nconst RAF_TIMEOUT = 100;\nlet prevRaf;\n\noptions._diff = vnode => {\n\tcurrentComponent = null;\n\tif (oldBeforeDiff) oldBeforeDiff(vnode);\n};\n\noptions._render = vnode => {\n\tif (oldBeforeRender) oldBeforeRender(vnode);\n\n\tcurrentComponent = vnode._component;\n\tcurrentIndex = 0;\n\n\tconst hooks = currentComponent.__hooks;\n\tif (hooks) {\n\t\thooks._pendingEffects.forEach(invokeCleanup);\n\t\thooks._pendingEffects.forEach(invokeEffect);\n\t\thooks._pendingEffects = [];\n\t}\n};\n\noptions.diffed = vnode => {\n\tif (oldAfterDiff) oldAfterDiff(vnode);\n\n\tconst c = vnode._component;\n\tif (c && c.__hooks && c.__hooks._pendingEffects.length) {\n\t\tafterPaint(afterPaintEffects.push(c));\n\t}\n\tcurrentComponent = previousComponent;\n};\n\noptions._commit = (vnode, commitQueue) => {\n\tcommitQueue.some(component => {\n\t\ttry {\n\t\t\tcomponent._renderCallbacks.forEach(invokeCleanup);\n\t\t\tcomponent._renderCallbacks = component._renderCallbacks.filter(cb =>\n\t\t\t\tcb._value ? invokeEffect(cb) : true\n\t\t\t);\n\t\t} catch (e) {\n\t\t\tcommitQueue.some(c => {\n\t\t\t\tif (c._renderCallbacks) c._renderCallbacks = [];\n\t\t\t});\n\t\t\tcommitQueue = [];\n\t\t\toptions._catchError(e, component._vnode);\n\t\t}\n\t});\n\n\tif (oldCommit) oldCommit(vnode, commitQueue);\n};\n\noptions.unmount = vnode => {\n\tif (oldBeforeUnmount) oldBeforeUnmount(vnode);\n\n\tconst c = vnode._component;\n\tif (c && c.__hooks) {\n\t\ttry {\n\t\t\tc.__hooks._list.forEach(invokeCleanup);\n\t\t} catch (e) {\n\t\t\toptions._catchError(e, c._vnode);\n\t\t}\n\t}\n};\n\n/**\n * Get a hook's state from the currentComponent\n * @param {number} index The index of the hook to get\n * @param {number} type The index of the hook to get\n * @returns {any}\n */\nfunction getHookState(index, type) {\n\tif (options._hook) {\n\t\toptions._hook(currentComponent, index, currentHook || type);\n\t}\n\tcurrentHook = 0;\n\n\t// Largely inspired by:\n\t// * https://github.com/michael-klein/funcy.js/blob/f6be73468e6ec46b0ff5aa3cc4c9baf72a29025a/src/hooks/core_hooks.mjs\n\t// * https://github.com/michael-klein/funcy.js/blob/650beaa58c43c33a74820a3c98b3c7079cf2e333/src/renderer.mjs\n\t// Other implementations to look at:\n\t// * https://codesandbox.io/s/mnox05qp8\n\tconst hooks =\n\t\tcurrentComponent.__hooks ||\n\t\t(currentComponent.__hooks = {\n\t\t\t_list: [],\n\t\t\t_pendingEffects: []\n\t\t});\n\n\tif (index >= hooks._list.length) {\n\t\thooks._list.push({});\n\t}\n\treturn hooks._list[index];\n}\n\n/**\n * @param {import('./index').StateUpdater<any>} [initialState]\n */\nexport function useState(initialState) {\n\tcurrentHook = 1;\n\treturn useReducer(invokeOrReturn, initialState);\n}\n\n/**\n * @param {import('./index').Reducer<any, any>} reducer\n * @param {import('./index').StateUpdater<any>} initialState\n * @param {(initialState: any) => void} [init]\n * @returns {[ any, (state: any) => void ]}\n */\nexport function useReducer(reducer, initialState, init) {\n\t/** @type {import('./internal').ReducerHookState} */\n\tconst hookState = getHookState(currentIndex++, 2);\n\thookState._reducer = reducer;\n\tif (!hookState._component) {\n\t\thookState._value = [\n\t\t\t!init ? invokeOrReturn(undefined, initialState) : init(initialState),\n\n\t\t\taction => {\n\t\t\t\tconst nextValue = hookState._reducer(hookState._value[0], action);\n\t\t\t\tif (hookState._value[0] !== nextValue) {\n\t\t\t\t\thookState._value = [nextValue, hookState._value[1]];\n\t\t\t\t\thookState._component.setState({});\n\t\t\t\t}\n\t\t\t}\n\t\t];\n\n\t\thookState._component = currentComponent;\n\t}\n\n\treturn hookState._value;\n}\n\n/**\n * @param {import('./internal').Effect} callback\n * @param {any[]} args\n */\nexport function useEffect(callback, args) {\n\t/** @type {import('./internal').EffectHookState} */\n\tconst state = getHookState(currentIndex++, 3);\n\tif (!options._skipEffects && argsChanged(state._args, args)) {\n\t\tstate._value = callback;\n\t\tstate._args = args;\n\n\t\tcurrentComponent.__hooks._pendingEffects.push(state);\n\t}\n}\n\n/**\n * @param {import('./internal').Effect} callback\n * @param {any[]} args\n */\nexport function useLayoutEffect(callback, args) {\n\t/** @type {import('./internal').EffectHookState} */\n\tconst state = getHookState(currentIndex++, 4);\n\tif (!options._skipEffects && argsChanged(state._args, args)) {\n\t\tstate._value = callback;\n\t\tstate._args = args;\n\n\t\tcurrentComponent._renderCallbacks.push(state);\n\t}\n}\n\nexport function useRef(initialValue) {\n\tcurrentHook = 5;\n\treturn useMemo(() => ({ current: initialValue }), []);\n}\n\n/**\n * @param {object} ref\n * @param {() => object} createHandle\n * @param {any[]} args\n */\nexport function useImperativeHandle(ref, createHandle, args) {\n\tcurrentHook = 6;\n\tuseLayoutEffect(\n\t\t() => {\n\t\t\tif (typeof ref == 'function') ref(createHandle());\n\t\t\telse if (ref) ref.current = createHandle();\n\t\t},\n\t\targs == null ? args : args.concat(ref)\n\t);\n}\n\n/**\n * @param {() => any} factory\n * @param {any[]} args\n */\nexport function useMemo(factory, args) {\n\t/** @type {import('./internal').MemoHookState} */\n\tconst state = getHookState(currentIndex++, 7);\n\tif (argsChanged(state._args, args)) {\n\t\tstate._value = factory();\n\t\tstate._args = args;\n\t\tstate._factory = factory;\n\t}\n\n\treturn state._value;\n}\n\n/**\n * @param {() => void} callback\n * @param {any[]} args\n */\nexport function useCallback(callback, args) {\n\tcurrentHook = 8;\n\treturn useMemo(() => callback, args);\n}\n\n/**\n * @param {import('./internal').PreactContext} context\n */\nexport function useContext(context) {\n\tconst provider = currentComponent.context[context._id];\n\t// We could skip this call here, but than we'd not call\n\t// `options._hook`. We need to do that in order to make\n\t// the devtools aware of this hook.\n\t/** @type {import('./internal').ContextHookState} */\n\tconst state = getHookState(currentIndex++, 9);\n\t// The devtools needs access to the context object to\n\t// be able to pull of the default value when no provider\n\t// is present in the tree.\n\tstate._context = context;\n\tif (!provider) return context._defaultValue;\n\t// This is probably not safe to convert to \"!\"\n\tif (state._value == null) {\n\t\tstate._value = true;\n\t\tprovider.sub(currentComponent);\n\t}\n\treturn provider.props.value;\n}\n\n/**\n * Display a custom label for a custom hook for the devtools panel\n * @type {<T>(value: T, cb?: (value: T) => string | number) => void}\n */\nexport function useDebugValue(value, formatter) {\n\tif (options.useDebugValue) {\n\t\toptions.useDebugValue(formatter ? formatter(value) : value);\n\t}\n}\n\n/**\n * @param {(error: any) => void} cb\n */\nexport function useErrorBoundary(cb) {\n\t/** @type {import('./internal').ErrorBoundaryHookState} */\n\tconst state = getHookState(currentIndex++, 10);\n\tconst errState = useState();\n\tstate._value = cb;\n\tif (!currentComponent.componentDidCatch) {\n\t\tcurrentComponent.componentDidCatch = err => {\n\t\t\tif (state._value) state._value(err);\n\t\t\terrState[1](err);\n\t\t};\n\t}\n\treturn [\n\t\terrState[0],\n\t\t() => {\n\t\t\terrState[1](undefined);\n\t\t}\n\t];\n}\n\n/**\n * After paint effects consumer.\n */\nfunction flushAfterPaintEffects() {\n\tafterPaintEffects.forEach(component => {\n\t\tif (component._parentDom) {\n\t\t\ttry {\n\t\t\t\tcomponent.__hooks._pendingEffects.forEach(invokeCleanup);\n\t\t\t\tcomponent.__hooks._pendingEffects.forEach(invokeEffect);\n\t\t\t\tcomponent.__hooks._pendingEffects = [];\n\t\t\t} catch (e) {\n\t\t\t\tcomponent.__hooks._pendingEffects = [];\n\t\t\t\toptions._catchError(e, component._vnode);\n\t\t\t}\n\t\t}\n\t});\n\tafterPaintEffects = [];\n}\n\nlet HAS_RAF = typeof requestAnimationFrame == 'function';\n\n/**\n * Schedule a callback to be invoked after the browser has a chance to paint a new frame.\n * Do this by combining requestAnimationFrame (rAF) + setTimeout to invoke a callback after\n * the next browser frame.\n *\n * Also, schedule a timeout in parallel to the the rAF to ensure the callback is invoked\n * even if RAF doesn't fire (for example if the browser tab is not visible)\n *\n * @param {() => void} callback\n */\nfunction afterNextFrame(callback) {\n\tconst done = () => {\n\t\tclearTimeout(timeout);\n\t\tif (HAS_RAF) cancelAnimationFrame(raf);\n\t\tsetTimeout(callback);\n\t};\n\tconst timeout = setTimeout(done, RAF_TIMEOUT);\n\n\tlet raf;\n\tif (HAS_RAF) {\n\t\traf = requestAnimationFrame(done);\n\t}\n}\n\n// Note: if someone used options.debounceRendering = requestAnimationFrame,\n// then effects will ALWAYS run on the NEXT frame instead of the current one, incurring a ~16ms delay.\n// Perhaps this is not such a big deal.\n/**\n * Schedule afterPaintEffects flush after the browser paints\n * @param {number} newQueueLength\n */\nfunction afterPaint(newQueueLength) {\n\tif (newQueueLength === 1 || prevRaf !== options.requestAnimationFrame) {\n\t\tprevRaf = options.requestAnimationFrame;\n\t\t(prevRaf || afterNextFrame)(flushAfterPaintEffects);\n\t}\n}\n\n/**\n * @param {import('./internal').EffectHookState} hook\n */\nfunction invokeCleanup(hook) {\n\t// A hook cleanup can introduce a call to render which creates a new root, this will call options.vnode\n\t// and move the currentComponent away.\n\tconst comp = currentComponent;\n\tif (typeof hook._cleanup == 'function') hook._cleanup();\n\tcurrentComponent = comp;\n}\n\n/**\n * Invoke a Hook's effect\n * @param {import('./internal').EffectHookState} hook\n */\nfunction invokeEffect(hook) {\n\t// A hook call can introduce a call to render which creates a new root, this will call options.vnode\n\t// and move the currentComponent away.\n\tconst comp = currentComponent;\n\thook._cleanup = hook._value();\n\tcurrentComponent = comp;\n}\n\n/**\n * @param {any[]} oldArgs\n * @param {any[]} newArgs\n */\nfunction argsChanged(oldArgs, newArgs) {\n\treturn (\n\t\t!oldArgs ||\n\t\toldArgs.length !== newArgs.length ||\n\t\tnewArgs.some((arg, index) => arg !== oldArgs[index])\n\t);\n}\n\nfunction invokeOrReturn(arg, f) {\n\treturn typeof f == 'function' ? f(arg) : f;\n}\n"],"names":["currentIndex","currentComponent","prevRaf","currentHook","afterPaintEffects","oldBeforeDiff","options","oldBeforeRender","oldAfterDiff","diffed","oldCommit","oldBeforeUnmount","unmount","getHookState","index","type","hooks","length","push","useState","initialState","useReducer","invokeOrReturn","reducer","init","hookState","_reducer","undefined","action","nextValue","setState","useEffect","callback","args","state","argsChanged","useLayoutEffect","useRef","initialValue","useMemo","current","useImperativeHandle","ref","createHandle","concat","factory","useCallback","useContext","context","provider","sub","props","value","useDebugValue","formatter","useErrorBoundary","cb","errState","componentDidCatch","err","flushAfterPaintEffects","forEach","component","invokeCleanup","invokeEffect","e","vnode","c","requestAnimationFrame","raf","done","clearTimeout","timeout","HAS_RAF","cancelAnimationFrame","setTimeout","previousComponent","commitQueue","some","filter","hook","comp","oldArgs","newArgs","arg","f"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"hooks.module.js","sources":["../src/index.js"],"sourcesContent":["import { options } from 'preact';\n\n/** @type {number} */\nlet currentIndex;\n\n/** @type {import('./internal').Component} */\nlet currentComponent;\n\n/** @type {number} */\nlet currentHook = 0;\n\n/** @type {Array<import('./internal').Component>} */\nlet afterPaintEffects = [];\n\nlet oldBeforeDiff = options._diff;\nlet oldBeforeRender = options._render;\nlet oldAfterDiff = options.diffed;\nlet oldCommit = options._commit;\nlet oldBeforeUnmount = options.unmount;\n\nconst RAF_TIMEOUT = 100;\nlet prevRaf;\n\noptions._diff = vnode => {\n\tcurrentComponent = null;\n\tif (oldBeforeDiff) oldBeforeDiff(vnode);\n};\n\noptions._render = vnode => {\n\tif (oldBeforeRender) oldBeforeRender(vnode);\n\n\tcurrentComponent = vnode._component;\n\tcurrentIndex = 0;\n\n\tconst hooks = currentComponent.__hooks;\n\tif (hooks) {\n\t\thooks._pendingEffects.forEach(invokeCleanup);\n\t\thooks._pendingEffects.forEach(invokeEffect);\n\t\thooks._pendingEffects = [];\n\t}\n};\n\noptions.diffed = vnode => {\n\tif (oldAfterDiff) oldAfterDiff(vnode);\n\n\tconst c = vnode._component;\n\tif (c && c.__hooks && c.__hooks._pendingEffects.length) {\n\t\tafterPaint(afterPaintEffects.push(c));\n\t}\n\tcurrentComponent = null;\n};\n\noptions._commit = (vnode, commitQueue) => {\n\tcommitQueue.some(component => {\n\t\ttry {\n\t\t\tcomponent._renderCallbacks.forEach(invokeCleanup);\n\t\t\tcomponent._renderCallbacks = component._renderCallbacks.filter(cb =>\n\t\t\t\tcb._value ? invokeEffect(cb) : true\n\t\t\t);\n\t\t} catch (e) {\n\t\t\tcommitQueue.some(c => {\n\t\t\t\tif (c._renderCallbacks) c._renderCallbacks = [];\n\t\t\t});\n\t\t\tcommitQueue = [];\n\t\t\toptions._catchError(e, component._vnode);\n\t\t}\n\t});\n\n\tif (oldCommit) oldCommit(vnode, commitQueue);\n};\n\noptions.unmount = vnode => {\n\tif (oldBeforeUnmount) oldBeforeUnmount(vnode);\n\n\tconst c = vnode._component;\n\tif (c && c.__hooks) {\n\t\ttry {\n\t\t\tc.__hooks._list.forEach(invokeCleanup);\n\t\t} catch (e) {\n\t\t\toptions._catchError(e, c._vnode);\n\t\t}\n\t}\n};\n\n/**\n * Get a hook's state from the currentComponent\n * @param {number} index The index of the hook to get\n * @param {number} type The index of the hook to get\n * @returns {any}\n */\nfunction getHookState(index, type) {\n\tif (options._hook) {\n\t\toptions._hook(currentComponent, index, currentHook || type);\n\t}\n\tcurrentHook = 0;\n\n\t// Largely inspired by:\n\t// * https://github.com/michael-klein/funcy.js/blob/f6be73468e6ec46b0ff5aa3cc4c9baf72a29025a/src/hooks/core_hooks.mjs\n\t// * https://github.com/michael-klein/funcy.js/blob/650beaa58c43c33a74820a3c98b3c7079cf2e333/src/renderer.mjs\n\t// Other implementations to look at:\n\t// * https://codesandbox.io/s/mnox05qp8\n\tconst hooks =\n\t\tcurrentComponent.__hooks ||\n\t\t(currentComponent.__hooks = {\n\t\t\t_list: [],\n\t\t\t_pendingEffects: []\n\t\t});\n\n\tif (index >= hooks._list.length) {\n\t\thooks._list.push({});\n\t}\n\treturn hooks._list[index];\n}\n\n/**\n * @param {import('./index').StateUpdater<any>} [initialState]\n */\nexport function useState(initialState) {\n\tcurrentHook = 1;\n\treturn useReducer(invokeOrReturn, initialState);\n}\n\n/**\n * @param {import('./index').Reducer<any, any>} reducer\n * @param {import('./index').StateUpdater<any>} initialState\n * @param {(initialState: any) => void} [init]\n * @returns {[ any, (state: any) => void ]}\n */\nexport function useReducer(reducer, initialState, init) {\n\t/** @type {import('./internal').ReducerHookState} */\n\tconst hookState = getHookState(currentIndex++, 2);\n\thookState._reducer = reducer;\n\tif (!hookState._component) {\n\t\thookState._value = [\n\t\t\t!init ? invokeOrReturn(undefined, initialState) : init(initialState),\n\n\t\t\taction => {\n\t\t\t\tconst nextValue = hookState._reducer(hookState._value[0], action);\n\t\t\t\tif (hookState._value[0] !== nextValue) {\n\t\t\t\t\thookState._value = [nextValue, hookState._value[1]];\n\t\t\t\t\thookState._component.setState({});\n\t\t\t\t}\n\t\t\t}\n\t\t];\n\n\t\thookState._component = currentComponent;\n\t}\n\n\treturn hookState._value;\n}\n\n/**\n * @param {import('./internal').Effect} callback\n * @param {any[]} args\n */\nexport function useEffect(callback, args) {\n\t/** @type {import('./internal').EffectHookState} */\n\tconst state = getHookState(currentIndex++, 3);\n\tif (!options._skipEffects && argsChanged(state._args, args)) {\n\t\tstate._value = callback;\n\t\tstate._args = args;\n\n\t\tcurrentComponent.__hooks._pendingEffects.push(state);\n\t}\n}\n\n/**\n * @param {import('./internal').Effect} callback\n * @param {any[]} args\n */\nexport function useLayoutEffect(callback, args) {\n\t/** @type {import('./internal').EffectHookState} */\n\tconst state = getHookState(currentIndex++, 4);\n\tif (!options._skipEffects && argsChanged(state._args, args)) {\n\t\tstate._value = callback;\n\t\tstate._args = args;\n\n\t\tcurrentComponent._renderCallbacks.push(state);\n\t}\n}\n\nexport function useRef(initialValue) {\n\tcurrentHook = 5;\n\treturn useMemo(() => ({ current: initialValue }), []);\n}\n\n/**\n * @param {object} ref\n * @param {() => object} createHandle\n * @param {any[]} args\n */\nexport function useImperativeHandle(ref, createHandle, args) {\n\tcurrentHook = 6;\n\tuseLayoutEffect(\n\t\t() => {\n\t\t\tif (typeof ref == 'function') ref(createHandle());\n\t\t\telse if (ref) ref.current = createHandle();\n\t\t},\n\t\targs == null ? args : args.concat(ref)\n\t);\n}\n\n/**\n * @param {() => any} factory\n * @param {any[]} args\n */\nexport function useMemo(factory, args) {\n\t/** @type {import('./internal').MemoHookState} */\n\tconst state = getHookState(currentIndex++, 7);\n\tif (argsChanged(state._args, args)) {\n\t\tstate._value = factory();\n\t\tstate._args = args;\n\t\tstate._factory = factory;\n\t}\n\n\treturn state._value;\n}\n\n/**\n * @param {() => void} callback\n * @param {any[]} args\n */\nexport function useCallback(callback, args) {\n\tcurrentHook = 8;\n\treturn useMemo(() => callback, args);\n}\n\n/**\n * @param {import('./internal').PreactContext} context\n */\nexport function useContext(context) {\n\tconst provider = currentComponent.context[context._id];\n\t// We could skip this call here, but than we'd not call\n\t// `options._hook`. We need to do that in order to make\n\t// the devtools aware of this hook.\n\t/** @type {import('./internal').ContextHookState} */\n\tconst state = getHookState(currentIndex++, 9);\n\t// The devtools needs access to the context object to\n\t// be able to pull of the default value when no provider\n\t// is present in the tree.\n\tstate._context = context;\n\tif (!provider) return context._defaultValue;\n\t// This is probably not safe to convert to \"!\"\n\tif (state._value == null) {\n\t\tstate._value = true;\n\t\tprovider.sub(currentComponent);\n\t}\n\treturn provider.props.value;\n}\n\n/**\n * Display a custom label for a custom hook for the devtools panel\n * @type {<T>(value: T, cb?: (value: T) => string | number) => void}\n */\nexport function useDebugValue(value, formatter) {\n\tif (options.useDebugValue) {\n\t\toptions.useDebugValue(formatter ? formatter(value) : value);\n\t}\n}\n\n/**\n * @param {(error: any) => void} cb\n */\nexport function useErrorBoundary(cb) {\n\t/** @type {import('./internal').ErrorBoundaryHookState} */\n\tconst state = getHookState(currentIndex++, 10);\n\tconst errState = useState();\n\tstate._value = cb;\n\tif (!currentComponent.componentDidCatch) {\n\t\tcurrentComponent.componentDidCatch = err => {\n\t\t\tif (state._value) state._value(err);\n\t\t\terrState[1](err);\n\t\t};\n\t}\n\treturn [\n\t\terrState[0],\n\t\t() => {\n\t\t\terrState[1](undefined);\n\t\t}\n\t];\n}\n\n/**\n * After paint effects consumer.\n */\nfunction flushAfterPaintEffects() {\n\tafterPaintEffects.forEach(component => {\n\t\tif (component._parentDom) {\n\t\t\ttry {\n\t\t\t\tcomponent.__hooks._pendingEffects.forEach(invokeCleanup);\n\t\t\t\tcomponent.__hooks._pendingEffects.forEach(invokeEffect);\n\t\t\t\tcomponent.__hooks._pendingEffects = [];\n\t\t\t} catch (e) {\n\t\t\t\tcomponent.__hooks._pendingEffects = [];\n\t\t\t\toptions._catchError(e, component._vnode);\n\t\t\t}\n\t\t}\n\t});\n\tafterPaintEffects = [];\n}\n\nlet HAS_RAF = typeof requestAnimationFrame == 'function';\n\n/**\n * Schedule a callback to be invoked after the browser has a chance to paint a new frame.\n * Do this by combining requestAnimationFrame (rAF) + setTimeout to invoke a callback after\n * the next browser frame.\n *\n * Also, schedule a timeout in parallel to the the rAF to ensure the callback is invoked\n * even if RAF doesn't fire (for example if the browser tab is not visible)\n *\n * @param {() => void} callback\n */\nfunction afterNextFrame(callback) {\n\tconst done = () => {\n\t\tclearTimeout(timeout);\n\t\tif (HAS_RAF) cancelAnimationFrame(raf);\n\t\tsetTimeout(callback);\n\t};\n\tconst timeout = setTimeout(done, RAF_TIMEOUT);\n\n\tlet raf;\n\tif (HAS_RAF) {\n\t\traf = requestAnimationFrame(done);\n\t}\n}\n\n// Note: if someone used options.debounceRendering = requestAnimationFrame,\n// then effects will ALWAYS run on the NEXT frame instead of the current one, incurring a ~16ms delay.\n// Perhaps this is not such a big deal.\n/**\n * Schedule afterPaintEffects flush after the browser paints\n * @param {number} newQueueLength\n */\nfunction afterPaint(newQueueLength) {\n\tif (newQueueLength === 1 || prevRaf !== options.requestAnimationFrame) {\n\t\tprevRaf = options.requestAnimationFrame;\n\t\t(prevRaf || afterNextFrame)(flushAfterPaintEffects);\n\t}\n}\n\n/**\n * @param {import('./internal').EffectHookState} hook\n */\nfunction invokeCleanup(hook) {\n\t// A hook cleanup can introduce a call to render which creates a new root, this will call options.vnode\n\t// and move the currentComponent away.\n\tconst comp = currentComponent;\n\tif (typeof hook._cleanup == 'function') hook._cleanup();\n\tcurrentComponent = comp;\n}\n\n/**\n * Invoke a Hook's effect\n * @param {import('./internal').EffectHookState} hook\n */\nfunction invokeEffect(hook) {\n\t// A hook call can introduce a call to render which creates a new root, this will call options.vnode\n\t// and move the currentComponent away.\n\tconst comp = currentComponent;\n\thook._cleanup = hook._value();\n\tcurrentComponent = comp;\n}\n\n/**\n * @param {any[]} oldArgs\n * @param {any[]} newArgs\n */\nfunction argsChanged(oldArgs, newArgs) {\n\treturn (\n\t\t!oldArgs ||\n\t\toldArgs.length !== newArgs.length ||\n\t\tnewArgs.some((arg, index) => arg !== oldArgs[index])\n\t);\n}\n\nfunction invokeOrReturn(arg, f) {\n\treturn typeof f == 'function' ? f(arg) : f;\n}\n"],"names":["currentIndex","currentComponent","prevRaf","currentHook","afterPaintEffects","oldBeforeDiff","options","oldBeforeRender","oldAfterDiff","diffed","oldCommit","oldBeforeUnmount","unmount","getHookState","index","type","hooks","length","push","useState","initialState","useReducer","invokeOrReturn","reducer","init","hookState","_reducer","undefined","action","nextValue","setState","useEffect","callback","args","state","argsChanged","useLayoutEffect","useRef","initialValue","useMemo","current","useImperativeHandle","ref","createHandle","concat","factory","useCallback","useContext","context","provider","sub","props","value","useDebugValue","formatter","useErrorBoundary","cb","errState","componentDidCatch","err","flushAfterPaintEffects","forEach","component","invokeCleanup","invokeEffect","e","vnode","c","requestAnimationFrame","raf","done","clearTimeout","timeout","HAS_RAF","cancelAnimationFrame","setTimeout","commitQueue","some","filter","hook","comp","oldArgs","newArgs","arg","f"],"mappings":"iCAGA,IAAIA,EAGAC,EAeAC,EAZAC,EAAc,EAGdC,EAAoB,GAEpBC,EAAgBC,MAChBC,EAAkBD,MAClBE,EAAeF,EAAQG,OACvBC,EAAYJ,MACZK,EAAmBL,EAAQM,QAwE/B,SAASC,EAAaC,EAAOC,GACxBT,OACHA,MAAcL,EAAkBa,EAAOX,GAAeY,GAEvDZ,EAAc,MAORa,EACLf,QACCA,MAA2B,IACpB,OACU,YAGfa,GAASE,KAAYC,QACxBD,KAAYE,KAAK,IAEXF,KAAYF,GAMb,SAASK,EAASC,UACxBjB,EAAc,EACPkB,EAAWC,EAAgBF,GASnC,SAAgBC,EAAWE,EAASH,EAAcI,OAE3CC,EAAYZ,EAAab,IAAgB,UAC/CyB,EAAUC,EAAWH,EAChBE,QACJA,KAAmB,CACjBD,EAAiDA,EAAKJ,GAA/CE,OAAeK,EAAWP,GAElC,SAAAQ,OACOC,EAAYJ,EAAUC,EAASD,KAAiB,GAAIG,GACtDH,KAAiB,KAAOI,IAC3BJ,KAAmB,CAACI,EAAWJ,KAAiB,IAChDA,MAAqBK,SAAS,OAKjCL,MAAuBxB,GAGjBwB,KAOD,SAASM,EAAUC,EAAUC,OAE7BC,EAAQrB,EAAab,IAAgB,IACtCM,OAAwB6B,EAAYD,MAAaD,KACrDC,KAAeF,EACfE,MAAcD,EAEdhC,UAAyCiB,KAAKgB,IAQzC,SAASE,EAAgBJ,EAAUC,OAEnCC,EAAQrB,EAAab,IAAgB,IACtCM,OAAwB6B,EAAYD,MAAaD,KACrDC,KAAeF,EACfE,MAAcD,EAEdhC,MAAkCiB,KAAKgB,IAIlC,SAASG,EAAOC,UACtBnC,EAAc,EACPoC,EAAQ,iBAAO,CAAEC,QAASF,IAAiB,IAQnD,SAAgBG,EAAoBC,EAAKC,EAAcV,GACtD9B,EAAc,EACdiC,EACC,WACmB,mBAAPM,EAAmBA,EAAIC,KACzBD,IAAKA,EAAIF,QAAUG,MAErB,MAARV,EAAeA,EAAOA,EAAKW,OAAOF,IAQ7B,SAASH,EAAQM,EAASZ,OAE1BC,EAAQrB,EAAab,IAAgB,UACvCmC,EAAYD,MAAaD,KAC5BC,KAAeW,IACfX,MAAcD,EACdC,MAAiBW,GAGXX,KAOD,SAASY,EAAYd,EAAUC,UACrC9B,EAAc,EACPoC,EAAQ,kBAAMP,GAAUC,GAMzB,SAASc,EAAWC,OACpBC,EAAWhD,EAAiB+C,QAAQA,OAKpCd,EAAQrB,EAAab,IAAgB,UAI3CkC,IAAiBc,EACZC,GAEe,MAAhBf,OACHA,MAAe,EACfe,EAASC,IAAIjD,IAEPgD,EAASE,MAAMC,OANAJ,KAahB,SAASK,EAAcD,EAAOE,GAChChD,EAAQ+C,eACX/C,EAAQ+C,cAAcC,EAAYA,EAAUF,GAASA,GAOhD,SAASG,EAAiBC,OAE1BtB,EAAQrB,EAAab,IAAgB,IACrCyD,EAAWtC,WACjBe,KAAesB,EACVvD,EAAiByD,oBACrBzD,EAAiByD,kBAAoB,SAAAC,GAChCzB,MAAcA,KAAayB,GAC/BF,EAAS,GAAGE,KAGP,CACNF,EAAS,GACT,WACCA,EAAS,QAAG9B,KAQf,SAASiC,IACRxD,EAAkByD,QAAQ,SAAAC,MACrBA,UAEFA,UAAkCD,QAAQE,GAC1CD,UAAkCD,QAAQG,GAC1CF,UAAoC,GACnC,MAAOG,GACRH,UAAoC,GACpCxD,MAAoB2D,EAAGH,UAI1B1D,EAAoB,GAnRrBE,MAAgB,SAAA4D,GACfjE,EAAmB,KACfI,GAAeA,EAAc6D,IAGlC5D,MAAkB,SAAA4D,GACb3D,GAAiBA,EAAgB2D,GAGrClE,EAAe,MAETgB,GAHNf,EAAmBiE,WAIflD,IACHA,MAAsB6C,QAAQE,GAC9B/C,MAAsB6C,QAAQG,GAC9BhD,MAAwB,KAI1BV,EAAQG,OAAS,SAAAyD,GACZ1D,GAAcA,EAAa0D,OAEzBC,EAAID,MACNC,GAAKA,OAAaA,UAA0BlD,SAiSzB,IAhSXb,EAAkBc,KAAKiD,IAgSPjE,IAAYI,EAAQ8D,yBAC/ClE,EAAUI,EAAQ8D,wBAvBpB,SAAwBpC,OAQnBqC,EAPEC,EAAO,WACZC,aAAaC,GACTC,GAASC,qBAAqBL,GAClCM,WAAW3C,IAENwC,EAAUG,WAAWL,EA3SR,KA8SfG,IACHJ,EAAMD,sBAAsBE,MAcAV,IAhS7B3D,EAAmB,MAGpBK,MAAkB,SAAC4D,EAAOU,GACzBA,EAAYC,KAAK,SAAAf,OAEfA,MAA2BD,QAAQE,GACnCD,MAA6BA,MAA2BgB,OAAO,SAAAtB,UAC9DA,MAAYQ,EAAaR,KAEzB,MAAOS,GACRW,EAAYC,KAAK,SAAAV,GACZA,QAAoBA,MAAqB,MAE9CS,EAAc,GACdtE,MAAoB2D,EAAGH,UAIrBpD,GAAWA,EAAUwD,EAAOU,IAGjCtE,EAAQM,QAAU,SAAAsD,GACbvD,GAAkBA,EAAiBuD,OAEjCC,EAAID,SACNC,GAAKA,UAEPA,SAAgBN,QAAQE,GACvB,MAAOE,GACR3D,MAAoB2D,EAAGE,SA8N1B,IAAIM,EAA0C,mBAAzBL,sBA2CrB,SAASL,EAAcgB,OAGhBC,EAAO/E,EACe,mBAAjB8E,OAA6BA,QACxC9E,EAAmB+E,EAOpB,SAAShB,EAAae,OAGfC,EAAO/E,EACb8E,MAAgBA,OAChB9E,EAAmB+E,EAOpB,SAAS7C,EAAY8C,EAASC,UAE3BD,GACDA,EAAQhE,SAAWiE,EAAQjE,QAC3BiE,EAAQL,KAAK,SAACM,EAAKrE,UAAUqE,IAAQF,EAAQnE,KAI/C,SAASQ,EAAe6D,EAAKC,SACT,mBAALA,EAAkBA,EAAED,GAAOC"}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("preact")):"function"==typeof define&&define.amd?define(["exports","preact"],t):t(n.preactHooks={},n.preact)}(this,function(n,t){var u,o,i
|
1
|
+
!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("preact")):"function"==typeof define&&define.amd?define(["exports","preact"],t):t(n.preactHooks={},n.preact)}(this,function(n,t){var u,o,r,i=0,c=[],f=t.options.__b,e=t.options.__r,a=t.options.diffed,v=t.options.__c,p=t.options.unmount;function l(n,u){t.options.__h&&t.options.__h(o,n,i||u),i=0;var r=o.__H||(o.__H={__:[],__h:[]});return n>=r.__.length&&r.__.push({}),r.__[n]}function m(n){return i=1,y(F,n)}function y(n,t,r){var i=l(u++,2);return i.t=n,i.__c||(i.__=[r?r(t):F(void 0,t),function(n){var t=i.t(i.__[0],n);i.__[0]!==t&&(i.__=[t,i.__[1]],i.__c.setState({}))}],i.__c=o),i.__}function d(n,r){var i=l(u++,4);!t.options.__s&&A(i.__H,r)&&(i.__=n,i.__H=r,o.__h.push(i))}function s(n,t){var o=l(u++,7);return A(o.__H,t)&&(o.__=n(),o.__H=t,o.__h=n),o.__}function h(){c.forEach(function(n){if(n.__P)try{n.__H.__h.forEach(q),n.__H.__h.forEach(x),n.__H.__h=[]}catch(u){n.__H.__h=[],t.options.__e(u,n.__v)}}),c=[]}t.options.__b=function(n){o=null,f&&f(n)},t.options.__r=function(n){e&&e(n),u=0;var t=(o=n.__c).__H;t&&(t.__h.forEach(q),t.__h.forEach(x),t.__h=[])},t.options.diffed=function(n){a&&a(n);var u=n.__c;u&&u.__H&&u.__H.__h.length&&(1!==c.push(u)&&r===t.options.requestAnimationFrame||((r=t.options.requestAnimationFrame)||function(n){var t,u=function(){clearTimeout(o),_&&cancelAnimationFrame(t),setTimeout(n)},o=setTimeout(u,100);_&&(t=requestAnimationFrame(u))})(h)),o=null},t.options.__c=function(n,u){u.some(function(n){try{n.__h.forEach(q),n.__h=n.__h.filter(function(n){return!n.__||x(n)})}catch(o){u.some(function(n){n.__h&&(n.__h=[])}),u=[],t.options.__e(o,n.__v)}}),v&&v(n,u)},t.options.unmount=function(n){p&&p(n);var u=n.__c;if(u&&u.__H)try{u.__H.__.forEach(q)}catch(n){t.options.__e(n,u.__v)}};var _="function"==typeof requestAnimationFrame;function q(n){var t=o;"function"==typeof n.__c&&n.__c(),o=t}function x(n){var t=o;n.__c=n.__(),o=t}function A(n,t){return!n||n.length!==t.length||t.some(function(t,u){return t!==n[u]})}function F(n,t){return"function"==typeof t?t(n):t}n.useState=m,n.useReducer=y,n.useEffect=function(n,r){var i=l(u++,3);!t.options.__s&&A(i.__H,r)&&(i.__=n,i.__H=r,o.__H.__h.push(i))},n.useLayoutEffect=d,n.useRef=function(n){return i=5,s(function(){return{current:n}},[])},n.useImperativeHandle=function(n,t,u){i=6,d(function(){"function"==typeof n?n(t()):n&&(n.current=t())},null==u?u:u.concat(n))},n.useMemo=s,n.useCallback=function(n,t){return i=8,s(function(){return n},t)},n.useContext=function(n){var t=o.context[n.__c],r=l(u++,9);return r.c=n,t?(null==r.__&&(r.__=!0,t.sub(o)),t.props.value):n.__},n.useDebugValue=function(n,u){t.options.useDebugValue&&t.options.useDebugValue(u?u(n):n)},n.useErrorBoundary=function(n){var t=l(u++,10),r=m();return t.__=n,o.componentDidCatch||(o.componentDidCatch=function(n){t.__&&t.__(n),r[1](n)}),[r[0],function(){r[1](void 0)}]}});
|
2
2
|
//# sourceMappingURL=hooks.umd.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"hooks.umd.js","sources":["../src/index.js"],"sourcesContent":["import { options } from 'preact';\n\n/** @type {number} */\nlet currentIndex;\n\n/** @type {import('./internal').Component} */\nlet currentComponent;\n/**\n * Keep track of the previous component so that we can set\n * `currentComponent` to `null` and throw when a hook is invoked\n * outside of render\n * @type {import('./internal').Component}\n */\nlet previousComponent;\n\n/** @type {number} */\nlet currentHook = 0;\n\n/** @type {Array<import('./internal').Component>} */\nlet afterPaintEffects = [];\n\nlet oldBeforeDiff = options._diff;\nlet oldBeforeRender = options._render;\nlet oldAfterDiff = options.diffed;\nlet oldCommit = options._commit;\nlet oldBeforeUnmount = options.unmount;\n\nconst RAF_TIMEOUT = 100;\nlet prevRaf;\n\noptions._diff = vnode => {\n\tcurrentComponent = null;\n\tif (oldBeforeDiff) oldBeforeDiff(vnode);\n};\n\noptions._render = vnode => {\n\tif (oldBeforeRender) oldBeforeRender(vnode);\n\n\tcurrentComponent = vnode._component;\n\tcurrentIndex = 0;\n\n\tconst hooks = currentComponent.__hooks;\n\tif (hooks) {\n\t\thooks._pendingEffects.forEach(invokeCleanup);\n\t\thooks._pendingEffects.forEach(invokeEffect);\n\t\thooks._pendingEffects = [];\n\t}\n};\n\noptions.diffed = vnode => {\n\tif (oldAfterDiff) oldAfterDiff(vnode);\n\n\tconst c = vnode._component;\n\tif (c && c.__hooks && c.__hooks._pendingEffects.length) {\n\t\tafterPaint(afterPaintEffects.push(c));\n\t}\n\tcurrentComponent = previousComponent;\n};\n\noptions._commit = (vnode, commitQueue) => {\n\tcommitQueue.some(component => {\n\t\ttry {\n\t\t\tcomponent._renderCallbacks.forEach(invokeCleanup);\n\t\t\tcomponent._renderCallbacks = component._renderCallbacks.filter(cb =>\n\t\t\t\tcb._value ? invokeEffect(cb) : true\n\t\t\t);\n\t\t} catch (e) {\n\t\t\tcommitQueue.some(c => {\n\t\t\t\tif (c._renderCallbacks) c._renderCallbacks = [];\n\t\t\t});\n\t\t\tcommitQueue = [];\n\t\t\toptions._catchError(e, component._vnode);\n\t\t}\n\t});\n\n\tif (oldCommit) oldCommit(vnode, commitQueue);\n};\n\noptions.unmount = vnode => {\n\tif (oldBeforeUnmount) oldBeforeUnmount(vnode);\n\n\tconst c = vnode._component;\n\tif (c && c.__hooks) {\n\t\ttry {\n\t\t\tc.__hooks._list.forEach(invokeCleanup);\n\t\t} catch (e) {\n\t\t\toptions._catchError(e, c._vnode);\n\t\t}\n\t}\n};\n\n/**\n * Get a hook's state from the currentComponent\n * @param {number} index The index of the hook to get\n * @param {number} type The index of the hook to get\n * @returns {any}\n */\nfunction getHookState(index, type) {\n\tif (options._hook) {\n\t\toptions._hook(currentComponent, index, currentHook || type);\n\t}\n\tcurrentHook = 0;\n\n\t// Largely inspired by:\n\t// * https://github.com/michael-klein/funcy.js/blob/f6be73468e6ec46b0ff5aa3cc4c9baf72a29025a/src/hooks/core_hooks.mjs\n\t// * https://github.com/michael-klein/funcy.js/blob/650beaa58c43c33a74820a3c98b3c7079cf2e333/src/renderer.mjs\n\t// Other implementations to look at:\n\t// * https://codesandbox.io/s/mnox05qp8\n\tconst hooks =\n\t\tcurrentComponent.__hooks ||\n\t\t(currentComponent.__hooks = {\n\t\t\t_list: [],\n\t\t\t_pendingEffects: []\n\t\t});\n\n\tif (index >= hooks._list.length) {\n\t\thooks._list.push({});\n\t}\n\treturn hooks._list[index];\n}\n\n/**\n * @param {import('./index').StateUpdater<any>} [initialState]\n */\nexport function useState(initialState) {\n\tcurrentHook = 1;\n\treturn useReducer(invokeOrReturn, initialState);\n}\n\n/**\n * @param {import('./index').Reducer<any, any>} reducer\n * @param {import('./index').StateUpdater<any>} initialState\n * @param {(initialState: any) => void} [init]\n * @returns {[ any, (state: any) => void ]}\n */\nexport function useReducer(reducer, initialState, init) {\n\t/** @type {import('./internal').ReducerHookState} */\n\tconst hookState = getHookState(currentIndex++, 2);\n\thookState._reducer = reducer;\n\tif (!hookState._component) {\n\t\thookState._value = [\n\t\t\t!init ? invokeOrReturn(undefined, initialState) : init(initialState),\n\n\t\t\taction => {\n\t\t\t\tconst nextValue = hookState._reducer(hookState._value[0], action);\n\t\t\t\tif (hookState._value[0] !== nextValue) {\n\t\t\t\t\thookState._value = [nextValue, hookState._value[1]];\n\t\t\t\t\thookState._component.setState({});\n\t\t\t\t}\n\t\t\t}\n\t\t];\n\n\t\thookState._component = currentComponent;\n\t}\n\n\treturn hookState._value;\n}\n\n/**\n * @param {import('./internal').Effect} callback\n * @param {any[]} args\n */\nexport function useEffect(callback, args) {\n\t/** @type {import('./internal').EffectHookState} */\n\tconst state = getHookState(currentIndex++, 3);\n\tif (!options._skipEffects && argsChanged(state._args, args)) {\n\t\tstate._value = callback;\n\t\tstate._args = args;\n\n\t\tcurrentComponent.__hooks._pendingEffects.push(state);\n\t}\n}\n\n/**\n * @param {import('./internal').Effect} callback\n * @param {any[]} args\n */\nexport function useLayoutEffect(callback, args) {\n\t/** @type {import('./internal').EffectHookState} */\n\tconst state = getHookState(currentIndex++, 4);\n\tif (!options._skipEffects && argsChanged(state._args, args)) {\n\t\tstate._value = callback;\n\t\tstate._args = args;\n\n\t\tcurrentComponent._renderCallbacks.push(state);\n\t}\n}\n\nexport function useRef(initialValue) {\n\tcurrentHook = 5;\n\treturn useMemo(() => ({ current: initialValue }), []);\n}\n\n/**\n * @param {object} ref\n * @param {() => object} createHandle\n * @param {any[]} args\n */\nexport function useImperativeHandle(ref, createHandle, args) {\n\tcurrentHook = 6;\n\tuseLayoutEffect(\n\t\t() => {\n\t\t\tif (typeof ref == 'function') ref(createHandle());\n\t\t\telse if (ref) ref.current = createHandle();\n\t\t},\n\t\targs == null ? args : args.concat(ref)\n\t);\n}\n\n/**\n * @param {() => any} factory\n * @param {any[]} args\n */\nexport function useMemo(factory, args) {\n\t/** @type {import('./internal').MemoHookState} */\n\tconst state = getHookState(currentIndex++, 7);\n\tif (argsChanged(state._args, args)) {\n\t\tstate._value = factory();\n\t\tstate._args = args;\n\t\tstate._factory = factory;\n\t}\n\n\treturn state._value;\n}\n\n/**\n * @param {() => void} callback\n * @param {any[]} args\n */\nexport function useCallback(callback, args) {\n\tcurrentHook = 8;\n\treturn useMemo(() => callback, args);\n}\n\n/**\n * @param {import('./internal').PreactContext} context\n */\nexport function useContext(context) {\n\tconst provider = currentComponent.context[context._id];\n\t// We could skip this call here, but than we'd not call\n\t// `options._hook`. We need to do that in order to make\n\t// the devtools aware of this hook.\n\t/** @type {import('./internal').ContextHookState} */\n\tconst state = getHookState(currentIndex++, 9);\n\t// The devtools needs access to the context object to\n\t// be able to pull of the default value when no provider\n\t// is present in the tree.\n\tstate._context = context;\n\tif (!provider) return context._defaultValue;\n\t// This is probably not safe to convert to \"!\"\n\tif (state._value == null) {\n\t\tstate._value = true;\n\t\tprovider.sub(currentComponent);\n\t}\n\treturn provider.props.value;\n}\n\n/**\n * Display a custom label for a custom hook for the devtools panel\n * @type {<T>(value: T, cb?: (value: T) => string | number) => void}\n */\nexport function useDebugValue(value, formatter) {\n\tif (options.useDebugValue) {\n\t\toptions.useDebugValue(formatter ? formatter(value) : value);\n\t}\n}\n\n/**\n * @param {(error: any) => void} cb\n */\nexport function useErrorBoundary(cb) {\n\t/** @type {import('./internal').ErrorBoundaryHookState} */\n\tconst state = getHookState(currentIndex++, 10);\n\tconst errState = useState();\n\tstate._value = cb;\n\tif (!currentComponent.componentDidCatch) {\n\t\tcurrentComponent.componentDidCatch = err => {\n\t\t\tif (state._value) state._value(err);\n\t\t\terrState[1](err);\n\t\t};\n\t}\n\treturn [\n\t\terrState[0],\n\t\t() => {\n\t\t\terrState[1](undefined);\n\t\t}\n\t];\n}\n\n/**\n * After paint effects consumer.\n */\nfunction flushAfterPaintEffects() {\n\tafterPaintEffects.forEach(component => {\n\t\tif (component._parentDom) {\n\t\t\ttry {\n\t\t\t\tcomponent.__hooks._pendingEffects.forEach(invokeCleanup);\n\t\t\t\tcomponent.__hooks._pendingEffects.forEach(invokeEffect);\n\t\t\t\tcomponent.__hooks._pendingEffects = [];\n\t\t\t} catch (e) {\n\t\t\t\tcomponent.__hooks._pendingEffects = [];\n\t\t\t\toptions._catchError(e, component._vnode);\n\t\t\t}\n\t\t}\n\t});\n\tafterPaintEffects = [];\n}\n\nlet HAS_RAF = typeof requestAnimationFrame == 'function';\n\n/**\n * Schedule a callback to be invoked after the browser has a chance to paint a new frame.\n * Do this by combining requestAnimationFrame (rAF) + setTimeout to invoke a callback after\n * the next browser frame.\n *\n * Also, schedule a timeout in parallel to the the rAF to ensure the callback is invoked\n * even if RAF doesn't fire (for example if the browser tab is not visible)\n *\n * @param {() => void} callback\n */\nfunction afterNextFrame(callback) {\n\tconst done = () => {\n\t\tclearTimeout(timeout);\n\t\tif (HAS_RAF) cancelAnimationFrame(raf);\n\t\tsetTimeout(callback);\n\t};\n\tconst timeout = setTimeout(done, RAF_TIMEOUT);\n\n\tlet raf;\n\tif (HAS_RAF) {\n\t\traf = requestAnimationFrame(done);\n\t}\n}\n\n// Note: if someone used options.debounceRendering = requestAnimationFrame,\n// then effects will ALWAYS run on the NEXT frame instead of the current one, incurring a ~16ms delay.\n// Perhaps this is not such a big deal.\n/**\n * Schedule afterPaintEffects flush after the browser paints\n * @param {number} newQueueLength\n */\nfunction afterPaint(newQueueLength) {\n\tif (newQueueLength === 1 || prevRaf !== options.requestAnimationFrame) {\n\t\tprevRaf = options.requestAnimationFrame;\n\t\t(prevRaf || afterNextFrame)(flushAfterPaintEffects);\n\t}\n}\n\n/**\n * @param {import('./internal').EffectHookState} hook\n */\nfunction invokeCleanup(hook) {\n\t// A hook cleanup can introduce a call to render which creates a new root, this will call options.vnode\n\t// and move the currentComponent away.\n\tconst comp = currentComponent;\n\tif (typeof hook._cleanup == 'function') hook._cleanup();\n\tcurrentComponent = comp;\n}\n\n/**\n * Invoke a Hook's effect\n * @param {import('./internal').EffectHookState} hook\n */\nfunction invokeEffect(hook) {\n\t// A hook call can introduce a call to render which creates a new root, this will call options.vnode\n\t// and move the currentComponent away.\n\tconst comp = currentComponent;\n\thook._cleanup = hook._value();\n\tcurrentComponent = comp;\n}\n\n/**\n * @param {any[]} oldArgs\n * @param {any[]} newArgs\n */\nfunction argsChanged(oldArgs, newArgs) {\n\treturn (\n\t\t!oldArgs ||\n\t\toldArgs.length !== newArgs.length ||\n\t\tnewArgs.some((arg, index) => arg !== oldArgs[index])\n\t);\n}\n\nfunction invokeOrReturn(arg, f) {\n\treturn typeof f == 'function' ? f(arg) : f;\n}\n"],"names":["currentIndex","currentComponent","prevRaf","currentHook","afterPaintEffects","oldBeforeDiff","options","oldBeforeRender","oldAfterDiff","diffed","oldCommit","oldBeforeUnmount","unmount","getHookState","index","type","hooks","length","push","useState","initialState","useReducer","invokeOrReturn","reducer","init","hookState","_reducer","undefined","action","nextValue","setState","useLayoutEffect","callback","args","state","argsChanged","useMemo","factory","flushAfterPaintEffects","forEach","component","invokeCleanup","invokeEffect","e","vnode","c","requestAnimationFrame","raf","done","clearTimeout","timeout","HAS_RAF","cancelAnimationFrame","setTimeout","previousComponent","commitQueue","some","filter","cb","hook","comp","oldArgs","newArgs","arg","f","initialValue","current","ref","createHandle","concat","context","provider","sub","props","value","formatter","useDebugValue","errState","componentDidCatch","err"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"hooks.umd.js","sources":["../src/index.js"],"sourcesContent":["import { options } from 'preact';\n\n/** @type {number} */\nlet currentIndex;\n\n/** @type {import('./internal').Component} */\nlet currentComponent;\n\n/** @type {number} */\nlet currentHook = 0;\n\n/** @type {Array<import('./internal').Component>} */\nlet afterPaintEffects = [];\n\nlet oldBeforeDiff = options._diff;\nlet oldBeforeRender = options._render;\nlet oldAfterDiff = options.diffed;\nlet oldCommit = options._commit;\nlet oldBeforeUnmount = options.unmount;\n\nconst RAF_TIMEOUT = 100;\nlet prevRaf;\n\noptions._diff = vnode => {\n\tcurrentComponent = null;\n\tif (oldBeforeDiff) oldBeforeDiff(vnode);\n};\n\noptions._render = vnode => {\n\tif (oldBeforeRender) oldBeforeRender(vnode);\n\n\tcurrentComponent = vnode._component;\n\tcurrentIndex = 0;\n\n\tconst hooks = currentComponent.__hooks;\n\tif (hooks) {\n\t\thooks._pendingEffects.forEach(invokeCleanup);\n\t\thooks._pendingEffects.forEach(invokeEffect);\n\t\thooks._pendingEffects = [];\n\t}\n};\n\noptions.diffed = vnode => {\n\tif (oldAfterDiff) oldAfterDiff(vnode);\n\n\tconst c = vnode._component;\n\tif (c && c.__hooks && c.__hooks._pendingEffects.length) {\n\t\tafterPaint(afterPaintEffects.push(c));\n\t}\n\tcurrentComponent = null;\n};\n\noptions._commit = (vnode, commitQueue) => {\n\tcommitQueue.some(component => {\n\t\ttry {\n\t\t\tcomponent._renderCallbacks.forEach(invokeCleanup);\n\t\t\tcomponent._renderCallbacks = component._renderCallbacks.filter(cb =>\n\t\t\t\tcb._value ? invokeEffect(cb) : true\n\t\t\t);\n\t\t} catch (e) {\n\t\t\tcommitQueue.some(c => {\n\t\t\t\tif (c._renderCallbacks) c._renderCallbacks = [];\n\t\t\t});\n\t\t\tcommitQueue = [];\n\t\t\toptions._catchError(e, component._vnode);\n\t\t}\n\t});\n\n\tif (oldCommit) oldCommit(vnode, commitQueue);\n};\n\noptions.unmount = vnode => {\n\tif (oldBeforeUnmount) oldBeforeUnmount(vnode);\n\n\tconst c = vnode._component;\n\tif (c && c.__hooks) {\n\t\ttry {\n\t\t\tc.__hooks._list.forEach(invokeCleanup);\n\t\t} catch (e) {\n\t\t\toptions._catchError(e, c._vnode);\n\t\t}\n\t}\n};\n\n/**\n * Get a hook's state from the currentComponent\n * @param {number} index The index of the hook to get\n * @param {number} type The index of the hook to get\n * @returns {any}\n */\nfunction getHookState(index, type) {\n\tif (options._hook) {\n\t\toptions._hook(currentComponent, index, currentHook || type);\n\t}\n\tcurrentHook = 0;\n\n\t// Largely inspired by:\n\t// * https://github.com/michael-klein/funcy.js/blob/f6be73468e6ec46b0ff5aa3cc4c9baf72a29025a/src/hooks/core_hooks.mjs\n\t// * https://github.com/michael-klein/funcy.js/blob/650beaa58c43c33a74820a3c98b3c7079cf2e333/src/renderer.mjs\n\t// Other implementations to look at:\n\t// * https://codesandbox.io/s/mnox05qp8\n\tconst hooks =\n\t\tcurrentComponent.__hooks ||\n\t\t(currentComponent.__hooks = {\n\t\t\t_list: [],\n\t\t\t_pendingEffects: []\n\t\t});\n\n\tif (index >= hooks._list.length) {\n\t\thooks._list.push({});\n\t}\n\treturn hooks._list[index];\n}\n\n/**\n * @param {import('./index').StateUpdater<any>} [initialState]\n */\nexport function useState(initialState) {\n\tcurrentHook = 1;\n\treturn useReducer(invokeOrReturn, initialState);\n}\n\n/**\n * @param {import('./index').Reducer<any, any>} reducer\n * @param {import('./index').StateUpdater<any>} initialState\n * @param {(initialState: any) => void} [init]\n * @returns {[ any, (state: any) => void ]}\n */\nexport function useReducer(reducer, initialState, init) {\n\t/** @type {import('./internal').ReducerHookState} */\n\tconst hookState = getHookState(currentIndex++, 2);\n\thookState._reducer = reducer;\n\tif (!hookState._component) {\n\t\thookState._value = [\n\t\t\t!init ? invokeOrReturn(undefined, initialState) : init(initialState),\n\n\t\t\taction => {\n\t\t\t\tconst nextValue = hookState._reducer(hookState._value[0], action);\n\t\t\t\tif (hookState._value[0] !== nextValue) {\n\t\t\t\t\thookState._value = [nextValue, hookState._value[1]];\n\t\t\t\t\thookState._component.setState({});\n\t\t\t\t}\n\t\t\t}\n\t\t];\n\n\t\thookState._component = currentComponent;\n\t}\n\n\treturn hookState._value;\n}\n\n/**\n * @param {import('./internal').Effect} callback\n * @param {any[]} args\n */\nexport function useEffect(callback, args) {\n\t/** @type {import('./internal').EffectHookState} */\n\tconst state = getHookState(currentIndex++, 3);\n\tif (!options._skipEffects && argsChanged(state._args, args)) {\n\t\tstate._value = callback;\n\t\tstate._args = args;\n\n\t\tcurrentComponent.__hooks._pendingEffects.push(state);\n\t}\n}\n\n/**\n * @param {import('./internal').Effect} callback\n * @param {any[]} args\n */\nexport function useLayoutEffect(callback, args) {\n\t/** @type {import('./internal').EffectHookState} */\n\tconst state = getHookState(currentIndex++, 4);\n\tif (!options._skipEffects && argsChanged(state._args, args)) {\n\t\tstate._value = callback;\n\t\tstate._args = args;\n\n\t\tcurrentComponent._renderCallbacks.push(state);\n\t}\n}\n\nexport function useRef(initialValue) {\n\tcurrentHook = 5;\n\treturn useMemo(() => ({ current: initialValue }), []);\n}\n\n/**\n * @param {object} ref\n * @param {() => object} createHandle\n * @param {any[]} args\n */\nexport function useImperativeHandle(ref, createHandle, args) {\n\tcurrentHook = 6;\n\tuseLayoutEffect(\n\t\t() => {\n\t\t\tif (typeof ref == 'function') ref(createHandle());\n\t\t\telse if (ref) ref.current = createHandle();\n\t\t},\n\t\targs == null ? args : args.concat(ref)\n\t);\n}\n\n/**\n * @param {() => any} factory\n * @param {any[]} args\n */\nexport function useMemo(factory, args) {\n\t/** @type {import('./internal').MemoHookState} */\n\tconst state = getHookState(currentIndex++, 7);\n\tif (argsChanged(state._args, args)) {\n\t\tstate._value = factory();\n\t\tstate._args = args;\n\t\tstate._factory = factory;\n\t}\n\n\treturn state._value;\n}\n\n/**\n * @param {() => void} callback\n * @param {any[]} args\n */\nexport function useCallback(callback, args) {\n\tcurrentHook = 8;\n\treturn useMemo(() => callback, args);\n}\n\n/**\n * @param {import('./internal').PreactContext} context\n */\nexport function useContext(context) {\n\tconst provider = currentComponent.context[context._id];\n\t// We could skip this call here, but than we'd not call\n\t// `options._hook`. We need to do that in order to make\n\t// the devtools aware of this hook.\n\t/** @type {import('./internal').ContextHookState} */\n\tconst state = getHookState(currentIndex++, 9);\n\t// The devtools needs access to the context object to\n\t// be able to pull of the default value when no provider\n\t// is present in the tree.\n\tstate._context = context;\n\tif (!provider) return context._defaultValue;\n\t// This is probably not safe to convert to \"!\"\n\tif (state._value == null) {\n\t\tstate._value = true;\n\t\tprovider.sub(currentComponent);\n\t}\n\treturn provider.props.value;\n}\n\n/**\n * Display a custom label for a custom hook for the devtools panel\n * @type {<T>(value: T, cb?: (value: T) => string | number) => void}\n */\nexport function useDebugValue(value, formatter) {\n\tif (options.useDebugValue) {\n\t\toptions.useDebugValue(formatter ? formatter(value) : value);\n\t}\n}\n\n/**\n * @param {(error: any) => void} cb\n */\nexport function useErrorBoundary(cb) {\n\t/** @type {import('./internal').ErrorBoundaryHookState} */\n\tconst state = getHookState(currentIndex++, 10);\n\tconst errState = useState();\n\tstate._value = cb;\n\tif (!currentComponent.componentDidCatch) {\n\t\tcurrentComponent.componentDidCatch = err => {\n\t\t\tif (state._value) state._value(err);\n\t\t\terrState[1](err);\n\t\t};\n\t}\n\treturn [\n\t\terrState[0],\n\t\t() => {\n\t\t\terrState[1](undefined);\n\t\t}\n\t];\n}\n\n/**\n * After paint effects consumer.\n */\nfunction flushAfterPaintEffects() {\n\tafterPaintEffects.forEach(component => {\n\t\tif (component._parentDom) {\n\t\t\ttry {\n\t\t\t\tcomponent.__hooks._pendingEffects.forEach(invokeCleanup);\n\t\t\t\tcomponent.__hooks._pendingEffects.forEach(invokeEffect);\n\t\t\t\tcomponent.__hooks._pendingEffects = [];\n\t\t\t} catch (e) {\n\t\t\t\tcomponent.__hooks._pendingEffects = [];\n\t\t\t\toptions._catchError(e, component._vnode);\n\t\t\t}\n\t\t}\n\t});\n\tafterPaintEffects = [];\n}\n\nlet HAS_RAF = typeof requestAnimationFrame == 'function';\n\n/**\n * Schedule a callback to be invoked after the browser has a chance to paint a new frame.\n * Do this by combining requestAnimationFrame (rAF) + setTimeout to invoke a callback after\n * the next browser frame.\n *\n * Also, schedule a timeout in parallel to the the rAF to ensure the callback is invoked\n * even if RAF doesn't fire (for example if the browser tab is not visible)\n *\n * @param {() => void} callback\n */\nfunction afterNextFrame(callback) {\n\tconst done = () => {\n\t\tclearTimeout(timeout);\n\t\tif (HAS_RAF) cancelAnimationFrame(raf);\n\t\tsetTimeout(callback);\n\t};\n\tconst timeout = setTimeout(done, RAF_TIMEOUT);\n\n\tlet raf;\n\tif (HAS_RAF) {\n\t\traf = requestAnimationFrame(done);\n\t}\n}\n\n// Note: if someone used options.debounceRendering = requestAnimationFrame,\n// then effects will ALWAYS run on the NEXT frame instead of the current one, incurring a ~16ms delay.\n// Perhaps this is not such a big deal.\n/**\n * Schedule afterPaintEffects flush after the browser paints\n * @param {number} newQueueLength\n */\nfunction afterPaint(newQueueLength) {\n\tif (newQueueLength === 1 || prevRaf !== options.requestAnimationFrame) {\n\t\tprevRaf = options.requestAnimationFrame;\n\t\t(prevRaf || afterNextFrame)(flushAfterPaintEffects);\n\t}\n}\n\n/**\n * @param {import('./internal').EffectHookState} hook\n */\nfunction invokeCleanup(hook) {\n\t// A hook cleanup can introduce a call to render which creates a new root, this will call options.vnode\n\t// and move the currentComponent away.\n\tconst comp = currentComponent;\n\tif (typeof hook._cleanup == 'function') hook._cleanup();\n\tcurrentComponent = comp;\n}\n\n/**\n * Invoke a Hook's effect\n * @param {import('./internal').EffectHookState} hook\n */\nfunction invokeEffect(hook) {\n\t// A hook call can introduce a call to render which creates a new root, this will call options.vnode\n\t// and move the currentComponent away.\n\tconst comp = currentComponent;\n\thook._cleanup = hook._value();\n\tcurrentComponent = comp;\n}\n\n/**\n * @param {any[]} oldArgs\n * @param {any[]} newArgs\n */\nfunction argsChanged(oldArgs, newArgs) {\n\treturn (\n\t\t!oldArgs ||\n\t\toldArgs.length !== newArgs.length ||\n\t\tnewArgs.some((arg, index) => arg !== oldArgs[index])\n\t);\n}\n\nfunction invokeOrReturn(arg, f) {\n\treturn typeof f == 'function' ? f(arg) : f;\n}\n"],"names":["currentIndex","currentComponent","prevRaf","currentHook","afterPaintEffects","oldBeforeDiff","options","oldBeforeRender","oldAfterDiff","diffed","oldCommit","oldBeforeUnmount","unmount","getHookState","index","type","hooks","length","push","useState","initialState","useReducer","invokeOrReturn","reducer","init","hookState","_reducer","undefined","action","nextValue","setState","useLayoutEffect","callback","args","state","argsChanged","useMemo","factory","flushAfterPaintEffects","forEach","component","invokeCleanup","invokeEffect","e","vnode","c","requestAnimationFrame","raf","done","clearTimeout","timeout","HAS_RAF","cancelAnimationFrame","setTimeout","commitQueue","some","filter","cb","hook","comp","oldArgs","newArgs","arg","f","initialValue","current","ref","createHandle","concat","context","provider","sub","props","value","formatter","useDebugValue","errState","componentDidCatch","err"],"mappings":"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"}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { PreactContext, Ref as PreactRef
|
1
|
+
import { PreactContext, Ref as PreactRef } from '../..';
|
2
2
|
|
3
3
|
type Inputs = ReadonlyArray<unknown>;
|
4
4
|
|
@@ -46,8 +46,14 @@ export function useReducer<S, A, I>(
|
|
46
46
|
): [S, (action: A) => void];
|
47
47
|
|
48
48
|
/** @deprecated Use the `Ref` type instead. */
|
49
|
-
type PropRef<T> =
|
50
|
-
|
49
|
+
type PropRef<T> = MutableRef<T>;
|
50
|
+
interface Ref<T> {
|
51
|
+
readonly current: T | null;
|
52
|
+
}
|
53
|
+
|
54
|
+
interface MutableRef<T> {
|
55
|
+
current: T;
|
56
|
+
}
|
51
57
|
|
52
58
|
/**
|
53
59
|
* `useRef` returns a mutable ref object whose `.current` property is initialized to the passed argument
|
@@ -58,9 +64,9 @@ type Ref<T> = { current: T };
|
|
58
64
|
*
|
59
65
|
* @param initialValue the initial value to store in the ref object
|
60
66
|
*/
|
61
|
-
export function useRef<T>(initialValue:
|
62
|
-
export function useRef<T>(initialValue: T): Ref<T>;
|
63
|
-
export function useRef<T>():
|
67
|
+
export function useRef<T>(initialValue: T): MutableRef<T>;
|
68
|
+
export function useRef<T>(initialValue: T | null): Ref<T>;
|
69
|
+
export function useRef<T = undefined>(): MutableRef<T | undefined>;
|
64
70
|
|
65
71
|
type EffectCallback = () => void | (() => void);
|
66
72
|
/**
|
@@ -5,13 +5,6 @@ let currentIndex;
|
|
5
5
|
|
6
6
|
/** @type {import('./internal').Component} */
|
7
7
|
let currentComponent;
|
8
|
-
/**
|
9
|
-
* Keep track of the previous component so that we can set
|
10
|
-
* `currentComponent` to `null` and throw when a hook is invoked
|
11
|
-
* outside of render
|
12
|
-
* @type {import('./internal').Component}
|
13
|
-
*/
|
14
|
-
let previousComponent;
|
15
8
|
|
16
9
|
/** @type {number} */
|
17
10
|
let currentHook = 0;
|
@@ -54,7 +47,7 @@ options.diffed = vnode => {
|
|
54
47
|
if (c && c.__hooks && c.__hooks._pendingEffects.length) {
|
55
48
|
afterPaint(afterPaintEffects.push(c));
|
56
49
|
}
|
57
|
-
currentComponent =
|
50
|
+
currentComponent = null;
|
58
51
|
};
|
59
52
|
|
60
53
|
options._commit = (vnode, commitQueue) => {
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"jsxRuntime.mjs","sources":["../src/index.js"],"sourcesContent":["import { options, Fragment } from 'preact';\n\n/** @typedef {import('preact').VNode} VNode */\n\nlet vnodeId = 0;\n\n/**\n * @fileoverview\n * This file exports various methods that implement Babel's \"automatic\" JSX runtime API:\n * - jsx(type, props, key)\n * - jsxs(type, props, key)\n * - jsxDEV(type, props, key, __source, __self)\n *\n * The implementation of createVNode here is optimized for performance.\n * Benchmarks: https://esbench.com/bench/5f6b54a0b4632100a7dcd2b3\n */\n\n/**\n * JSX.Element factory used by Babel's {runtime:\"automatic\"} JSX transform\n * @param {VNode['type']} type\n * @param {VNode['props']} props\n * @param {VNode['key']} [key]\n * @param {string} [__source]\n * @param {string} [__self]\n */\nfunction createVNode(type, props, key, __source, __self) {\n\t// We'll want to preserve `ref` in props to get rid of the need for\n\t// forwardRef components in the future, but that should happen via\n\t// a separate PR.\n\tlet normalizedProps = {};\n\tfor (let i in props) {\n\t\tif (i != 'ref') {\n\t\t\tnormalizedProps[i] = props[i];\n\t\t}\n\t}\n\n\tconst vnode = {\n\t\ttype,\n\t\tprops: normalizedProps,\n\t\tkey,\n\t\tref: props && props.ref,\n\t\tconstructor: undefined,\n\t\t_vnodeId: --vnodeId,\n\t\t__source,\n\t\t__self\n\t};\n\n\t// If a Component VNode, check for and apply defaultProps.\n\t// Note: `type` is often a String, and can be `undefined` in development.\n\tlet defaults, i;\n\tif (typeof type === 'function' && (defaults = type.defaultProps)) {\n\t\tfor (i in defaults)\n\t\t\tif (normalizedProps[i] === undefined) {\n\t\t\t\tnormalizedProps[i] = defaults[i];\n\t\t\t}\n\t}\n\n\tif (options.vnode) options.vnode(vnode);\n\treturn vnode;\n}\n\nexport {\n\tcreateVNode as jsx,\n\tcreateVNode as jsxs,\n\tcreateVNode as jsxDEV,\n\tFragment\n};\n"],"names":["vnodeId","createVNode","type","props","key","__source","__self","normalizedProps","i","vnode","ref","constructor","undefined","__v","defaults","defaultProps","options"],"mappings":"8DAIA,IAAIA,EAAU,EAqBd,SAASC,EAAYC,EAAMC,EAAOC,EAAKC,EAAUC,GAIhD,IAAIC,EAAkB,GACtB,IAAK,IAAIC,KAAKL,EACJ,OAALK,IACHD,EAAgBC,GAAKL,EAAMK,IAI7B,MAAMC,EAAQ,CACbP,KAAAA,EACAC,MAAOI,EACPH,IAAAA,EACAM,IAAKP,GAASA,EAAMO,IACpBC,iBAAaC,EACbC,MAAYb,EACZK,SAAAA,EACAC,OAAAA,GAKD,IAAIQ,EAAUN,EACd,GAAoB,mBAATN,IAAwBY,EAAWZ,EAAKa,cAClD,IAAKP,KAAKM,OACkBF,IAAvBL,EAAgBC,KACnBD,EAAgBC,GAAKM,EAASN,IAKjC,OADIQ,EAAQP,OAAOO,EAAQP,MAAMA,GAC1BA"}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "preact",
|
3
3
|
"amdName": "preact",
|
4
|
-
"version": "10.
|
4
|
+
"version": "10.6.0",
|
5
5
|
"private": false,
|
6
6
|
"description": "Fast 3kb React-compatible Virtual DOM library.",
|
7
7
|
"main": "dist/preact.js",
|
@@ -58,16 +58,23 @@
|
|
58
58
|
"require": "./jsx-runtime/dist/jsxRuntime.js",
|
59
59
|
"import": "./jsx-runtime/dist/jsxRuntime.mjs"
|
60
60
|
},
|
61
|
-
|
61
|
+
"./compat/server": {
|
62
62
|
"require": "./compat/server.js",
|
63
63
|
"import": "./compat/server.mjs"
|
64
64
|
},
|
65
|
+
"./compat/jsx-runtime": {
|
66
|
+
"require": "./compat/jsx-runtime.js",
|
67
|
+
"import": "./compat/jsx-runtime.mjs"
|
68
|
+
},
|
69
|
+
"./compat/jsx-dev-runtime": {
|
70
|
+
"require": "./compat/jsx-dev-runtime.js",
|
71
|
+
"import": "./compat/jsx-dev-runtime.mjs"
|
72
|
+
},
|
65
73
|
"./compat/scheduler": {
|
66
74
|
"require": "./compat/scheduler.js",
|
67
75
|
"import": "./compat/scheduler.mjs"
|
68
76
|
},
|
69
|
-
"./package.json": "./package.json"
|
70
|
-
"./": "./"
|
77
|
+
"./package.json": "./package.json"
|
71
78
|
},
|
72
79
|
"license": "MIT",
|
73
80
|
"funding": {
|
@@ -143,6 +150,10 @@
|
|
143
150
|
"react/sort-comp": 0,
|
144
151
|
"jest/valid-expect": 0,
|
145
152
|
"jest/no-disabled-tests": 0,
|
153
|
+
"jest/no-test-callback": 0,
|
154
|
+
"jest/expect-expect": 0,
|
155
|
+
"jest/no-standalone-expect": 0,
|
156
|
+
"jest/no-export": 0,
|
146
157
|
"react/no-find-dom-node": 0
|
147
158
|
}
|
148
159
|
},
|
@@ -232,19 +243,19 @@
|
|
232
243
|
"babel-plugin-transform-rename-properties": "0.1.0",
|
233
244
|
"benchmark": "^2.1.4",
|
234
245
|
"chai": "^4.1.2",
|
235
|
-
"check-export-map": "^1.0
|
246
|
+
"check-export-map": "^1.2.0",
|
236
247
|
"coveralls": "^3.0.0",
|
237
248
|
"cross-env": "^7.0.2",
|
238
249
|
"csstype": "^3.0.5",
|
239
250
|
"diff": "^5.0.0",
|
240
251
|
"errorstacks": "^2.3.0",
|
241
|
-
"esbuild": "^0.
|
252
|
+
"esbuild": "^0.12.24",
|
242
253
|
"eslint": "5.15.1",
|
243
254
|
"eslint-config-developit": "^1.1.1",
|
244
255
|
"eslint-config-prettier": "^6.5.0",
|
245
256
|
"eslint-plugin-react": "7.12.4",
|
246
257
|
"husky": "^4.3.0",
|
247
|
-
"karma": "^
|
258
|
+
"karma": "^6.3.4",
|
248
259
|
"karma-chai-sinon": "^0.1.5",
|
249
260
|
"karma-chrome-launcher": "^3.1.0",
|
250
261
|
"karma-coverage": "^2.0.3",
|
@@ -265,6 +276,6 @@
|
|
265
276
|
"prop-types": "^15.7.2",
|
266
277
|
"sinon": "^9.2.3",
|
267
278
|
"sinon-chai": "^3.5.0",
|
268
|
-
"typescript": "
|
279
|
+
"typescript": "4.4.2"
|
269
280
|
}
|
270
281
|
}
|
@@ -75,7 +75,8 @@ export function createVNode(type, props, key, ref, original) {
|
|
75
75
|
_original: original == null ? ++vnodeId : original
|
76
76
|
};
|
77
77
|
|
78
|
-
|
78
|
+
// Only invoke the vnode hook if this was *not* a direct copy:
|
79
|
+
if (original == null && options.vnode != null) options.vnode(vnode);
|
79
80
|
|
80
81
|
return vnode;
|
81
82
|
}
|
@@ -161,7 +161,6 @@ export function diffChildren(
|
|
161
161
|
|
162
162
|
if (
|
163
163
|
typeof childVNode.type == 'function' &&
|
164
|
-
childVNode._children != null && // Can be null if childVNode suspended
|
165
164
|
childVNode._children === oldVNode._children
|
166
165
|
) {
|
167
166
|
childVNode._nextDom = oldDom = reorderChildren(
|
@@ -180,21 +179,7 @@ export function diffChildren(
|
|
180
179
|
);
|
181
180
|
}
|
182
181
|
|
183
|
-
|
184
|
-
// no value is present. This essentially bypasses our code to set it
|
185
|
-
// later in `diff()`. It works fine in all browsers except for IE11
|
186
|
-
// where it breaks setting `select.value`. There it will be always set
|
187
|
-
// to an empty string. Re-applying an options value will fix that, so
|
188
|
-
// there are probably some internal data structures that aren't
|
189
|
-
// updated properly.
|
190
|
-
//
|
191
|
-
// To fix it we make sure to reset the inferred value, so that our own
|
192
|
-
// value check in `diff()` won't be skipped.
|
193
|
-
if (!isHydrating && newParentVNode.type === 'option') {
|
194
|
-
// @ts-ignore We have validated that the type of parentDOM is 'option'
|
195
|
-
// in the above check
|
196
|
-
parentDom.value = '';
|
197
|
-
} else if (typeof newParentVNode.type == 'function') {
|
182
|
+
if (typeof newParentVNode.type == 'function') {
|
198
183
|
// Because the newParentVNode is Fragment-like, we need to set it's
|
199
184
|
// _nextDom property to the nextSibling of its last child DOM node.
|
200
185
|
//
|
@@ -244,8 +229,11 @@ export function diffChildren(
|
|
244
229
|
}
|
245
230
|
|
246
231
|
function reorderChildren(childVNode, oldDom, parentDom) {
|
247
|
-
|
248
|
-
|
232
|
+
// Note: VNodes in nested suspended trees may be missing _children.
|
233
|
+
let c = childVNode._children;
|
234
|
+
let tmp = 0;
|
235
|
+
for (; c && tmp < c.length; tmp++) {
|
236
|
+
let vnode = c[tmp];
|
249
237
|
if (vnode) {
|
250
238
|
// We typically enter this code path on sCU bailout, where we copy
|
251
239
|
// oldVNode._children to newVNode._children. If that is the case, we need
|
@@ -260,7 +248,7 @@ function reorderChildren(childVNode, oldDom, parentDom) {
|
|
260
248
|
parentDom,
|
261
249
|
vnode,
|
262
250
|
vnode,
|
263
|
-
|
251
|
+
c,
|
264
252
|
vnode._dom,
|
265
253
|
oldDom
|
266
254
|
);
|
@@ -320,8 +320,8 @@ function diffElementNodes(
|
|
320
320
|
// excessDomChildren so it isn't later removed in diffChildren
|
321
321
|
if (
|
322
322
|
child &&
|
323
|
-
|
324
|
-
|
323
|
+
'localName' in child === !!nodeType &&
|
324
|
+
(nodeType ? child.localName === nodeType : child.nodeType === 3)
|
325
325
|
) {
|
326
326
|
dom = child;
|
327
327
|
excessDomChildren[i] = null;
|
@@ -433,7 +433,9 @@ function diffElementNodes(
|
|
433
433
|
// despite the attribute not being present. When the attribute
|
434
434
|
// is missing the progress bar is treated as indeterminate.
|
435
435
|
// To fix that we'll always update it when it is 0 for progress elements
|
436
|
-
(i !==
|
436
|
+
(i !== oldProps.value ||
|
437
|
+
i !== dom.value ||
|
438
|
+
(nodeType === 'progress' && !i))
|
437
439
|
) {
|
438
440
|
setProperty(dom, 'value', i, oldProps.value, false);
|
439
441
|
}
|
@@ -265,7 +265,7 @@ export interface Options {
|
|
265
265
|
/** Attach a hook that is invoked after a vnode has rendered. */
|
266
266
|
diffed?(vnode: VNode): void;
|
267
267
|
event?(e: Event): any;
|
268
|
-
requestAnimationFrame
|
268
|
+
requestAnimationFrame?(callback: () => void): void;
|
269
269
|
debounceRendering?(cb: () => void): void;
|
270
270
|
useDebugValue?(value: string | number): void;
|
271
271
|
_addHookName?(name: string | number): void;
|
@@ -445,6 +445,10 @@ export namespace JSXInternal {
|
|
445
445
|
// Focus Events
|
446
446
|
onFocus?: FocusEventHandler<Target>;
|
447
447
|
onFocusCapture?: FocusEventHandler<Target>;
|
448
|
+
onfocusin?: FocusEventHandler<Target>;
|
449
|
+
onfocusinCapture?: FocusEventHandler<Target>;
|
450
|
+
onfocusout?: FocusEventHandler<Target>;
|
451
|
+
onfocusoutCapture?: FocusEventHandler<Target>;
|
448
452
|
onBlur?: FocusEventHandler<Target>;
|
449
453
|
onBlurCapture?: FocusEventHandler<Target>;
|
450
454
|
|
@@ -453,6 +457,8 @@ export namespace JSXInternal {
|
|
453
457
|
onChangeCapture?: GenericEventHandler<Target>;
|
454
458
|
onInput?: GenericEventHandler<Target>;
|
455
459
|
onInputCapture?: GenericEventHandler<Target>;
|
460
|
+
onBeforeInput?: GenericEventHandler<Target>;
|
461
|
+
onBeforeInputCapture?: GenericEventHandler<Target>;
|
456
462
|
onSearch?: GenericEventHandler<Target>;
|
457
463
|
onSearchCapture?: GenericEventHandler<Target>;
|
458
464
|
onSubmit?: GenericEventHandler<Target>;
|
@@ -621,6 +627,7 @@ export namespace JSXInternal {
|
|
621
627
|
acceptCharset?: string;
|
622
628
|
accessKey?: string;
|
623
629
|
action?: string;
|
630
|
+
allow?: string;
|
624
631
|
allowFullScreen?: boolean;
|
625
632
|
allowTransparency?: boolean;
|
626
633
|
alt?: string;
|
@@ -639,6 +646,7 @@ export namespace JSXInternal {
|
|
639
646
|
charSet?: string;
|
640
647
|
challenge?: string;
|
641
648
|
checked?: boolean;
|
649
|
+
cite?: string;
|
642
650
|
class?: string;
|
643
651
|
className?: string;
|
644
652
|
cols?: number;
|
@@ -661,6 +669,14 @@ export namespace JSXInternal {
|
|
661
669
|
decoding?: 'sync' | 'async' | 'auto';
|
662
670
|
draggable?: boolean;
|
663
671
|
encType?: string;
|
672
|
+
enterkeyhint?:
|
673
|
+
| 'enter'
|
674
|
+
| 'done'
|
675
|
+
| 'go'
|
676
|
+
| 'next'
|
677
|
+
| 'previous'
|
678
|
+
| 'search'
|
679
|
+
| 'send';
|
664
680
|
form?: string;
|
665
681
|
formAction?: string;
|
666
682
|
formEncType?: string;
|
@@ -704,11 +720,13 @@ export namespace JSXInternal {
|
|
704
720
|
multiple?: boolean;
|
705
721
|
muted?: boolean;
|
706
722
|
name?: string;
|
723
|
+
nomodule?: boolean;
|
707
724
|
nonce?: string;
|
708
725
|
noValidate?: boolean;
|
709
726
|
open?: boolean;
|
710
727
|
optimum?: number;
|
711
728
|
pattern?: string;
|
729
|
+
ping?: string;
|
712
730
|
placeholder?: string;
|
713
731
|
playsInline?: boolean;
|
714
732
|
poster?: string;
|
@@ -716,8 +734,18 @@ export namespace JSXInternal {
|
|
716
734
|
radioGroup?: string;
|
717
735
|
readonly?: boolean;
|
718
736
|
readOnly?: boolean;
|
737
|
+
referrerpolicy?:
|
738
|
+
| 'no-referrer'
|
739
|
+
| 'no-referrer-when-downgrade'
|
740
|
+
| 'origin'
|
741
|
+
| 'origin-when-cross-origin'
|
742
|
+
| 'same-origin'
|
743
|
+
| 'strict-origin'
|
744
|
+
| 'strict-origin-when-cross-origin'
|
745
|
+
| 'unsafe-url';
|
719
746
|
rel?: string;
|
720
747
|
required?: boolean;
|
748
|
+
reversed?: boolean;
|
721
749
|
role?: string;
|
722
750
|
rows?: number;
|
723
751
|
rowSpan?: number;
|
@@ -755,8 +783,23 @@ export namespace JSXInternal {
|
|
755
783
|
wrap?: string;
|
756
784
|
|
757
785
|
// Non-standard Attributes
|
758
|
-
autocapitalize?:
|
759
|
-
|
786
|
+
autocapitalize?:
|
787
|
+
| 'off'
|
788
|
+
| 'none'
|
789
|
+
| 'on'
|
790
|
+
| 'sentences'
|
791
|
+
| 'words'
|
792
|
+
| 'characters';
|
793
|
+
autoCapitalize?:
|
794
|
+
| 'off'
|
795
|
+
| 'none'
|
796
|
+
| 'on'
|
797
|
+
| 'sentences'
|
798
|
+
| 'words'
|
799
|
+
| 'characters';
|
800
|
+
disablePictureInPicture?: boolean;
|
801
|
+
results?: number;
|
802
|
+
translate?: 'yes' | 'no';
|
760
803
|
|
761
804
|
// RDFa Attributes
|
762
805
|
about?: string;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"testUtils.
|
1
|
+
{"version":3,"file":"testUtils.mjs","sources":["../src/index.js"],"sourcesContent":["import { options } from 'preact';\n\n/**\n * Setup a rerender function that will drain the queue of pending renders\n * @returns {() => void}\n */\nexport function setupRerender() {\n\toptions.__test__previousDebounce = options.debounceRendering;\n\toptions.debounceRendering = cb => (options.__test__drainQueue = cb);\n\treturn () => options.__test__drainQueue && options.__test__drainQueue();\n}\n\nconst isThenable = value => value != null && typeof value.then == 'function';\n\n/** Depth of nested calls to `act`. */\nlet actDepth = 0;\n\n/**\n * Run a test function, and flush all effects and rerenders after invoking it.\n *\n * Returns a Promise which resolves \"immediately\" if the callback is\n * synchronous or when the callback's result resolves if it is asynchronous.\n *\n * @param {() => void|Promise<void>} cb The function under test. This may be sync or async.\n * @return {Promise<void>}\n */\nexport function act(cb) {\n\tif (++actDepth > 1) {\n\t\t// If calls to `act` are nested, a flush happens only when the\n\t\t// outermost call returns. In the inner call, we just execute the\n\t\t// callback and return since the infrastructure for flushing has already\n\t\t// been set up.\n\t\t//\n\t\t// If an exception occurs, the outermost `act` will handle cleanup.\n\t\tconst result = cb();\n\t\tif (isThenable(result)) {\n\t\t\treturn result.then(() => {\n\t\t\t\t--actDepth;\n\t\t\t});\n\t\t}\n\t\t--actDepth;\n\t\treturn Promise.resolve();\n\t}\n\n\tconst previousRequestAnimationFrame = options.requestAnimationFrame;\n\tconst rerender = setupRerender();\n\n\t/** @type {() => void} */\n\tlet flush, toFlush;\n\n\t// Override requestAnimationFrame so we can flush pending hooks.\n\toptions.requestAnimationFrame = fc => (flush = fc);\n\n\tconst finish = () => {\n\t\ttry {\n\t\t\trerender();\n\t\t\twhile (flush) {\n\t\t\t\ttoFlush = flush;\n\t\t\t\tflush = null;\n\n\t\t\t\ttoFlush();\n\t\t\t\trerender();\n\t\t\t}\n\t\t\tteardown();\n\t\t} catch (e) {\n\t\t\tif (!err) {\n\t\t\t\terr = e;\n\t\t\t}\n\t\t}\n\n\t\toptions.requestAnimationFrame = previousRequestAnimationFrame;\n\t\t--actDepth;\n\t};\n\n\tlet err;\n\tlet result;\n\n\ttry {\n\t\tresult = cb();\n\t} catch (e) {\n\t\terr = e;\n\t}\n\n\tif (isThenable(result)) {\n\t\treturn result.then(finish, err => {\n\t\t\tfinish();\n\t\t\tthrow err;\n\t\t});\n\t}\n\n\t// nb. If the callback is synchronous, effects must be flushed before\n\t// `act` returns, so that the caller does not have to await the result,\n\t// even though React recommends this.\n\tfinish();\n\tif (err) {\n\t\tthrow err;\n\t}\n\treturn Promise.resolve();\n}\n\n/**\n * Teardown test environment and reset preact's internal state\n */\nexport function teardown() {\n\tif (options.__test__drainQueue) {\n\t\t// Flush any pending updates leftover by test\n\t\toptions.__test__drainQueue();\n\t\tdelete options.__test__drainQueue;\n\t}\n\n\tif (typeof options.__test__previousDebounce != 'undefined') {\n\t\toptions.debounceRendering = options.__test__previousDebounce;\n\t\tdelete options.__test__previousDebounce;\n\t} else {\n\t\toptions.debounceRendering = undefined;\n\t}\n}\n"],"names":["setupRerender","options","__test__previousDebounce","debounceRendering","cb","__test__drainQueue","isThenable","value","then","actDepth","act","result","Promise","resolve","previousRequestAnimationFrame","requestAnimationFrame","rerender","flush","toFlush","fc","finish","teardown","e","err","undefined"],"mappings":"0CAMgBA,IAGf,OAFAC,EAAQC,EAA2BD,EAAQE,kBAC3CF,EAAQE,kBAAoBC,GAAOH,EAAQI,EAAqBD,EACzD,IAAMH,EAAQI,GAAsBJ,EAAQI,IAGpD,MAAMC,EAAaC,GAAkB,MAATA,GAAsC,mBAAdA,EAAMC,KAG1D,IAAIC,EAAW,WAWCC,EAAIN,GACnB,KAAMK,EAAW,EAAG,CAOnB,MAAME,EAASP,IACf,OAAIE,EAAWK,GACPA,EAAOH,KAAK,OAChBC,OAGFA,EACKG,QAAQC,WAGhB,MAAMC,EAAgCb,EAAQc,sBACxCC,EAAWhB,IAGjB,IAAIiB,EAAOC,EAGXjB,EAAQc,sBAAwBI,GAAOF,EAAQE,EAE/C,MAAMC,EAAS,KACd,IAEC,IADAJ,IACOC,GACNC,EAAUD,EACVA,EAAQ,KAERC,IACAF,IAEDK,IACC,MAAOC,GACHC,IACJA,EAAMD,GAIRrB,EAAQc,sBAAwBD,IAC9BL,GAGH,IAAIc,EACAZ,EAEJ,IACCA,EAASP,IACR,MAAOkB,GACRC,EAAMD,EAGP,GAAIhB,EAAWK,GACd,OAAOA,EAAOH,KAAKY,EAAQG,IAE1B,MADAH,IACMG,IAQR,GADAH,IACIG,EACH,MAAMA,EAEP,OAAOX,QAAQC,mBAMAQ,IACXpB,EAAQI,IAEXJ,EAAQI,WACDJ,EAAQI,QAG+B,IAApCJ,EAAQC,GAClBD,EAAQE,kBAAoBF,EAAQC,SAC7BD,EAAQC,GAEfD,EAAQE,uBAAoBqB"}
|
@@ -127,7 +127,7 @@ const flattenChildren = (children) => {
|
|
127
127
|
return Array.isArray(children)
|
128
128
|
? [].concat(
|
129
129
|
...children.map((c) =>
|
130
|
-
c.type === preact.Fragment
|
130
|
+
c && c.type === preact.Fragment
|
131
131
|
? flattenChildren(c.props.children)
|
132
132
|
: flattenChildren(c)
|
133
133
|
)
|
@@ -14,11 +14,11 @@ const eventReplaceState = "replaceState";
|
|
14
14
|
const events = [eventPopstate, eventPushState, eventReplaceState];
|
15
15
|
|
16
16
|
var locationHook = ({ base = "" } = {}) => {
|
17
|
-
const [
|
17
|
+
const [{ path, search }, update] = hooks.useState(() => ({
|
18
18
|
path: currentPathname(base),
|
19
19
|
search: location.search,
|
20
20
|
})); // @see https://reactjs.org/docs/hooks-reference.html#lazy-initial-state
|
21
|
-
const prevHash = hooks.useRef(
|
21
|
+
const prevHash = hooks.useRef(path + search);
|
22
22
|
|
23
23
|
hooks.useEffect(() => {
|
24
24
|
// this function checks if the location has been changed since the
|
@@ -32,18 +32,18 @@ var locationHook = ({ base = "" } = {}) => {
|
|
32
32
|
|
33
33
|
if (prevHash.current !== hash) {
|
34
34
|
prevHash.current = hash;
|
35
|
-
update({ path: pathname, search
|
35
|
+
update({ path: pathname, search });
|
36
36
|
}
|
37
37
|
};
|
38
38
|
|
39
|
-
events.
|
39
|
+
events.forEach((e) => addEventListener(e, checkForUpdates));
|
40
40
|
|
41
41
|
// it's possible that an update has occurred between render and the effect handler,
|
42
42
|
// so we run additional check on mount to catch these updates. Based on:
|
43
43
|
// https://gist.github.com/bvaughn/e25397f70e8c65b0ae0d7c90b731b189
|
44
44
|
checkForUpdates();
|
45
45
|
|
46
|
-
return () => events.
|
46
|
+
return () => events.forEach((e) => removeEventListener(e, checkForUpdates));
|
47
47
|
}, [base]);
|
48
48
|
|
49
49
|
// the 2nd argument of the `useLocation` return value is a function
|
@@ -62,7 +62,7 @@ var locationHook = ({ base = "" } = {}) => {
|
|
62
62
|
[base]
|
63
63
|
);
|
64
64
|
|
65
|
-
return [
|
65
|
+
return [path, navigate];
|
66
66
|
};
|
67
67
|
|
68
68
|
// While History API does have `popstate` event, the only
|