UNPKG

@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
'use strict'; 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