UNPKG

preact

Version:

Fast 3kb React-compatible Virtual DOM library.

69 lines (56 loc) 1.87 kB
/** * * @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; }; }