Press n or j to go to the next uncovered block, b, p or k for the previous block.
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 51x 48x 4x 4x 44x 47x 1x 1x 48x 51x 51x 51x 7x 7x 7x 7x 7x 7x 7x 7x 425x 423x 423x 2x 2x 423x 423x 423x 425x 288x 288x 135x 135x 4x 4x 131x 131x 131x 655x 655x 131x 425x 7x 7x 7x 7x 7x 7x 7x 7x 7x 475x 475x 475x 475x 475x 475x 475x 475x 475x 475x 475x 475x 422x 422x 475x 475x 475x 475x 53x 53x 53x 53x 53x 27x 27x 475x 475x 475x 475x 475x 21x 2x 21x 21x 53x 53x 475x | import process from './util/process'; import { TransitionCache, NodeCache, NODE_TYPE, VTree, TransitionStateNames, TransitionStateName, } from './util/types'; /** * * @param {TransitionStateName} stateName * @param {Function} callback * @return {void} */ export function addTransitionState(stateName, callback) { if (process.env.NODE_ENV !== 'production') { if (!TransitionStateNames.includes(stateName)) { throw new Error(`Invalid state name '${stateName}'`); } if (!callback) { throw new Error('Missing transition state callback'); } } TransitionCache.get(stateName)?.add(callback); } /** * * @param {TransitionStateName=} stateName * @param {Function=} callback * @return {void} */ export function removeTransitionState(stateName, callback) { if (process.env.NODE_ENV !== 'production') { // Only validate the stateName if the caller provides one. if (stateName && !TransitionStateNames.includes(stateName)) { throw new Error(`Invalid state name '${stateName}'`); } } // Remove all specific transition callbacks. if (!callback && stateName) { TransitionCache.get(stateName)?.clear(); } // Remove a single distinct transition callback. else if (stateName && callback) { TransitionCache.get(stateName)?.delete(callback); } // Remove all transition callbacks. else { for (let i = 0; i < TransitionStateNames.length; i++) { TransitionCache.get(TransitionStateNames[i])?.clear(); } } } /** * * @param {TransitionStateName} setName * @param {...any} args * * @return {Promise<any>[]} */ export function runTransitions(setName, ...args) { const set = TransitionCache.get(setName); /** @type {Promise<any>[]} */ const promises = []; if (!set) { return promises; } const vTree = args[0]; const isElement = vTree.nodeType === NODE_TYPE.ELEMENT; // Filter out text nodes and fragments from transition callbacks. if (!set.size || (setName !== 'textChanged' && !isElement)) { return promises; } // Run each transition callback, but only if the passed args are an // Element. set.forEach(callback => { const nodes = args.map(x => NodeCache.get(x) || x); const retVal = callback(...nodes); // Is a `thennable` object or Native Promise. if (typeof retVal === 'object' && retVal.then) { promises.push(retVal); } }); // For attached and detached transitions, dig into children to ensure // all are run with this. if (setName === 'attached' || setName === 'detached') { vTree.childNodes.forEach((/** @type {VTree} */ childTree) => { promises.push(...runTransitions(setName, childTree, ...args.slice(1))); }); } return promises; } |