isomorfeus-preact 10.7.3 → 10.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/preact/version.rb +1 -1
- data/node_modules/.package-lock.json +3 -3
- data/node_modules/preact/compat/LICENSE +21 -0
- data/node_modules/preact/compat/client.js +11 -5
- data/node_modules/preact/compat/client.mjs +7 -3
- 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.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/package.json +47 -17
- data/node_modules/preact/compat/src/render.js +9 -0
- data/node_modules/preact/debug/LICENSE +21 -0
- data/node_modules/preact/debug/package.json +24 -16
- data/node_modules/preact/devtools/LICENSE +21 -0
- 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.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/package.json +9 -0
- data/node_modules/preact/devtools/src/devtools.js +1 -1
- 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.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/LICENSE +21 -0
- 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.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/package.json +33 -24
- data/node_modules/preact/hooks/src/index.js +17 -4
- data/node_modules/preact/jsx-runtime/LICENSE +21 -0
- data/node_modules/preact/jsx-runtime/package.json +9 -0
- data/node_modules/preact/package.json +1 -1
- data/node_modules/preact/src/diff/index.js +20 -6
- data/node_modules/preact/test-utils/package.json +26 -17
- data/package.json +1 -1
- metadata +7 -9
- data/node_modules/preact/compat/dist/compat.mjs.map +0 -1
- data/node_modules/preact/debug/dist/debug.mjs.map +0 -1
- data/node_modules/preact/devtools/dist/devtools.mjs.map +0 -1
- data/node_modules/preact/dist/preact.mjs.map +0 -1
- data/node_modules/preact/hooks/dist/hooks.mjs.map +0 -1
- data/node_modules/preact/jsx-runtime/dist/jsxRuntime.mjs.map +0 -1
- data/node_modules/preact/test-utils/dist/testUtils.mjs.map +0 -1
@@ -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/** @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\tlet hasErrored;\n\t\tc.__hooks._list.forEach(s => {\n\t\t\ttry {\n\t\t\t\tinvokeCleanup(s);\n\t\t\t} catch (e) {\n\t\t\t\thasErrored = e;\n\t\t\t}\n\t\t});\n\t\tif (hasErrored) options._catchError(hasErrored, c._vnode);\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') {\n\t\t\t\tref(createHandle());\n\t\t\t\treturn () => ref(null);\n\t\t\t} else if (ref) {\n\t\t\t\tref.current = createHandle();\n\t\t\t\treturn () => ref.current = null;\n\t\t\t}\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\tlet component;\n\twhile ((component = afterPaintEffects.shift())) {\n\t\tif (!component._parentDom) continue;\n\t\ttry {\n\t\t\tcomponent.__hooks._pendingEffects.forEach(invokeCleanup);\n\t\t\tcomponent.__hooks._pendingEffects.forEach(invokeEffect);\n\t\t\tcomponent.__hooks._pendingEffects = [];\n\t\t} catch (e) {\n\t\t\tcomponent.__hooks._pendingEffects = [];\n\t\t\toptions._catchError(e, component._vnode);\n\t\t}\n\t}\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\tlet cleanup = hook._cleanup;\n\tif (typeof cleanup == 'function') {\n\t\thook._cleanup = undefined;\n\t\tcleanup();\n\t}\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","component","shift","forEach","invokeCleanup","invokeEffect","e","vnode","c","requestAnimationFrame","raf","done","clearTimeout","timeout","HAS_RAF","cancelAnimationFrame","setTimeout","commitQueue","some","filter","hasErrored","s","hook","comp","cleanup","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 {import('./internal').Component} */\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\tif (previousComponent === currentComponent) {\n\t\t\thooks._pendingEffects = [];\n\t\t\tcurrentComponent._renderCallbacks = [];\n\t\t\thooks._list.forEach(hookItem => {\n\t\t\t\tif (hookItem._args) hookItem._args = undefined;\n\t\t\t});\n\t\t} else {\n\t\t\thooks._pendingEffects.forEach(invokeCleanup);\n\t\t\thooks._pendingEffects.forEach(invokeEffect);\n\t\t\thooks._pendingEffects = [];\n\t\t}\n\t}\n\tpreviousComponent = currentComponent;\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\tpreviousComponent = 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\tlet hasErrored;\n\t\tc.__hooks._list.forEach(s => {\n\t\t\ttry {\n\t\t\t\tinvokeCleanup(s);\n\t\t\t} catch (e) {\n\t\t\t\thasErrored = e;\n\t\t\t}\n\t\t});\n\t\tif (hasErrored) options._catchError(hasErrored, c._vnode);\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') {\n\t\t\t\tref(createHandle());\n\t\t\t\treturn () => ref(null);\n\t\t\t} else if (ref) {\n\t\t\t\tref.current = createHandle();\n\t\t\t\treturn () => (ref.current = null);\n\t\t\t}\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\tlet component;\n\twhile ((component = afterPaintEffects.shift())) {\n\t\tif (!component._parentDom) continue;\n\t\ttry {\n\t\t\tcomponent.__hooks._pendingEffects.forEach(invokeCleanup);\n\t\t\tcomponent.__hooks._pendingEffects.forEach(invokeEffect);\n\t\t\tcomponent.__hooks._pendingEffects = [];\n\t\t} catch (e) {\n\t\t\tcomponent.__hooks._pendingEffects = [];\n\t\t\toptions._catchError(e, component._vnode);\n\t\t}\n\t}\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\tlet cleanup = hook._cleanup;\n\tif (typeof cleanup == 'function') {\n\t\thook._cleanup = undefined;\n\t\tcleanup();\n\t}\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","previousComponent","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","component","shift","forEach","invokeCleanup","invokeEffect","e","vnode","hookItem","c","requestAnimationFrame","raf","done","clearTimeout","timeout","HAS_RAF","cancelAnimationFrame","setTimeout","commitQueue","some","filter","hasErrored","s","hook","comp","cleanup","oldArgs","newArgs","arg","f"],"mappings":"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"}
|
@@ -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,r,o,i=0,
|
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,r,o,i,c=0,f=[],e=t.options.__b,a=t.options.__r,v=t.options.diffed,l=t.options.__c,p=t.options.unmount;function d(n,u){t.options.__h&&t.options.__h(r,n,c||u),c=0;var o=r.__H||(r.__H={__:[],__h:[]});return n>=o.__.length&&o.__.push({}),o.__[n]}function m(n){return c=1,y(T,n)}function y(n,t,o){var i=d(u++,2);return i.t=n,i.__c||(i.__=[o?o(t):T(void 0,t),function(n){var t=i.t(i.__[0],n);i.__[0]!==t&&(i.__=[t,i.__[1]],i.__c.setState({}))}],i.__c=r),i.__}function s(n,o){var i=d(u++,4);!t.options.__s&&F(i.__H,o)&&(i.__=n,i.__H=o,r.__h.push(i))}function h(n,t){var r=d(u++,7);return F(r.__H,t)&&(r.__=n(),r.__H=t,r.__h=n),r.__}function _(){for(var n;n=f.shift();)if(n.__P)try{n.__H.__h.forEach(x),n.__H.__h.forEach(A),n.__H.__h=[]}catch(u){n.__H.__h=[],t.options.__e(u,n.__v)}}t.options.__b=function(n){r=null,e&&e(n)},t.options.__r=function(n){a&&a(n),u=0;var t=(r=n.__c).__H;t&&(o===r?(t.__h=[],r.__h=[],t.__.forEach(function(n){n.__H&&(n.__H=void 0)})):(t.__h.forEach(x),t.__h.forEach(A),t.__h=[])),o=r},t.options.diffed=function(n){v&&v(n);var u=n.__c;u&&u.__H&&u.__H.__h.length&&(1!==f.push(u)&&i===t.options.requestAnimationFrame||((i=t.options.requestAnimationFrame)||function(n){var t,u=function(){clearTimeout(r),q&&cancelAnimationFrame(t),setTimeout(n)},r=setTimeout(u,100);q&&(t=requestAnimationFrame(u))})(_)),r=null,o=null},t.options.__c=function(n,u){u.some(function(n){try{n.__h.forEach(x),n.__h=n.__h.filter(function(n){return!n.__||A(n)})}catch(r){u.some(function(n){n.__h&&(n.__h=[])}),u=[],t.options.__e(r,n.__v)}}),l&&l(n,u)},t.options.unmount=function(n){p&&p(n);var u,r=n.__c;r&&r.__H&&(r.__H.__.forEach(function(n){try{x(n)}catch(n){u=n}}),u&&t.options.__e(u,r.__v))};var q="function"==typeof requestAnimationFrame;function x(n){var t=r,u=n.__c;"function"==typeof u&&(n.__c=void 0,u()),r=t}function A(n){var t=r;n.__c=n.__(),r=t}function F(n,t){return!n||n.length!==t.length||t.some(function(t,u){return t!==n[u]})}function T(n,t){return"function"==typeof t?t(n):t}n.useState=m,n.useReducer=y,n.useEffect=function(n,o){var i=d(u++,3);!t.options.__s&&F(i.__H,o)&&(i.__=n,i.__H=o,r.__H.__h.push(i))},n.useLayoutEffect=s,n.useRef=function(n){return c=5,h(function(){return{current:n}},[])},n.useImperativeHandle=function(n,t,u){c=6,s(function(){return"function"==typeof n?(n(t()),function(){return n(null)}):n?(n.current=t(),function(){return n.current=null}):void 0},null==u?u:u.concat(n))},n.useMemo=h,n.useCallback=function(n,t){return c=8,h(function(){return n},t)},n.useContext=function(n){var t=r.context[n.__c],o=d(u++,9);return o.c=n,t?(null==o.__&&(o.__=!0,t.sub(r)),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=d(u++,10),o=m();return t.__=n,r.componentDidCatch||(r.componentDidCatch=function(n){t.__&&t.__(n),o[1](n)}),[o[0],function(){o[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/** @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\tlet hasErrored;\n\t\tc.__hooks._list.forEach(s => {\n\t\t\ttry {\n\t\t\t\tinvokeCleanup(s);\n\t\t\t} catch (e) {\n\t\t\t\thasErrored = e;\n\t\t\t}\n\t\t});\n\t\tif (hasErrored) options._catchError(hasErrored, c._vnode);\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') {\n\t\t\t\tref(createHandle());\n\t\t\t\treturn () => ref(null);\n\t\t\t} else if (ref) {\n\t\t\t\tref.current = createHandle();\n\t\t\t\treturn () => ref.current = null;\n\t\t\t}\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\tlet component;\n\twhile ((component = afterPaintEffects.shift())) {\n\t\tif (!component._parentDom) continue;\n\t\ttry {\n\t\t\tcomponent.__hooks._pendingEffects.forEach(invokeCleanup);\n\t\t\tcomponent.__hooks._pendingEffects.forEach(invokeEffect);\n\t\t\tcomponent.__hooks._pendingEffects = [];\n\t\t} catch (e) {\n\t\t\tcomponent.__hooks._pendingEffects = [];\n\t\t\toptions._catchError(e, component._vnode);\n\t\t}\n\t}\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\tlet cleanup = hook._cleanup;\n\tif (typeof cleanup == 'function') {\n\t\thook._cleanup = undefined;\n\t\tcleanup();\n\t}\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","component","shift","forEach","invokeCleanup","invokeEffect","e","vnode","c","requestAnimationFrame","raf","done","clearTimeout","timeout","HAS_RAF","cancelAnimationFrame","setTimeout","commitQueue","some","filter","cb","hasErrored","s","hook","comp","cleanup","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 {import('./internal').Component} */\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\tif (previousComponent === currentComponent) {\n\t\t\thooks._pendingEffects = [];\n\t\t\tcurrentComponent._renderCallbacks = [];\n\t\t\thooks._list.forEach(hookItem => {\n\t\t\t\tif (hookItem._args) hookItem._args = undefined;\n\t\t\t});\n\t\t} else {\n\t\t\thooks._pendingEffects.forEach(invokeCleanup);\n\t\t\thooks._pendingEffects.forEach(invokeEffect);\n\t\t\thooks._pendingEffects = [];\n\t\t}\n\t}\n\tpreviousComponent = currentComponent;\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\tpreviousComponent = 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\tlet hasErrored;\n\t\tc.__hooks._list.forEach(s => {\n\t\t\ttry {\n\t\t\t\tinvokeCleanup(s);\n\t\t\t} catch (e) {\n\t\t\t\thasErrored = e;\n\t\t\t}\n\t\t});\n\t\tif (hasErrored) options._catchError(hasErrored, c._vnode);\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') {\n\t\t\t\tref(createHandle());\n\t\t\t\treturn () => ref(null);\n\t\t\t} else if (ref) {\n\t\t\t\tref.current = createHandle();\n\t\t\t\treturn () => (ref.current = null);\n\t\t\t}\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\tlet component;\n\twhile ((component = afterPaintEffects.shift())) {\n\t\tif (!component._parentDom) continue;\n\t\ttry {\n\t\t\tcomponent.__hooks._pendingEffects.forEach(invokeCleanup);\n\t\t\tcomponent.__hooks._pendingEffects.forEach(invokeEffect);\n\t\t\tcomponent.__hooks._pendingEffects = [];\n\t\t} catch (e) {\n\t\t\tcomponent.__hooks._pendingEffects = [];\n\t\t\toptions._catchError(e, component._vnode);\n\t\t}\n\t}\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\tlet cleanup = hook._cleanup;\n\tif (typeof cleanup == 'function') {\n\t\thook._cleanup = undefined;\n\t\tcleanup();\n\t}\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","previousComponent","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","component","shift","forEach","invokeCleanup","invokeEffect","e","vnode","hookItem","c","requestAnimationFrame","raf","done","clearTimeout","timeout","HAS_RAF","cancelAnimationFrame","setTimeout","commitQueue","some","filter","cb","hasErrored","s","hook","comp","cleanup","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,26 +1,35 @@
|
|
1
1
|
{
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
2
|
+
"name": "preact-hooks",
|
3
|
+
"amdName": "preactHooks",
|
4
|
+
"version": "0.1.0",
|
5
|
+
"private": true,
|
6
|
+
"description": "Hook addon for Preact",
|
7
|
+
"main": "dist/hooks.js",
|
8
|
+
"module": "dist/hooks.module.js",
|
9
|
+
"umd:main": "dist/hooks.umd.js",
|
10
|
+
"source": "src/index.js",
|
11
|
+
"license": "MIT",
|
12
|
+
"types": "src/index.d.ts",
|
13
|
+
"scripts": {
|
14
|
+
"build": "microbundle build --raw",
|
15
|
+
"dev": "microbundle watch --raw --format cjs",
|
16
|
+
"test": "npm-run-all build --parallel test:karma",
|
17
|
+
"test:karma": "karma start test/karma.conf.js --single-run",
|
18
|
+
"test:karma:watch": "karma start test/karma.conf.js --no-single-run"
|
19
|
+
},
|
20
|
+
"peerDependencies": {
|
21
|
+
"preact": "^10.0.0"
|
22
|
+
},
|
23
|
+
"mangle": {
|
24
|
+
"regex": "^_"
|
25
|
+
},
|
26
|
+
"exports": {
|
27
|
+
".": {
|
28
|
+
"types": "./src/index.d.ts",
|
29
|
+
"browser": "./dist/hooks.module.js",
|
30
|
+
"umd": "./dist/hooks.umd.js",
|
31
|
+
"import": "./dist/hooks.mjs",
|
32
|
+
"require": "./dist/hooks.js"
|
33
|
+
}
|
34
|
+
}
|
26
35
|
}
|
@@ -6,6 +6,9 @@ let currentIndex;
|
|
6
6
|
/** @type {import('./internal').Component} */
|
7
7
|
let currentComponent;
|
8
8
|
|
9
|
+
/** @type {import('./internal').Component} */
|
10
|
+
let previousComponent;
|
11
|
+
|
9
12
|
/** @type {number} */
|
10
13
|
let currentHook = 0;
|
11
14
|
|
@@ -34,10 +37,19 @@ options._render = vnode => {
|
|
34
37
|
|
35
38
|
const hooks = currentComponent.__hooks;
|
36
39
|
if (hooks) {
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
+
if (previousComponent === currentComponent) {
|
41
|
+
hooks._pendingEffects = [];
|
42
|
+
currentComponent._renderCallbacks = [];
|
43
|
+
hooks._list.forEach(hookItem => {
|
44
|
+
if (hookItem._args) hookItem._args = undefined;
|
45
|
+
});
|
46
|
+
} else {
|
47
|
+
hooks._pendingEffects.forEach(invokeCleanup);
|
48
|
+
hooks._pendingEffects.forEach(invokeEffect);
|
49
|
+
hooks._pendingEffects = [];
|
50
|
+
}
|
40
51
|
}
|
52
|
+
previousComponent = currentComponent;
|
41
53
|
};
|
42
54
|
|
43
55
|
options.diffed = vnode => {
|
@@ -48,6 +60,7 @@ options.diffed = vnode => {
|
|
48
60
|
afterPaint(afterPaintEffects.push(c));
|
49
61
|
}
|
50
62
|
currentComponent = null;
|
63
|
+
previousComponent = null;
|
51
64
|
};
|
52
65
|
|
53
66
|
options._commit = (vnode, commitQueue) => {
|
@@ -202,7 +215,7 @@ export function useImperativeHandle(ref, createHandle, args) {
|
|
202
215
|
return () => ref(null);
|
203
216
|
} else if (ref) {
|
204
217
|
ref.current = createHandle();
|
205
|
-
return () => ref.current = null;
|
218
|
+
return () => (ref.current = null);
|
206
219
|
}
|
207
220
|
},
|
208
221
|
args == null ? args : args.concat(ref)
|
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2015-present Jason Miller
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
@@ -15,5 +15,14 @@
|
|
15
15
|
},
|
16
16
|
"mangle": {
|
17
17
|
"regex": "^_"
|
18
|
+
},
|
19
|
+
"exports": {
|
20
|
+
".": {
|
21
|
+
"types": "./src/index.d.ts",
|
22
|
+
"browser": "./dist/jsxRuntime.module.js",
|
23
|
+
"umd": "./dist/jsxRuntime.umd.js",
|
24
|
+
"import": "./dist/jsxRuntime.mjs",
|
25
|
+
"require": "./dist/jsxRuntime.js"
|
26
|
+
}
|
18
27
|
}
|
19
28
|
}
|
@@ -170,15 +170,29 @@ export function diff(
|
|
170
170
|
|
171
171
|
c.context = componentContext;
|
172
172
|
c.props = newProps;
|
173
|
-
c.state = c._nextState;
|
174
|
-
|
175
|
-
if ((tmp = options._render)) tmp(newVNode);
|
176
|
-
|
177
|
-
c._dirty = false;
|
178
173
|
c._vnode = newVNode;
|
179
174
|
c._parentDom = parentDom;
|
180
175
|
|
181
|
-
|
176
|
+
let renderHook = options._render,
|
177
|
+
count = 0;
|
178
|
+
if ('prototype' in newType && newType.prototype.render) {
|
179
|
+
c.state = c._nextState;
|
180
|
+
c._dirty = false;
|
181
|
+
|
182
|
+
if (renderHook) renderHook(newVNode);
|
183
|
+
|
184
|
+
tmp = c.render(c.props, c.state, c.context);
|
185
|
+
} else {
|
186
|
+
do {
|
187
|
+
c._dirty = false;
|
188
|
+
if (renderHook) renderHook(newVNode);
|
189
|
+
|
190
|
+
tmp = c.render(c.props, c.state, c.context);
|
191
|
+
|
192
|
+
// Handle setState called in render, see #2553
|
193
|
+
c.state = c._nextState;
|
194
|
+
} while (c._dirty && ++count < 25);
|
195
|
+
}
|
182
196
|
|
183
197
|
// Handle setState called in render, see #2553
|
184
198
|
c.state = c._nextState;
|
@@ -1,19 +1,28 @@
|
|
1
1
|
{
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
2
|
+
"name": "test-utils",
|
3
|
+
"amdName": "preactTestUtils",
|
4
|
+
"version": "0.1.0",
|
5
|
+
"private": true,
|
6
|
+
"description": "Test-utils for Preact",
|
7
|
+
"main": "dist/testUtils.js",
|
8
|
+
"module": "dist/testUtils.module.js",
|
9
|
+
"umd:main": "dist/testUtils.umd.js",
|
10
|
+
"source": "src/index.js",
|
11
|
+
"license": "MIT",
|
12
|
+
"types": "src/index.d.ts",
|
13
|
+
"peerDependencies": {
|
14
|
+
"preact": "^10.0.0"
|
15
|
+
},
|
16
|
+
"mangle": {
|
17
|
+
"regex": "^_"
|
18
|
+
},
|
19
|
+
"exports": {
|
20
|
+
".": {
|
21
|
+
"types": "./src/index.d.ts",
|
22
|
+
"browser": "./dist/testUtils.module.js",
|
23
|
+
"umd": "./dist/testUtils.umd.js",
|
24
|
+
"import": "./dist/testUtils.mjs",
|
25
|
+
"require": "./dist/testUtils.js"
|
26
|
+
}
|
27
|
+
}
|
19
28
|
}
|
data/package.json
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: isomorfeus-preact
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 10.
|
4
|
+
version: 10.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Biedermann
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-06-
|
11
|
+
date: 2022-06-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -290,12 +290,12 @@ files:
|
|
290
290
|
- node_modules/preact-render-to-string/typings.json
|
291
291
|
- node_modules/preact/LICENSE
|
292
292
|
- node_modules/preact/README.md
|
293
|
+
- node_modules/preact/compat/LICENSE
|
293
294
|
- node_modules/preact/compat/client.js
|
294
295
|
- node_modules/preact/compat/client.mjs
|
295
296
|
- node_modules/preact/compat/dist/compat.js
|
296
297
|
- node_modules/preact/compat/dist/compat.js.map
|
297
298
|
- node_modules/preact/compat/dist/compat.mjs
|
298
|
-
- node_modules/preact/compat/dist/compat.mjs.map
|
299
299
|
- node_modules/preact/compat/dist/compat.module.js
|
300
300
|
- node_modules/preact/compat/dist/compat.module.js.map
|
301
301
|
- node_modules/preact/compat/dist/compat.umd.js
|
@@ -325,10 +325,10 @@ files:
|
|
325
325
|
- node_modules/preact/compat/src/suspense.js
|
326
326
|
- node_modules/preact/compat/src/util.js
|
327
327
|
- node_modules/preact/compat/test-utils.js
|
328
|
+
- node_modules/preact/debug/LICENSE
|
328
329
|
- node_modules/preact/debug/dist/debug.js
|
329
330
|
- node_modules/preact/debug/dist/debug.js.map
|
330
331
|
- node_modules/preact/debug/dist/debug.mjs
|
331
|
-
- node_modules/preact/debug/dist/debug.mjs.map
|
332
332
|
- node_modules/preact/debug/dist/debug.module.js
|
333
333
|
- node_modules/preact/debug/dist/debug.module.js.map
|
334
334
|
- node_modules/preact/debug/dist/debug.umd.js
|
@@ -341,10 +341,10 @@ files:
|
|
341
341
|
- node_modules/preact/debug/src/index.js
|
342
342
|
- node_modules/preact/debug/src/internal.d.ts
|
343
343
|
- node_modules/preact/debug/src/util.js
|
344
|
+
- node_modules/preact/devtools/LICENSE
|
344
345
|
- node_modules/preact/devtools/dist/devtools.js
|
345
346
|
- node_modules/preact/devtools/dist/devtools.js.map
|
346
347
|
- node_modules/preact/devtools/dist/devtools.mjs
|
347
|
-
- node_modules/preact/devtools/dist/devtools.mjs.map
|
348
348
|
- node_modules/preact/devtools/dist/devtools.module.js
|
349
349
|
- node_modules/preact/devtools/dist/devtools.module.js.map
|
350
350
|
- node_modules/preact/devtools/dist/devtools.umd.js
|
@@ -358,15 +358,14 @@ files:
|
|
358
358
|
- node_modules/preact/dist/preact.min.js
|
359
359
|
- node_modules/preact/dist/preact.min.js.map
|
360
360
|
- node_modules/preact/dist/preact.mjs
|
361
|
-
- node_modules/preact/dist/preact.mjs.map
|
362
361
|
- node_modules/preact/dist/preact.module.js
|
363
362
|
- node_modules/preact/dist/preact.module.js.map
|
364
363
|
- node_modules/preact/dist/preact.umd.js
|
365
364
|
- node_modules/preact/dist/preact.umd.js.map
|
365
|
+
- node_modules/preact/hooks/LICENSE
|
366
366
|
- node_modules/preact/hooks/dist/hooks.js
|
367
367
|
- node_modules/preact/hooks/dist/hooks.js.map
|
368
368
|
- node_modules/preact/hooks/dist/hooks.mjs
|
369
|
-
- node_modules/preact/hooks/dist/hooks.mjs.map
|
370
369
|
- node_modules/preact/hooks/dist/hooks.module.js
|
371
370
|
- node_modules/preact/hooks/dist/hooks.module.js.map
|
372
371
|
- node_modules/preact/hooks/dist/hooks.umd.js
|
@@ -375,10 +374,10 @@ files:
|
|
375
374
|
- node_modules/preact/hooks/src/index.d.ts
|
376
375
|
- node_modules/preact/hooks/src/index.js
|
377
376
|
- node_modules/preact/hooks/src/internal.d.ts
|
377
|
+
- node_modules/preact/jsx-runtime/LICENSE
|
378
378
|
- node_modules/preact/jsx-runtime/dist/jsxRuntime.js
|
379
379
|
- node_modules/preact/jsx-runtime/dist/jsxRuntime.js.map
|
380
380
|
- node_modules/preact/jsx-runtime/dist/jsxRuntime.mjs
|
381
|
-
- node_modules/preact/jsx-runtime/dist/jsxRuntime.mjs.map
|
382
381
|
- node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js
|
383
382
|
- node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js.map
|
384
383
|
- node_modules/preact/jsx-runtime/dist/jsxRuntime.umd.js
|
@@ -407,7 +406,6 @@ files:
|
|
407
406
|
- node_modules/preact/test-utils/dist/testUtils.js
|
408
407
|
- node_modules/preact/test-utils/dist/testUtils.js.map
|
409
408
|
- node_modules/preact/test-utils/dist/testUtils.mjs
|
410
|
-
- node_modules/preact/test-utils/dist/testUtils.mjs.map
|
411
409
|
- node_modules/preact/test-utils/dist/testUtils.module.js
|
412
410
|
- node_modules/preact/test-utils/dist/testUtils.module.js.map
|
413
411
|
- node_modules/preact/test-utils/dist/testUtils.umd.js
|