preact
Version:
Fast 3kb React-compatible Virtual DOM library.
69 lines (56 loc) • 1.87 kB
JavaScript
/**
*
* @param {import('../../internal').Options} options
* @param {import('./types').Renderer} renderer
*/
export function setupOptions(options, renderer) {
// Store (possible) previous hooks so that we don't overwrite them
let prevVNodeHook = options.vnode;
let prevCommitRoot = options._commit;
let prevBeforeUnmount = options.unmount;
let prevBeforeDiff = options._diff;
let prevAfterDiff = options.diffed;
options.vnode = vnode => {
// Tiny performance improvement by initializing fields as doubles
// from the start. `performance.now()` will always return a double.
// See https://github.com/facebook/react/issues/14365
// and https://slidr.io/bmeurer/javascript-engine-fundamentals-the-good-the-bad-and-the-ugly
vnode.startTime = NaN;
vnode.endTime = NaN;
vnode.startTime = 0;
vnode.endTime = -1;
/* istanbul ignore next */
if (prevVNodeHook) prevVNodeHook(vnode);
};
options._diff = vnode => {
vnode.startTime = performance.now();
/* istanbul ignore next */
if (prevBeforeDiff != null) prevBeforeDiff(vnode);
};
options.diffed = vnode => {
vnode.endTime = performance.now();
/* istanbul ignore next */
if (prevAfterDiff) prevAfterDiff(vnode);
};
options._commit = (vnode, queue) => {
/* istanbul ignore next */
if (prevCommitRoot) prevCommitRoot(vnode, queue);
// These cases are already handled by `unmount`
/* istanbul ignore next */
if (vnode == null) return;
renderer.onCommit(vnode);
};
options.unmount = vnode => {
/* istanbul ignore next */
if (prevBeforeUnmount) prevBeforeUnmount(vnode);
renderer.onUnmount(vnode);
};
// Teardown devtools options. Mainly used for testing
return () => {
options.unmount = prevBeforeUnmount;
options._commit = prevCommitRoot;
options.diffed = prevAfterDiff;
options._diff = prevBeforeDiff;
options.vnode = prevVNodeHook;
};
}