Comparing version 8.0.8 to 8.0.9
@@ -5,2 +5,10 @@ # Changelog | ||
### [8.0.9](https://github.com/hybridsjs/hybrids/compare/v8.0.8...v8.0.9) (2022-07-08) | ||
### Bug Fixes | ||
* **html:** remove styles from templates ids with better caching ([c252636](https://github.com/hybridsjs/hybrids/commit/c2526364062de7d5821d1d2154157e0e70c4061b)) | ||
* **store:** get singleton model before update to not overwrite properties with default values ([2844e91](https://github.com/hybridsjs/hybrids/commit/2844e9108db27c5837db7e3464bbe6a0c15d2bce)) | ||
### [8.0.8](https://github.com/hybridsjs/hybrids/compare/v8.0.7...v8.0.8) (2022-06-30) | ||
@@ -7,0 +15,0 @@ |
{ | ||
"name": "hybrids", | ||
"version": "8.0.8", | ||
"version": "8.0.9", | ||
"description": "A JavaScript framework for creating fully-featured web applications, components libraries, and single web components with unique declarative and functional architecture", | ||
@@ -46,3 +46,3 @@ "type": "module", | ||
"karma-coverage": "^2.1.0", | ||
"karma-jasmine": "^4.0.1", | ||
"karma-jasmine": "^5.1.0", | ||
"karma-sauce-launcher": "^4.3.5", | ||
@@ -49,0 +49,0 @@ "prettier": "^2.5.1", |
@@ -29,3 +29,3 @@ /* eslint-disable no-undef */ | ||
/* istanbul ignore else */ | ||
/* istanbul ignore next */ | ||
export default typeof window === "object" ? window : polyfill(globalThis); |
@@ -158,3 +158,2 @@ import { compileTemplate } from "./template/core.js"; | ||
const EXP_REGEX = /\$\{(\d+)\}/g; | ||
const SVG_PLACEHOLDER = getPlaceholder("svg"); | ||
@@ -165,4 +164,3 @@ export function msg(parts, ...args) { | ||
const templates = new Map(); | ||
const htmlTemplates = new Map(); | ||
msg.html = function html(parts, ...args) { | ||
@@ -172,3 +170,3 @@ const input = getString(parts, args); | ||
return (host, target = host) => { | ||
let render = templates.get(input); | ||
let render = htmlTemplates.get(input); | ||
if (!render) { | ||
@@ -178,6 +176,5 @@ render = compileTemplate( | ||
false, | ||
false, | ||
true, | ||
); | ||
templates.set(input, render); | ||
htmlTemplates.set(input, render); | ||
} | ||
@@ -189,2 +186,3 @@ | ||
const svgTemplates = new Map(); | ||
msg.svg = function svg(parts, ...args) { | ||
@@ -194,4 +192,4 @@ const input = getString(parts, args); | ||
return (host, target = host) => { | ||
const id = input + SVG_PLACEHOLDER; | ||
let render = templates.get(id); | ||
const id = input; | ||
let render = svgTemplates.get(id); | ||
if (!render) { | ||
@@ -201,6 +199,5 @@ render = compileTemplate( | ||
true, | ||
false, | ||
true, | ||
); | ||
templates.set(id, render); | ||
svgTemplates.set(id, render); | ||
} | ||
@@ -207,0 +204,0 @@ |
@@ -958,13 +958,11 @@ /* eslint-disable no-use-before-define */ | ||
const offline = config.storage.offline; | ||
const validate = config.storage.validate; | ||
if (validate) { | ||
const entry = cache.getEntry(config, stringId); | ||
if (entry.value && !validate(entry.value)) { | ||
entry.resolved = false; | ||
entry.depState = 0; | ||
} | ||
const entry = cache.getEntry(config, stringId); | ||
if (entry.value && !validate(entry.value)) { | ||
entry.resolved = false; | ||
entry.depState = 0; | ||
} | ||
const offline = config.storage.offline; | ||
return cache.get(config, stringId, (h, cachedModel) => { | ||
@@ -985,3 +983,3 @@ if (cachedModel && pending(cachedModel)) return cachedModel; | ||
if (validContexts && cachedModel && config.storage.validate(cachedModel)) { | ||
if (validContexts && cachedModel && validate(cachedModel)) { | ||
return cachedModel; | ||
@@ -1068,8 +1066,5 @@ } | ||
const isInstance = !!config; | ||
let isInstance = !!config; | ||
if (!config) config = bootstrap(model); | ||
const isDraft = draftMap.get(config); | ||
if (config.nested) { | ||
@@ -1097,2 +1092,7 @@ throw stringifyModel( | ||
if (!isInstance && !config.enumerable) { | ||
isInstance = true; | ||
model = get(model); | ||
} | ||
if (isInstance) { | ||
@@ -1105,13 +1105,4 @@ const promise = pending(model); | ||
const isDraft = draftMap.get(config); | ||
let id; | ||
const setState = (state, value) => { | ||
if (isInstance) { | ||
setModelState(model, state, value); | ||
} else { | ||
const entry = cache.getEntry(config, id); | ||
if (entry.value) { | ||
setModelState(entry.value, state, value); | ||
} | ||
} | ||
}; | ||
@@ -1217,11 +1208,11 @@ try { | ||
err = err !== undefined ? err : Error("Undefined error"); | ||
setState("error", err); | ||
if (isInstance) setModelState(model, "error", err); | ||
throw err; | ||
}); | ||
setState("pending", result); | ||
if (isInstance) setModelState(model, "pending", result); | ||
return result; | ||
} catch (e) { | ||
setState("error", e); | ||
if (isInstance) setModelState(model, "error", e); | ||
return Promise.reject(e); | ||
@@ -1228,0 +1219,0 @@ } |
@@ -5,3 +5,3 @@ import global from "../global.js"; | ||
import { dataMap, removeTemplate, getPlaceholder } from "./utils.js"; | ||
import { getMeta, getPlaceholder, removeTemplate } from "./utils.js"; | ||
@@ -16,3 +16,3 @@ import resolveValue from "./resolvers/value.js"; | ||
function createSignature(parts, styles) { | ||
function createSignature(parts) { | ||
let signature = parts.reduce((acc, part, index) => { | ||
@@ -31,9 +31,6 @@ if (index === 0) { | ||
} | ||
return acc + getPlaceholder(index - 1) + part; | ||
}, ""); | ||
if (styles) { | ||
signature += `<style>\n${styles.join("\n/*------*/\n")}\n</style>`; | ||
} | ||
return signature; | ||
@@ -49,22 +46,2 @@ } | ||
function replaceComments(fragment) { | ||
const iterator = global.document.createNodeIterator( | ||
fragment, | ||
global.NodeFilter.SHOW_COMMENT, | ||
null, | ||
false, | ||
); | ||
let node; | ||
// eslint-disable-next-line no-cond-assign | ||
while ((node = iterator.nextNode())) { | ||
if (PLACEHOLDER_REGEXP_EQUAL.test(node.textContent)) { | ||
node.parentNode.insertBefore( | ||
global.document.createTextNode(node.textContent), | ||
node, | ||
); | ||
node.parentNode.removeChild(node); | ||
} | ||
} | ||
} | ||
function createWalker(context) { | ||
@@ -74,3 +51,5 @@ return global.document.createTreeWalker( | ||
// eslint-disable-next-line no-bitwise | ||
global.NodeFilter.SHOW_ELEMENT | global.NodeFilter.SHOW_TEXT, | ||
global.NodeFilter.SHOW_ELEMENT | | ||
global.NodeFilter.SHOW_TEXT | | ||
global.NodeFilter.SHOW_COMMENT, | ||
null, | ||
@@ -81,4 +60,2 @@ false, | ||
const styleSheetsMap = new Map(); | ||
function normalizeWhitespace(input, startIndent = 0) { | ||
@@ -123,7 +100,79 @@ input = input.replace(/(^[\n\s\t ]+)|([\n\s\t ]+$)+/g, ""); | ||
export function compileTemplate(rawParts, isSVG, styles, msg = false) { | ||
const styleSheetsMap = new Map(); | ||
function getCSSStyleSheet(style) { | ||
let styleSheet = style; | ||
if (!(styleSheet instanceof global.CSSStyleSheet)) { | ||
styleSheet = styleSheetsMap.get(style); | ||
if (!styleSheet) { | ||
styleSheet = new global.CSSStyleSheet(); | ||
styleSheet.replaceSync(style); | ||
styleSheetsMap.set(style, styleSheet); | ||
} | ||
} | ||
return styleSheet; | ||
} | ||
function setupStyleUpdater(target) { | ||
const hasAdoptedStyleSheets = !!target.adoptedStyleSheets; | ||
if (hasAdoptedStyleSheets) { | ||
let prevStyleSheets; | ||
return (styleSheets) => { | ||
const adoptedStyleSheets = target.adoptedStyleSheets; | ||
if (styleSheets !== prevStyleSheets) { | ||
if (styleSheets) { | ||
styleSheets = styleSheets.map(getCSSStyleSheet); | ||
let isNotEqual = | ||
!prevStyleSheets || | ||
prevStyleSheets.some( | ||
(styleSheet, i) => styleSheet !== styleSheets[i], | ||
); | ||
if (isNotEqual) { | ||
target.adoptedStyleSheets = ( | ||
prevStyleSheets | ||
? adoptedStyleSheets.filter( | ||
(styleSheet) => !prevStyleSheets.includes(styleSheet), | ||
) | ||
: adoptedStyleSheets | ||
).concat(styleSheets); | ||
} | ||
} else { | ||
target.adoptedStyleSheets = adoptedStyleSheets.filter( | ||
(styleSheet) => !prevStyleSheets.includes(styleSheet), | ||
); | ||
} | ||
prevStyleSheets = styleSheets; | ||
} | ||
}; | ||
} | ||
let styleEl; | ||
return (styleSheets) => { | ||
if (styleSheets) { | ||
if (!styleEl) { | ||
styleEl = global.document.createElement("style"); | ||
target.appendChild(styleEl); | ||
} | ||
const result = [...styleSheets].join("\n/*------*/\n"); | ||
if (styleEl.textContent !== result) { | ||
styleEl.textContent = result; | ||
} | ||
} else if (styleEl) { | ||
target.removeChild(styleEl); | ||
styleEl = null; | ||
} | ||
}; | ||
} | ||
export function compileTemplate(rawParts, isSVG, isMsg = false) { | ||
const template = global.document.createElement("template"); | ||
const parts = []; | ||
const signature = msg ? rawParts : createSignature(rawParts, styles); | ||
const signature = isMsg ? rawParts : createSignature(rawParts); | ||
template.innerHTML = isSVG ? `<svg>${signature}</svg>` : signature; | ||
@@ -139,4 +188,2 @@ | ||
replaceComments(template.content); | ||
const compileWalker = createWalker(template.content); | ||
@@ -148,3 +195,3 @@ const notDefinedElements = []; | ||
while (compileWalker.nextNode()) { | ||
const node = compileWalker.currentNode; | ||
let node = compileWalker.currentNode; | ||
@@ -155,7 +202,24 @@ if (noTranslate && !noTranslate.contains(node)) { | ||
if (node.nodeType === global.Node.COMMENT_NODE) { | ||
if (PLACEHOLDER_REGEXP_EQUAL.test(node.textContent)) { | ||
node.parentNode.insertBefore( | ||
global.document.createTextNode(node.textContent), | ||
node.nextSibling, | ||
); | ||
compileWalker.nextNode(); | ||
node.parentNode.removeChild(node); | ||
node = compileWalker.currentNode; | ||
} | ||
} | ||
if (node.nodeType === global.Node.TEXT_NODE) { | ||
let text = node.textContent; | ||
const equal = text.match(PLACEHOLDER_REGEXP_EQUAL); | ||
if (!text.match(PLACEHOLDER_REGEXP_EQUAL)) { | ||
if (!msg && !noTranslate && !text.match(/^\s*$/)) { | ||
if (equal) { | ||
node.textContent = ""; | ||
parts[equal[1]] = [compileIndex, resolveValue]; | ||
} else { | ||
if (!isMsg && !noTranslate && !text.match(/^\s*$/)) { | ||
let offset = -1; | ||
@@ -179,2 +243,3 @@ const key = text.trim(); | ||
context.parentNode.removeChild(context); | ||
compileIndex -= 1; | ||
context = (context.textContent.split("|")[1] || "").trim(); | ||
@@ -228,8 +293,2 @@ } | ||
} | ||
} else { | ||
const equal = node.textContent.match(PLACEHOLDER_REGEXP_EQUAL); | ||
if (equal) { | ||
node.textContent = ""; | ||
parts[equal[1]] = [compileIndex, resolveValue]; | ||
} | ||
} | ||
@@ -283,4 +342,4 @@ } else { | ||
(host, target, attrValue) => { | ||
const data = dataMap.get(target, {}); | ||
data[partialName] = (data[partialName] || value).replace( | ||
const meta = getMeta(target); | ||
meta[partialName] = (meta[partialName] || value).replace( | ||
placeholder, | ||
@@ -297,7 +356,7 @@ attrValue == null ? "" : attrValue, | ||
if (isProp) { | ||
target[name] = data[partialName]; | ||
target[name] = meta[partialName]; | ||
} else { | ||
target.setAttribute(name, data[partialName]); | ||
target.setAttribute(name, meta[partialName]); | ||
} | ||
data[partialName] = undefined; | ||
meta[partialName] = undefined; | ||
} | ||
@@ -329,15 +388,9 @@ }, | ||
return function updateTemplateInstance(host, target, args, styleSheets) { | ||
const data = dataMap.get(target, { type: "function" }); | ||
let meta = getMeta(target); | ||
if (template !== data.template) { | ||
if (data.template || target.nodeType !== global.Node.TEXT_NODE) { | ||
removeTemplate(target); | ||
} | ||
data.prevArgs = null; | ||
if (template !== meta.template) { | ||
const fragment = global.document.importNode(template.content, true); | ||
const renderWalker = createWalker(fragment); | ||
const clonedParts = parts.slice(0); | ||
const markers = []; | ||
@@ -347,7 +400,2 @@ let renderIndex = 0; | ||
const markers = []; | ||
data.template = template; | ||
data.markers = markers; | ||
while (renderWalker.nextNode()) { | ||
@@ -364,5 +412,13 @@ const node = renderWalker.currentNode; | ||
removeTemplate(target); | ||
meta = getMeta(target); | ||
meta.template = template; | ||
meta.markers = markers; | ||
meta.styles = setupStyleUpdater(target); | ||
if (target.nodeType === global.Node.TEXT_NODE) { | ||
data.startNode = fragment.childNodes[0]; | ||
data.endNode = fragment.childNodes[fragment.childNodes.length - 1]; | ||
meta.startNode = fragment.childNodes[0]; | ||
meta.endNode = fragment.childNodes[fragment.childNodes.length - 1]; | ||
@@ -382,42 +438,18 @@ let previousChild = target; | ||
const adoptedStyleSheets = target.adoptedStyleSheets; | ||
if (styleSheets) { | ||
let isEqual = false; | ||
meta.styles(styleSheets); | ||
styleSheets = styleSheets.map((style) => { | ||
if (style instanceof global.CSSStyleSheet) return style; | ||
const prevArgs = meta.prevArgs; | ||
meta.prevArgs = args; | ||
let styleSheet = styleSheetsMap.get(style); | ||
if (!styleSheet) { | ||
styleSheet = new global.CSSStyleSheet(); | ||
styleSheet.replaceSync(style); | ||
styleSheetsMap.set(style, styleSheet); | ||
} | ||
return styleSheet; | ||
}); | ||
for (let index = 0; index < meta.markers.length; index += 1) { | ||
const value = args[index]; | ||
const prevValue = prevArgs && prevArgs[index]; | ||
if (styleSheets.length === adoptedStyleSheets.length) { | ||
isEqual = true; | ||
for (let i = 0; i < styleSheets.length; i += 1) { | ||
if (styleSheets[i] !== adoptedStyleSheets[i]) { | ||
isEqual = false; | ||
break; | ||
} | ||
} | ||
} | ||
// eslint-disable-next-line no-continue | ||
if (prevArgs && value === prevValue) continue; | ||
if (!isEqual) target.adoptedStyleSheets = styleSheets; | ||
} else if (adoptedStyleSheets && adoptedStyleSheets.length) { | ||
target.adoptedStyleSheets = []; | ||
} | ||
const [node, marker] = meta.markers[index]; | ||
const prevArgs = data.prevArgs; | ||
data.prevArgs = args; | ||
for (let index = 0; index < data.markers.length; index += 1) { | ||
if (prevArgs && prevArgs[index] === args[index]) continue; // eslint-disable-line no-continue | ||
const [node, marker] = data.markers[index]; | ||
try { | ||
marker(host, node, args[index], prevArgs && prevArgs[index]); | ||
marker(host, node, value, prevValue); | ||
} catch (error) { | ||
@@ -430,2 +462,3 @@ // eslint-disable-next-line no-console | ||
); | ||
throw error; | ||
@@ -432,0 +465,0 @@ } |
@@ -6,7 +6,4 @@ import { compileTemplate } from "./core.js"; | ||
const PLACEHOLDER = getPlaceholder(); | ||
const SVG_PLACEHOLDER = getPlaceholder("svg"); | ||
const STYLE_IMPORT_REGEXP = /@import/; | ||
const templatesMap = new Map(); | ||
const stylesMap = new WeakMap(); | ||
const styleMap = new WeakMap(); | ||
@@ -19,18 +16,23 @@ const methods = { | ||
style(...styles) { | ||
stylesMap.set( | ||
this, | ||
(stylesMap.get(this) || []).concat(styles.filter((style) => style)), | ||
); | ||
let list = styleMap.get(this); | ||
if (!list) styleMap.set(this, (list = [])); | ||
styles.forEach((style) => { | ||
if (style) list.push(style); | ||
}); | ||
return this; | ||
}, | ||
css(parts, ...args) { | ||
stylesMap.set( | ||
this, | ||
(stylesMap.get(this) || []).concat( | ||
parts.reduce( | ||
(acc, part, index) => `${acc}${part}${args[index] || ""}`, | ||
"", | ||
), | ||
let set = styleMap.get(this); | ||
if (!set) styleMap.set(this, (set = [])); | ||
set.push( | ||
parts.reduce( | ||
(acc, part, index) => | ||
`${acc}${part}${args[index] !== undefined ? args[index] : ""}`, | ||
"", | ||
), | ||
); | ||
return this; | ||
@@ -40,38 +42,37 @@ }, | ||
function create(parts, args, isSVG) { | ||
const createTemplate = (host, target = host) => { | ||
const styles = stylesMap.get(createTemplate); | ||
let hasAdoptedStyleSheets; | ||
const htmlTemplates = new Map(); | ||
export function html(parts, ...args) { | ||
function compile(host, target = host) { | ||
let id = parts.join(PLACEHOLDER); | ||
if (styles) { | ||
const joinedStyles = styles.join(PLACEHOLDER); | ||
hasAdoptedStyleSheets = | ||
!!target.adoptedStyleSheets && !STYLE_IMPORT_REGEXP.test(joinedStyles); | ||
if (!hasAdoptedStyleSheets) id += joinedStyles; | ||
let render = htmlTemplates.get(id); | ||
if (!render) { | ||
render = compileTemplate(parts); | ||
htmlTemplates.set(id, render); | ||
} | ||
if (isSVG) id += SVG_PLACEHOLDER; | ||
render(host, target, args, styleMap.get(compile)); | ||
} | ||
let render = templatesMap.get(id); | ||
return Object.assign(compile, methods); | ||
} | ||
const svgTemplates = new Map(); | ||
export function svg(parts, ...args) { | ||
function compile(host, target = host) { | ||
let id = parts.join(PLACEHOLDER); | ||
let render = svgTemplates.get(id); | ||
if (!render) { | ||
render = compileTemplate(parts, isSVG, !hasAdoptedStyleSheets && styles); | ||
templatesMap.set(id, render); | ||
render = compileTemplate(parts, true); | ||
svgTemplates.set(id, render); | ||
} | ||
render(host, target, args, hasAdoptedStyleSheets && styles); | ||
}; | ||
render(host, target, args, styleMap.get(compile)); | ||
} | ||
return Object.assign(createTemplate, methods); | ||
return Object.assign(compile, methods); | ||
} | ||
export function html(parts, ...args) { | ||
return create(parts, args); | ||
} | ||
export function svg(parts, ...args) { | ||
return create(parts, args, true); | ||
} | ||
Object.assign(html, helpers); | ||
Object.assign(svg, helpers); | ||
Object.freeze(Object.assign(html, helpers)); | ||
Object.freeze(Object.assign(svg, helpers)); |
import global from "../../global.js"; | ||
import { dataMap, removeTemplate, getTemplateEnd } from "../utils.js"; | ||
import { getMeta, removeTemplate, getTemplateEnd } from "../utils.js"; | ||
@@ -7,5 +7,5 @@ export const arrayMap = new WeakMap(); | ||
function movePlaceholder(target, previousSibling) { | ||
const data = dataMap.get(target); | ||
const startNode = data.startNode; | ||
const endNode = getTemplateEnd(data.endNode); | ||
const meta = getMeta(target); | ||
const startNode = meta.startNode; | ||
const endNode = getTemplateEnd(meta.endNode); | ||
@@ -52,3 +52,3 @@ previousSibling.parentNode.insertBefore(target, previousSibling.nextSibling); | ||
const lastIndex = value.length - 1; | ||
const data = dataMap.get(target); | ||
const meta = getMeta(target); | ||
@@ -87,7 +87,7 @@ for (let index = 0; index < entries.length; index += 1) { | ||
previousSibling = getTemplateEnd( | ||
dataMap.get(entry.placeholder).endNode || entry.placeholder, | ||
getMeta(entry.placeholder, {}).endNode || entry.placeholder, | ||
); | ||
if (index === 0) data.startNode = entry.placeholder; | ||
if (index === lastIndex) data.endNode = previousSibling; | ||
if (index === 0) meta.startNode = entry.placeholder; | ||
if (index === lastIndex) meta.endNode = previousSibling; | ||
} | ||
@@ -94,0 +94,0 @@ |
@@ -1,12 +0,10 @@ | ||
import { dataMap } from "../utils.js"; | ||
import { removeTemplate, getMeta } from "../utils.js"; | ||
export default function resolveNode(host, target, value, lastValue) { | ||
const data = dataMap.get(target, {}); | ||
export default function resolveNode(host, target, value) { | ||
removeTemplate(target); | ||
if (lastValue) lastValue.parentNode.removeChild(lastValue); | ||
const meta = getMeta(target); | ||
meta.startNode = meta.endNode = value; | ||
data.startNode = value; | ||
data.endNode = value; | ||
target.parentNode.insertBefore(value, target.nextSibling); | ||
} |
import global from "../../global.js"; | ||
import { dataMap, removeTemplate } from "../utils.js"; | ||
import { removeTemplate } from "../utils.js"; | ||
import resolveArray, { arrayMap } from "./array.js"; | ||
import resolveNode from "./node.js"; | ||
export default function resolveValue(host, target, value, lastValue) { | ||
let type = typeof value; | ||
if (Array.isArray(value)) { | ||
type = "array"; | ||
} else if (value instanceof global.Node) { | ||
type = "node"; | ||
function typeOf(value) { | ||
const type = typeof value; | ||
if (type === "object") { | ||
if (Array.isArray(value)) return "array"; | ||
if (value instanceof global.Node) return "node"; | ||
} | ||
let data = dataMap.get(target, {}); | ||
return type; | ||
} | ||
if (data.type !== type) { | ||
removeTemplate(target); | ||
if (type === "array") arrayMap.delete(target); | ||
export default function resolveValue(host, target, value, lastValue) { | ||
const type = typeOf(value); | ||
const lastType = typeOf(lastValue); | ||
data = dataMap.set(target, { type }); | ||
if (lastType !== "undefined" && type !== lastType) { | ||
if (type !== "function") removeTemplate(target); | ||
if (target.textContent !== "") { | ||
if (lastType === "array") { | ||
arrayMap.delete(target); | ||
} else if (lastType !== "node" && lastType !== "function") { | ||
target.textContent = ""; | ||
@@ -28,5 +32,2 @@ } | ||
switch (type) { | ||
case "function": | ||
value(host, target); | ||
break; | ||
case "array": | ||
@@ -36,4 +37,7 @@ resolveArray(host, target, value, resolveValue); | ||
case "node": | ||
resolveNode(host, target, value, lastValue); | ||
resolveNode(host, target, value); | ||
break; | ||
case "function": | ||
value(host, target); | ||
break; | ||
default: | ||
@@ -40,0 +44,0 @@ target.textContent = type === "number" || value ? value : ""; |
import global from "../global.js"; | ||
const map = new WeakMap(); | ||
export const dataMap = { | ||
get(key, defaultValue) { | ||
const value = map.get(key); | ||
if (value) return value; | ||
const metaMap = new WeakMap(); | ||
export function getMeta(key) { | ||
let value = metaMap.get(key); | ||
if (value) return value; | ||
if (defaultValue) { | ||
map.set(key, defaultValue); | ||
} | ||
metaMap.set(key, (value = {})); | ||
return value; | ||
} | ||
return defaultValue; | ||
}, | ||
set(key, value) { | ||
map.set(key, value); | ||
return value; | ||
}, | ||
}; | ||
export function getTemplateEnd(node) { | ||
let meta; | ||
export function getTemplateEnd(node) { | ||
let data; | ||
// eslint-disable-next-line no-cond-assign | ||
while (node && (data = dataMap.get(node)) && data.endNode) { | ||
node = data.endNode; | ||
while (node && (meta = getMeta(node)) && meta.endNode) { | ||
node = meta.endNode; | ||
} | ||
@@ -32,11 +23,7 @@ | ||
export function removeTemplate(target) { | ||
if (target.nodeType !== global.Node.TEXT_NODE) { | ||
let child = target.childNodes[0]; | ||
while (child) { | ||
target.removeChild(child); | ||
child = target.childNodes[0]; | ||
} | ||
} else { | ||
const data = dataMap.get(target); | ||
const data = getMeta(target); | ||
if (data.styles) data.styles(); | ||
if (target.nodeType === global.Node.TEXT_NODE) { | ||
if (data.startNode) { | ||
@@ -54,3 +41,11 @@ const endNode = getTemplateEnd(data.endNode); | ||
} | ||
} else { | ||
let child = target.childNodes[0]; | ||
while (child) { | ||
target.removeChild(child); | ||
child = target.childNodes[0]; | ||
} | ||
} | ||
metaMap.delete(target); | ||
} | ||
@@ -57,0 +52,0 @@ |
417500
6299