New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

hybrids

Package Overview
Dependencies
Maintainers
2
Versions
149
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

hybrids - npm Package Compare versions

Comparing version 8.0.8 to 8.0.9

8

docs/CHANGELOG.md

@@ -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 @@

4

package.json
{
"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 @@

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc