Skip to content

Commit

Permalink
bump: version 0.4.1
Browse files Browse the repository at this point in the history
  • Loading branch information
shenjunru committed Jun 6, 2022
1 parent b844f93 commit 5772bb9
Show file tree
Hide file tree
Showing 4 changed files with 165 additions and 146 deletions.
149 changes: 79 additions & 70 deletions lib/cjs/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ exports.FiberVisit = Object.freeze({
Return: 0b000100,
Effect: 0b001000,
Break: 0b010000,
SiblingFirst: 0b100000,
});
exports.FiberTag = Object.freeze({
FunctionComponent: 0,
Expand Down Expand Up @@ -126,21 +127,30 @@ const isHostFiber = (fiber) => {
}
return false;
};
const pushVisitStack = (stack, scope, fiber, flags) => {
if (scope !== fiber && flags === exports.FiberVisit.Child) {
const pushVisitStack = (stack, scope, fiber, flags, callback) => {
if (flags === exports.FiberVisit.Return) {
fiber.return && stack.push(fiber.return);
return;
}
if (flags === exports.FiberVisit.Effect) {
fiber.nextEffect && stack.push(fiber.nextEffect);
return;
}
if (scope !== fiber && (flags & ~exports.FiberVisit.SiblingFirst) === exports.FiberVisit.Child) {
flags |= exports.FiberVisit.Sibling;
}
const siblingFirst = flags & exports.FiberVisit.SiblingFirst;
if (flags & exports.FiberVisit.Sibling) {
fiber.sibling && stack.push(fiber.sibling);
siblingFirst || fiber.sibling && stack.push(fiber.sibling);
}
if (isFunction(callback)) {
stack.push(callback);
}
if (flags & exports.FiberVisit.Child) {
fiber.child && stack.push(fiber.child);
}
if (flags === exports.FiberVisit.Return) {
fiber.return && stack.push(fiber.return);
}
if (flags === exports.FiberVisit.Effect) {
fiber.nextEffect && stack.push(fiber.nextEffect);
if (flags & exports.FiberVisit.Sibling) {
siblingFirst && fiber.sibling && stack.push(fiber.sibling);
}
};
const findFiber = (fiber, predicate, flags = exports.FiberVisit.Child) => {
Expand All @@ -156,7 +166,7 @@ const findFiber = (fiber, predicate, flags = exports.FiberVisit.Child) => {
if (predicate(current)) {
return current;
}
pushVisitStack(stack, fiber, current, flags);
pushVisitStack(stack, fiber, current, flags, null);
}
return null;
};
Expand All @@ -175,7 +185,7 @@ const findFibers = (fiber, predicate, flags = exports.FiberVisit.Child) => {
if (predicate(current)) {
result.push(current);
}
pushVisitStack(stack, fiber, current, flags);
pushVisitStack(stack, fiber, current, flags, null);
}
return result;
};
Expand Down Expand Up @@ -206,10 +216,7 @@ const traverseFiber = (fiber, visit, flags = exports.FiberVisit.Child) => {
if (post === exports.FiberVisit.Break) {
continue;
}
if (isFunction(post)) {
stack.push(post);
}
pushVisitStack(stack, fiber, current, flags);
pushVisitStack(stack, fiber, current, flags, post);
}
};
exports.traverseFiber = traverseFiber;
Expand All @@ -226,10 +233,10 @@ const findChildHostFibers = (fiber) => {
}
if (isHostFiber(current)) {
result.push(current);
pushVisitStack(stack, fiber, current, exports.FiberVisit.Sibling);
pushVisitStack(stack, fiber, current, exports.FiberVisit.Sibling, null);
}
else {
pushVisitStack(stack, fiber, current, exports.FiberVisit.Child | exports.FiberVisit.Sibling);
pushVisitStack(stack, fiber, current, exports.FiberVisit.Child | exports.FiberVisit.Sibling, null);
}
}
return result;
Expand Down Expand Up @@ -438,15 +445,13 @@ const appendFiberEffect = (rootFiber, effectFiber, renderFiber, finishFiber) =>
rootFiber[FiberEffectProp] |= flags;
fiber[FiberEffectProp] |= flags;
fiber.nextEffect = null;
return () => {
if (exports.FiberFlag.NoFlags === (fiber[FiberEffectProp] & exports.FiberFlag.LifecycleEffectMask)) {
return;
}
if (exports.FiberFlag.NoFlags !== (fiber[FiberEffectProp] & exports.FiberFlag.LifecycleEffectMask)) {
const nextEffect = effectFiber.nextEffect;
effectFiber.nextEffect = fiber;
fiber.nextEffect = nextEffect;
};
});
}
return null;
}, exports.FiberVisit.Child | exports.FiberVisit.SiblingFirst);
}
};
exports.appendFiberEffect = appendFiberEffect;
Expand All @@ -458,7 +463,7 @@ const defineFiberProp = (fiber, prop, value) => {
value,
});
};
const protectFiberProp = (fiber, prop, restore) => {
const protectFiberProp = (fiber, prop, restore, needDummy) => {
if (null == fiber) {
return;
}
Expand All @@ -468,12 +473,11 @@ const protectFiberProp = (fiber, prop, restore) => {
}
const backup = fiber[prop];
let value = backup;
if (!restore.current && prop === 'stateNode' && isHostFiber(fiber)) {
if (needDummy && prop === 'stateNode' && isHostFiber(fiber)) {
value = null;
if (backup === null || backup === void 0 ? void 0 : backup.parentNode) {
const dummy = document.createElement('div');
backup.parentNode.appendChild(dummy);
value = dummy;
value = document.createElement('dummy');
backup.parentNode.appendChild(value);
}
}
Object.defineProperty(fiber, prop, {
Expand All @@ -492,13 +496,13 @@ const restoreFiberProp = (fiber, prop) => {
defineFiberProp(fiber, prop, fiber[prop]);
}
};
const protectFiberProps = (fiber, current, restore) => {
const protectFiberProps = (fiber, current, restore, needDummy) => {
const alternate = fiber.alternate;
if (alternate && !current) {
protectFiberProps(alternate, fiber, restore);
protectFiberProps(alternate, fiber, restore, false);
}
for (const prop of ProtectedFiberProps) {
protectFiberProp(fiber, prop, restore);
protectFiberProp(fiber, prop, restore, needDummy);
}
};
const restoreFiberProps = (fiber, current) => {
Expand All @@ -513,57 +517,62 @@ const restoreFiberProps = (fiber, current) => {
}
}
};
const protectChildHostNodes = (fiber, restore) => {
const hostFibers = (0, exports.findChildHostFibers)(fiber);
hostFibers.forEach((hostFiber) => {
protectFiberProp(hostFiber, 'stateNode', restore);
const hostNode = getHostNode(hostFiber);
const parentNode = hostNode === null || hostNode === void 0 ? void 0 : hostNode.parentNode;
if (hostNode && parentNode) {
const dummy = document.createElement('div');
parentNode.replaceChild(dummy, hostNode);
hostFiber.stateNode = dummy;
}
});
};
const protectFiber = (fiber) => {
const restore = { current: true };
const portalFibers = (0, exports.findFibers)(fiber, (node) => node.tag === exports.FiberTag.HostPortal);
portalFibers.forEach((portalFiber) => protectChildHostNodes(portalFiber.child, restore));
protectChildHostNodes(fiber, restore);
const stack = [true];
(0, exports.traverseFiber)(fiber, (node) => {
const needDummy = isHostFiber(node) && true === stack[0];
if (needDummy) {
protectFiberProp(node, 'stateNode', restore, false);
const hostNode = getHostNode(node);
const parentNode = hostNode === null || hostNode === void 0 ? void 0 : hostNode.parentNode;
if (hostNode && parentNode) {
const dummy = document.createElement('dummy');
parentNode.replaceChild(dummy, hostNode);
node.stateNode = dummy;
}
}
if (UseDeepDetach || node === fiber) {
protectFiberProps(node, null, restore, true);
}
if (node.tag === exports.FiberTag.HostPortal) {
stack.unshift(true);
return () => stack.shift();
}
if (needDummy) {
stack.unshift(false);
return () => stack.shift();
}
return null;
});
restore.current = false;
if (UseDeepDetach) {
(0, exports.traverseFiber)(fiber, (node) => () => {
protectFiberProps(node, null, restore);
});
}
else {
protectFiberProps(fiber, null, restore);
}
return restore;
};
exports.protectFiber = protectFiber;
const restoreFiber = (fiber, restore) => {
restore.current = true;
if (UseDeepDetach) {
(0, exports.traverseFiber)(fiber, (node) => () => {
const stack = [true];
(0, exports.traverseFiber)(fiber, (node) => {
const needRestore = isHostFiber(node) && true === stack[0];
if (UseDeepDetach || node === fiber) {
restoreFiberProps(node, null);
traverseEffectHooks(node, (effect) => {
effect.destroy = undefined;
});
});
}
else {
restoreFiberProps(fiber, null);
(0, exports.findChildHostFibers)(fiber).forEach((node) => {
}
else if (needRestore) {
restoreFiberProp(node, 'stateNode');
}
traverseEffectHooks(node, (effect) => {
effect.destroy = undefined;
});
(0, exports.traverseFiber)(fiber, (node) => {
traverseEffectHooks(node, (effect) => {
effect.destroy = undefined;
});
});
}
if (node.tag === exports.FiberTag.HostPortal) {
stack.unshift(true);
return () => stack.shift();
}
if (needRestore) {
stack.unshift(false);
return () => stack.shift();
}
return null;
});
restore.current = false;
};
exports.restoreFiber = restoreFiber;
Loading

0 comments on commit 5772bb9

Please sign in to comment.