@dark-engine/core
Version:
The lightweight and powerful UI rendering engine without dependencies and written in TypeScript (Browser, Node.js, Android, iOS, Windows, Linux, macOS)
173 lines (172 loc) • 6.3 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
exports.detectAreSameComponentTypesWithSameKeys =
exports.detectAreSameInstanceTypes =
exports.detectIsVirtualNodeFactory =
exports.detectIsPlainVirtualNode =
exports.detectIsTextVirtualNode =
exports.detectIsCommentVirtualNode =
exports.detectIsTagVirtualNode =
exports.detectIsVirtualNode =
exports.hasChildrenProp =
exports.getElementType =
exports.hasElementFlag =
exports.getElementKey =
exports.detectIsReplacer =
exports.createReplacer =
exports.CommentVirtualNode =
exports.TextVirtualNode =
exports.TagVirtualNode =
exports.VirtualNode =
exports.Comment =
exports.Text =
exports.View =
exports.NodeType =
void 0;
const component_1 = require('../component');
const utils_1 = require('../utils');
const constants_1 = require('../constants');
const scope_1 = require('../scope');
const $$vNode = Symbol('vNode');
const ATTR_TYPE = 'type';
class VirtualNode {
type = null;
constructor(type) {
this.type = type;
}
}
exports.VirtualNode = VirtualNode;
class TagVirtualNode extends VirtualNode {
name;
attrs;
children;
constructor(name, attrs, children) {
super(NodeType.TAG);
this.name = name;
this.attrs = attrs;
this.children = children;
}
}
exports.TagVirtualNode = TagVirtualNode;
class TextVirtualNode extends VirtualNode {
value;
constructor(source) {
super(NodeType.TEXT);
this.value = String(source);
}
}
exports.TextVirtualNode = TextVirtualNode;
class CommentVirtualNode extends VirtualNode {
value = '';
constructor(text) {
super(NodeType.COMMENT);
this.value = text;
}
}
exports.CommentVirtualNode = CommentVirtualNode;
function View(options) {
const factory = () => {
const { as: name, slot, _void = false, ...attrs } = options;
const children = _void
? []
: (0, utils_1.detectIsArray)(slot)
? slot
: !(0, utils_1.detectIsEmpty)(slot)
? [slot]
: [];
return new TagVirtualNode(name, attrs, children);
};
factory[$$vNode] = true;
factory[ATTR_TYPE] = options.as;
factory[constants_1.KEY_ATTR] = options.key;
return factory;
}
exports.View = View;
const Text = source => new TextVirtualNode(source);
exports.Text = Text;
Text.from = source => (detectIsTextVirtualNode(source) ? source.value : String(source));
const Comment = text => new CommentVirtualNode(text);
exports.Comment = Comment;
const detectIsVirtualNode = vNode => vNode instanceof VirtualNode;
exports.detectIsVirtualNode = detectIsVirtualNode;
const detectIsTagVirtualNode = vNode => vNode instanceof TagVirtualNode;
exports.detectIsTagVirtualNode = detectIsTagVirtualNode;
const detectIsCommentVirtualNode = vNode => vNode instanceof CommentVirtualNode;
exports.detectIsCommentVirtualNode = detectIsCommentVirtualNode;
const detectIsTextVirtualNode = vNode => vNode instanceof TextVirtualNode;
exports.detectIsTextVirtualNode = detectIsTextVirtualNode;
const detectIsVirtualNodeFactory = factory => (0, utils_1.detectIsFunction)(factory) && factory[$$vNode] === true;
exports.detectIsVirtualNodeFactory = detectIsVirtualNodeFactory;
const getTagVirtualNodeKey = vNode => (vNode.attrs ? vNode.attrs[constants_1.KEY_ATTR] ?? null : null);
const hasTagVirtualNodeFlag = (vNode, flag) => Boolean(vNode.attrs[flag]);
const getVirtualNodeFactoryKey = factory => factory[constants_1.KEY_ATTR] ?? null;
const hasVirtualNodeFactoryFlag = (factory, flag) => Boolean(factory[flag]);
const detectIsPlainVirtualNode = vNode => detectIsTextVirtualNode(vNode) || detectIsCommentVirtualNode(vNode);
exports.detectIsPlainVirtualNode = detectIsPlainVirtualNode;
const createReplacer = () => new CommentVirtualNode(constants_1.REPLACER);
exports.createReplacer = createReplacer;
const detectIsReplacer = vNode => detectIsCommentVirtualNode(vNode) && vNode.value === constants_1.REPLACER;
exports.detectIsReplacer = detectIsReplacer;
function getElementKey(inst) {
return (0, component_1.detectIsComponent)(inst)
? (0, component_1.getComponentKey)(inst)
: detectIsVirtualNodeFactory(inst)
? getVirtualNodeFactoryKey(inst)
: detectIsTagVirtualNode(inst)
? getTagVirtualNodeKey(inst)
: null;
}
exports.getElementKey = getElementKey;
function hasElementFlag(inst, flag) {
return (0, component_1.detectIsComponent)(inst)
? (0, component_1.hasComponentFlag)(inst, flag)
: detectIsVirtualNodeFactory(inst)
? hasVirtualNodeFactoryFlag(inst, flag)
: detectIsTagVirtualNode(inst)
? hasTagVirtualNodeFlag(inst, flag)
: false;
}
exports.hasElementFlag = hasElementFlag;
function getElementType(inst) {
return (0, component_1.detectIsComponent)(inst)
? inst.type
: detectIsVirtualNodeFactory(inst)
? inst[ATTR_TYPE]
: detectIsTagVirtualNode(inst)
? inst.name
: detectIsVirtualNode(inst)
? inst.type
: null;
}
exports.getElementType = getElementType;
function hasChildrenProp(inst) {
return detectIsTagVirtualNode(inst) || (0, component_1.detectIsComponent)(inst);
}
exports.hasChildrenProp = hasChildrenProp;
function detectAreSameInstanceTypes(prevInst, nextInst, isComponentFactories = false) {
if (process.env.NODE_ENV !== 'production') {
if (process.env.NODE_ENV === 'development' && (0, scope_1.$$scope)().getIsHot()) {
if ((0, component_1.detectIsComponent)(prevInst) && (0, component_1.detectIsComponent)(nextInst)) {
return prevInst.displayName === nextInst.displayName;
}
}
}
return isComponentFactories ? prevInst.type === nextInst.type : getElementType(prevInst) === getElementType(nextInst);
}
exports.detectAreSameInstanceTypes = detectAreSameInstanceTypes;
function detectAreSameComponentTypesWithSameKeys(prevInst, nextInst) {
return (
(0, component_1.detectIsComponent)(prevInst) &&
(0, component_1.detectIsComponent)(nextInst) &&
detectAreSameInstanceTypes(prevInst, nextInst, true) &&
getElementKey(prevInst) === getElementKey(nextInst)
);
}
exports.detectAreSameComponentTypesWithSameKeys = detectAreSameComponentTypesWithSameKeys;
var NodeType;
(function (NodeType) {
NodeType['TAG'] = 'TAG';
NodeType['TEXT'] = 'TEXT';
NodeType['COMMENT'] = 'COMMENT';
})(NodeType || (exports.NodeType = NodeType = {}));
//# sourceMappingURL=view.js.map