Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@tko/utils.jsx

Package Overview
Dependencies
Maintainers
1
Versions
28
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@tko/utils.jsx - npm Package Compare versions

Comparing version
4.0.0-beta1.3
to
4.0.0
+4
-10
dist/index.js

@@ -1,10 +0,4 @@

// @tko/utils.jsx 🥊 4.0.0-beta1.3 ESM
export {
getOriginalJsxForNode,
maybeJsx,
createElement,
Fragment
} from "./jsx";
export {
default as JsxObserver
} from "./JsxObserver";
// @tko/utils.jsx 🥊 4.0.0 ESM
"use strict";
export { getOriginalJsxForNode, maybeJsx, createElement, Fragment } from "./jsx";
export { default as JsxObserver } from "./JsxObserver";
{
"version": 3,
"sources": ["../src/index.ts"],
"sourcesContent": ["export {\n getOriginalJsxForNode, maybeJsx, createElement, Fragment\n} from './jsx'\n\nexport {\n default as JsxObserver\n} from './JsxObserver'\n"],
"mappings": ";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;AAAA;AAAA;",
"sourcesContent": ["export { getOriginalJsxForNode, maybeJsx, createElement, Fragment } from './jsx'\n\nexport { default as JsxObserver } from './JsxObserver'\n"],
"mappings": ";;AAAA,SAAS,uBAAuB,UAAU,eAAe,gBAAgB;AAEzE,SAAS,WAAW,mBAAmB;",
"names": []
}

@@ -1,10 +0,4 @@

// @tko/utils.jsx 🥊 4.0.0-beta1.3 MJS
export {
getOriginalJsxForNode,
maybeJsx,
createElement,
Fragment
} from "./jsx";
export {
default as JsxObserver
} from "./JsxObserver";
// @tko/utils.jsx 🥊 4.0.0 MJS
"use strict";
export { getOriginalJsxForNode, maybeJsx, createElement, Fragment } from "./jsx";
export { default as JsxObserver } from "./JsxObserver";
{
"version": 3,
"sources": ["../src/index.ts"],
"sourcesContent": ["export {\n getOriginalJsxForNode, maybeJsx, createElement, Fragment\n} from './jsx'\n\nexport {\n default as JsxObserver\n} from './JsxObserver'\n"],
"mappings": ";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;AAAA;AAAA;",
"sourcesContent": ["export { getOriginalJsxForNode, maybeJsx, createElement, Fragment } from './jsx'\n\nexport { default as JsxObserver } from './JsxObserver'\n"],
"mappings": ";;AAAA,SAAS,uBAAuB,UAAU,eAAe,gBAAgB;AAEzE,SAAS,WAAW,mBAAmB;",
"names": []
}

@@ -1,9 +0,5 @@

// @tko/utils.jsx 🥊 4.0.0-beta1.3 ESM
import {
isObservable,
unwrap
} from "@tko/observable";
import {
ORIGINAL_JSX_SYM
} from "./JsxObserver";
// @tko/utils.jsx 🥊 4.0.0 ESM
"use strict";
import { isObservable, unwrap } from "@tko/observable";
import { ORIGINAL_JSX_SYM } from "./JsxObserver";
export function maybeJsx(possibleJsx) {

@@ -32,8 +28,4 @@ if (isObservable(possibleJsx)) {

export function createElement(elementName, attributes, ...children) {
return elementName === Fragment ? children : {
elementName,
attributes: attributes || {},
children: [...children]
};
return elementName === Fragment ? children : { elementName, attributes: attributes || {}, children: [...children] };
}
export const Fragment = Symbol("JSX Fragment");
export const Fragment = /* @__PURE__ */ Symbol("JSX Fragment");
{
"version": 3,
"sources": ["../src/jsx.ts"],
"sourcesContent": ["\nimport {\n isObservable, unwrap\n} from '@tko/observable'\n\nimport {\n ORIGINAL_JSX_SYM\n } from './JsxObserver'\n\n/**\n *\n * @param {any} possibleJsx Test whether this value is JSX.\n *\n * True for\n * { elementName }\n * [{elementName}]\n * observable({elementName} | [])\n *\n * Any observable will return truthy if its value is an array that doesn't\n * contain HTML elements. Template nodes should not be observable unless they\n * are JSX.\n *\n * There's a bit of guesswork here that we could nail down with more test cases.\n */\nexport function maybeJsx (possibleJsx) {\n if (isObservable(possibleJsx)) { return true }\n const value = unwrap(possibleJsx)\n if (!value) { return false }\n if (value.elementName) { return true }\n if (!Array.isArray(value) || !value.length) { return false }\n if (value[0] instanceof window.Node) { return false }\n return true\n}\n\nexport function getOriginalJsxForNode (node) {\n return node[ORIGINAL_JSX_SYM]\n}\n\n\n/**\n * Convert JSX into an object that can be consumed by TKO.\n * Mimics React.createElement\n * @param {string} e tagName of the element\n * @param {object|null} a attributes of the element\n * @param {...string|object} c children of the element\n */\nexport function createElement (elementName, attributes, ...children) {\n return elementName === Fragment ? children\n : {\n elementName: elementName,\n attributes: attributes || {},\n children: [...children]\n }\n}\n\nexport const Fragment = Symbol('JSX Fragment')\n\n"],
"mappings": ";AACA;AAAA;AAAA;AAAA;AAIA;AAAA;AAAA;AAmBO,yBAAmB,aAAa;AACrC,MAAI,aAAa,WAAW,GAAG;AAAE,WAAO;AAAA,EAAK;AAC7C,QAAM,QAAQ,OAAO,WAAW;AAChC,MAAI,CAAC,OAAO;AAAE,WAAO;AAAA,EAAM;AAC3B,MAAI,MAAM,aAAa;AAAE,WAAO;AAAA,EAAK;AACrC,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,QAAQ;AAAE,WAAO;AAAA,EAAM;AAC3D,MAAI,MAAM,cAAc,OAAO,MAAM;AAAE,WAAO;AAAA,EAAM;AACpD,SAAO;AACT;AAEO,sCAAgC,MAAM;AAC3C,SAAO,KAAK;AACd;AAUO,8BAAwB,aAAa,eAAe,UAAU;AACnE,SAAO,gBAAgB,WAAW,WAC9B;AAAA,IACA;AAAA,IACA,YAAY,cAAc,CAAC;AAAA,IAC3B,UAAU,CAAC,GAAG,QAAQ;AAAA,EACxB;AACJ;AAEO,aAAM,WAAW,OAAO,cAAc;",
"sourcesContent": ["import { isObservable, unwrap } from '@tko/observable'\n\nimport { ORIGINAL_JSX_SYM } from './JsxObserver'\n\n/**\n *\n * @param {any} possibleJsx Test whether this value is JSX.\n *\n * True for\n * { elementName }\n * [{elementName}]\n * observable({elementName} | [])\n *\n * Any observable will return truthy if its value is an array that doesn't\n * contain HTML elements. Template nodes should not be observable unless they\n * are JSX.\n *\n * There's a bit of guesswork here that we could nail down with more test cases.\n */\nexport function maybeJsx(possibleJsx) {\n if (isObservable(possibleJsx)) {\n return true\n }\n const value = unwrap(possibleJsx)\n if (!value) {\n return false\n }\n if (value.elementName) {\n return true\n }\n if (!Array.isArray(value) || !value.length) {\n return false\n }\n if (value[0] instanceof window.Node) {\n return false\n }\n return true\n}\n\nexport function getOriginalJsxForNode(node) {\n return node[ORIGINAL_JSX_SYM]\n}\n\n/**\n * Convert JSX into an object that can be consumed by TKO.\n * Mimics React.createElement\n * @param {string} e tagName of the element\n * @param {object|null} a attributes of the element\n * @param {...string|object} c children of the element\n */\nexport function createElement(elementName, attributes, ...children) {\n return elementName === Fragment\n ? children\n : { elementName: elementName, attributes: attributes || {}, children: [...children] }\n}\n\nexport const Fragment = Symbol('JSX Fragment')\n"],
"mappings": ";;AAAA,SAAS,cAAc,cAAc;AAErC,SAAS,wBAAwB;AAiB1B,gBAAS,SAAS,aAAa;AACpC,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,OAAO,WAAW;AAChC,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,MAAI,MAAM,aAAa;AACrB,WAAO;AAAA,EACT;AACA,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,QAAQ;AAC1C,WAAO;AAAA,EACT;AACA,MAAI,MAAM,CAAC,aAAa,OAAO,MAAM;AACnC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,gBAAS,sBAAsB,MAAM;AAC1C,SAAO,KAAK,gBAAgB;AAC9B;AASO,gBAAS,cAAc,aAAa,eAAe,UAAU;AAClE,SAAO,gBAAgB,WACnB,WACA,EAAE,aAA0B,YAAY,cAAc,CAAC,GAAG,UAAU,CAAC,GAAG,QAAQ,EAAE;AACxF;AAEO,aAAM,WAAW,uBAAO,cAAc;",
"names": []
}

@@ -1,8 +0,7 @@

// @tko/utils.jsx 🥊 4.0.0-beta1.3 ESM
import {
cleanNode
} from "@tko/utils";
// @tko/utils.jsx 🥊 4.0.0 ESM
"use strict";
import { cleanNode } from "@tko/utils";
const DELAY_MS = 25;
const MAX_CLEAN_AT_ONCE = 1e3;
const cleanNodeQueue = [];
const cleanNodeQueue = new Array();
let cleanNodeTimeoutID = null;

@@ -9,0 +8,0 @@ export function queueCleanNode(node) {

{
"version": 3,
"sources": ["../src/jsxClean.ts"],
"sourcesContent": ["import {\n cleanNode\n} from '@tko/utils'\n\nconst DELAY_MS = 25\nconst MAX_CLEAN_AT_ONCE = 1000\nconst cleanNodeQueue = []\nlet cleanNodeTimeoutID = null\n\nexport function queueCleanNode (node) {\n cleanNodeQueue.push(node)\n triggerCleanTimeout()\n}\n\nfunction triggerCleanTimeout () {\n if (!cleanNodeTimeoutID && cleanNodeQueue.length) {\n cleanNodeTimeoutID = setTimeout(flushCleanQueue, DELAY_MS)\n }\n}\n\nfunction flushCleanQueue () {\n cleanNodeTimeoutID = null\n const nodes = cleanNodeQueue.splice(0, MAX_CLEAN_AT_ONCE)\n for (const node of nodes) { cleanNode(node) }\n triggerCleanTimeout()\n}\n"],
"mappings": ";AAAA;AAAA;AAAA;AAIA,MAAM,WAAW;AACjB,MAAM,oBAAoB;AAC1B,MAAM,iBAAiB,CAAC;AACxB,IAAI,qBAAqB;AAElB,+BAAyB,MAAM;AACpC,iBAAe,KAAK,IAAI;AACxB,sBAAoB;AACtB;AAEA,+BAAgC;AAC9B,MAAI,CAAC,sBAAsB,eAAe,QAAQ;AAChD,yBAAqB,WAAW,iBAAiB,QAAQ;AAAA,EAC3D;AACF;AAEA,2BAA4B;AAC1B,uBAAqB;AACrB,QAAM,QAAQ,eAAe,OAAO,GAAG,iBAAiB;AACxD,aAAW,QAAQ,OAAO;AAAE,cAAU,IAAI;AAAA,EAAE;AAC5C,sBAAoB;AACtB;",
"sourcesContent": ["import { cleanNode } from '@tko/utils'\n\nconst DELAY_MS = 25\nconst MAX_CLEAN_AT_ONCE = 1000\nconst cleanNodeQueue = new Array()\nlet cleanNodeTimeoutID: ReturnType<typeof setTimeout> | null = null\n\nexport function queueCleanNode(node) {\n cleanNodeQueue.push(node)\n triggerCleanTimeout()\n}\n\nfunction triggerCleanTimeout() {\n if (!cleanNodeTimeoutID && cleanNodeQueue.length) {\n cleanNodeTimeoutID = setTimeout(flushCleanQueue, DELAY_MS)\n }\n}\n\nfunction flushCleanQueue() {\n cleanNodeTimeoutID = null\n const nodes = cleanNodeQueue.splice(0, MAX_CLEAN_AT_ONCE)\n for (const node of nodes) {\n cleanNode(node)\n }\n triggerCleanTimeout()\n}\n"],
"mappings": ";;AAAA,SAAS,iBAAiB;AAE1B,MAAM,WAAW;AACjB,MAAM,oBAAoB;AAC1B,MAAM,iBAAiB,IAAI,MAAM;AACjC,IAAI,qBAA2D;AAExD,gBAAS,eAAe,MAAM;AACnC,iBAAe,KAAK,IAAI;AACxB,sBAAoB;AACtB;AAEA,SAAS,sBAAsB;AAC7B,MAAI,CAAC,sBAAsB,eAAe,QAAQ;AAChD,yBAAqB,WAAW,iBAAiB,QAAQ;AAAA,EAC3D;AACF;AAEA,SAAS,kBAAkB;AACzB,uBAAqB;AACrB,QAAM,QAAQ,eAAe,OAAO,GAAG,iBAAiB;AACxD,aAAW,QAAQ,OAAO;AACxB,cAAU,IAAI;AAAA,EAChB;AACA,sBAAoB;AACtB;",
"names": []
}

@@ -1,27 +0,11 @@

// @tko/utils.jsx 🥊 4.0.0-beta1.3 ESM
// @tko/utils.jsx 🥊 4.0.0 ESM
"use strict";
import { LifeCycle } from "@tko/lifecycle";
import {
safeStringify,
isThenable
} from "@tko/utils";
import {
applyBindings,
contextFor
} from "@tko/bind";
import {
isObservable,
unwrap,
observable
} from "@tko/observable";
import {
isComputed
} from "@tko/computed";
import {
NativeProvider,
NATIVE_BINDINGS
} from "@tko/provider.native";
import {
queueCleanNode
} from "./jsxClean";
export const ORIGINAL_JSX_SYM = Symbol("Knockout - Original JSX");
import { safeStringify, isThenable } from "@tko/utils";
import { applyBindings, contextFor } from "@tko/bind";
import { isObservable, unwrap, observable } from "@tko/observable";
import { isComputed } from "@tko/computed";
import { NativeProvider, NATIVE_BINDINGS } from "@tko/provider.native";
import { queueCleanNode } from "./jsxClean";
export const ORIGINAL_JSX_SYM = /* @__PURE__ */ Symbol("Knockout - Original JSX");
const NAMESPACES = {

@@ -38,5 +22,8 @@ svg: "http://www.w3.org/2000/svg",

export class JsxObserver extends LifeCycle {
/**
* @param {any} jsxOrObservable take a long list of permutations
*/
constructor(jsxOrObservable, parentNode, insertBefore = null, xmlns, noInitialBinding) {
super();
const parentNodeIsComment = parentNode.nodeType === 8;
const parentNodeIsComment = parentNode.nodeType === Node.COMMENT_NODE;
const parentNodeTarget = this.getParentTarget(parentNode);

@@ -49,3 +36,3 @@ if (isObservable(jsxOrObservable)) {

insertBefore = this.createComment("O");
parentNodeTarget.insertBefore(insertBefore, insertAt);
parentNodeTarget?.insertBefore(insertBefore, insertAt);
} else {

@@ -80,3 +67,3 @@ this.adoptedInsertBefore = true;

}
if (parentNode.nodeType === 8) {
if (parentNode.nodeType === Node.COMMENT_NODE) {
return parentNode.parentNode;

@@ -94,3 +81,3 @@ }

if (insertBeforeIsChild && !this.adoptedInsertBefore) {
this.parentNodeTarget.removeChild(ib);
this.parentNodeTarget?.removeChild(ib);
}

@@ -111,3 +98,3 @@ this.removeAllPriorNodes();

const status = "added";
if (typeof possibleIteratable === "object" && posibleIterable !== null && Symbol.iterator in possibleIterable) {
if (typeof possibleIterable === "object" && possibleIterable !== null && Symbol.iterator in possibleIterable) {
possibleIterable = [...possibleIterable];

@@ -117,5 +104,11 @@ }

}
/**
* Note: array change notification indexes are:
* - to the original array indexes for deletes
* - to the new array indexes for adds
* - sorted by index in ascending order
*/
observableArrayChange(changes) {
let adds = [];
let dels = [];
const adds = [];
const dels = [];
for (const index in changes) {

@@ -132,2 +125,8 @@ const change = changes[index];

}
/**
* Add a change at the given index.
*
* @param {int} index
* @param {string|object|Array|Observable.string|Observable.Array|Observable.object} jsx
*/
addChange(index, jsx) {

@@ -143,3 +142,3 @@ this.nodeArrayOrObservableAtIndex.splice(index, 0, this.injectNode(jsx, this.lastNodeFor(index)));

} else if (typeof jsx !== "string" && isIterable(jsx)) {
nodeArrayOrObservable = [];
nodeArrayOrObservable = new Array();
for (const child of jsx) {

@@ -158,3 +157,3 @@ nodeArrayOrObservable.unshift(this.injectNode(child, nextNode));

for (const node of nodeArrayOrObservable) {
this.parentNodeTarget.insertBefore(node, nextNode);
this.parentNodeTarget?.insertBefore(node, nextNode);
if (shouldApplyBindings && this.canApplyBindings(node)) {

@@ -167,6 +166,11 @@ applyBindings($context, node);

}
/**
* True when Node is a type suitable for applyBindings i.e. a HTMLElement
* or a Comment.
* @param {Node} node
*/
canApplyBindings(node) {
return node.nodeType === 1 || node.nodeType === 8;
return node.nodeType === Node.ELEMENT_NODE || node.nodeType === Node.COMMENT_NODE;
}
delChange(index) {
delChange(index, _) {
this.removeNodeArrayOrObservable(this.nodeArrayOrObservableAtIndex[index]);

@@ -177,3 +181,3 @@ this.nodeArrayOrObservableAtIndex.splice(index, 1);

if (!this.subscriptionsForNode.has(node)) {
const subscriptions = [];
const subscriptions = new Array();
this.subscriptionsForNode.set(node, subscriptions);

@@ -187,2 +191,8 @@ return subscriptions;

}
/**
* @param {any} value acceptable to turn into a Node
*
* The one thing `any` cannot be here is an Array or Observable; both those
* cases are handled with new JsxObservers.
*/
anyToNode(any) {

@@ -232,5 +242,14 @@ if (isThenable(any)) {

}
/**
* Clone a node; if that node was originally from JSX, we clone from there
* so we preserve binding handlers.
*
* @param {HTMLElement} node
*/
cloneJSXorMoveNode(node) {
return ORIGINAL_JSX_SYM in node ? this.jsxToNode(node[ORIGINAL_JSX_SYM]) : node;
}
/**
* @param {JSX} jsx to convert to a node.
*/
jsxToNode(jsx) {

@@ -242,5 +261,7 @@ const xmlns = jsx.attributes.xmlns || NAMESPACES[jsx.elementName] || this.xmlns;

const subscriptions = this.getSubscriptionsForNode(node);
subscriptions.push(jsx.attributes.subscribe((attrs) => {
this.updateAttributes(node, unwrap(attrs));
}));
subscriptions.push(
jsx.attributes.subscribe((attrs) => {
this.updateAttributes(node, unwrap(attrs));
})
);
}

@@ -272,2 +293,7 @@ this.updateAttributes(node, unwrap(jsx.attributes));

}
/**
* See https://stackoverflow.com/a/52572048
* @param {string} attr element attribute
* @return {string} namespace argument for setAtttributeNS
*/
getNamespaceOfAttribute(attr) {

@@ -280,2 +306,8 @@ const [prefix, ...unqualifiedName] = attr.split(":");

}
/**
*
* @param {HTMLElement} node
* @param {string} name
* @param {any} valueOrObservable
*/
setNodeAttribute(node, name, valueOrObservable) {

@@ -293,2 +325,6 @@ const value = unwrap(valueOrObservable);

}
/**
* @param {int} index
* @return {Comment} that immediately precedes this.
*/
lastNodeFor(index) {

@@ -325,2 +361,7 @@ const nodesAtIndex = this.nodeArrayOrObservableAtIndex[index] || [];

}
/**
* Detach the given node, and dispose of its children.
*
* The cleaning can trigger a lot of garbage collection, so we defer that.
*/
detachAndDispose(node) {

@@ -327,0 +368,0 @@ if (isIterable(node)) {

{
"version": 3,
"sources": ["../src/JsxObserver.ts"],
"sourcesContent": ["\nimport {LifeCycle} from '@tko/lifecycle'\n\nimport {\n safeStringify, isThenable\n} from '@tko/utils'\n\nimport {\n applyBindings, contextFor\n} from '@tko/bind'\n\nimport {\n isObservable, unwrap, observable\n} from '@tko/observable'\n\nimport {\n isComputed\n} from '@tko/computed'\n\nimport {\n NativeProvider, NATIVE_BINDINGS\n} from '@tko/provider.native'\n\nimport {\n queueCleanNode\n} from './jsxClean'\n\nexport const ORIGINAL_JSX_SYM = Symbol('Knockout - Original JSX')\n\nconst NAMESPACES = {\n svg: 'http://www.w3.org/2000/svg',\n html: 'http://www.w3.org/1999/xhtml',\n xml: 'http://www.w3.org/XML/1998/namespace',\n xlink: 'http://www.w3.org/1999/xlink',\n xmlns: 'http://www.w3.org/2000/xmlns/'\n}\n\nfunction isIterable (v) {\n return v && typeof v[Symbol.iterator] === 'function'\n}\n\n/**\n * JSX object from a pre-processor.\n * @typedef {Object} JSX\n * @property {string} elementName becomes the `tagName`\n * @property {Array.<JSX>} children\n * @property {object} attributes\n */\n\n/**\n * Observe a variety of possible cases from JSX, modifying the\n * `parentNode` at `insertBefore` with the result.\n */\nexport class JsxObserver extends LifeCycle {\n /**\n * @param {any} jsxOrObservable take a long list of permutations\n */\n constructor (jsxOrObservable, parentNode, insertBefore = null, xmlns, noInitialBinding) {\n super()\n\n const parentNodeIsComment = parentNode.nodeType === 8\n\n const parentNodeTarget = this.getParentTarget(parentNode)\n\n if (isObservable(jsxOrObservable)) {\n jsxOrObservable.extend({ trackArrayChanges: true })\n this.subscribe(jsxOrObservable, this.observableArrayChange, 'arrayChange')\n\n if (!insertBefore) {\n const insertAt = parentNodeIsComment ? parentNode.nextSibling : null\n insertBefore = this.createComment('O')\n parentNodeTarget.insertBefore(insertBefore, insertAt)\n } else {\n this.adoptedInsertBefore = true\n }\n }\n\n if (parentNodeIsComment && !insertBefore) {\n // Typcially: insertBefore becomes <!-- /ko -->\n insertBefore = parentNode.nextSibling\n // Mark this so we don't remove the next node - since we didn't create it.\n this.adoptedInsertBefore = true\n }\n\n this.anchorTo(insertBefore || parentNode)\n\n Object.assign(this, {\n insertBefore,\n noInitialBinding,\n parentNode,\n parentNodeTarget,\n xmlns,\n nodeArrayOrObservableAtIndex: [],\n subscriptionsForNode: new Map(),\n })\n\n const jsx = unwrap(jsxOrObservable)\n const computed = isComputed(jsxOrObservable)\n\n if (computed || (jsx !== null && jsx !== undefined)) {\n this.observableArrayChange(this.createInitialAdditions(jsx))\n }\n this.noInitialBinding = false\n }\n\n /**\n * @param {HMTLElement|Comment|HTMLTemplateElement} parentNode\n */\n getParentTarget (parentNode) {\n if ('content' in parentNode) { return parentNode.content }\n if (parentNode.nodeType === 8) { return parentNode.parentNode }\n return parentNode\n }\n\n remove () { this.dispose() }\n dispose () {\n super.dispose()\n const ib = this.insertBefore\n const insertBeforeIsChild = ib && this.parentNodeTarget === ib.parentNode\n if (insertBeforeIsChild && !this.adoptedInsertBefore) {\n this.parentNodeTarget.removeChild(ib)\n }\n this.removeAllPriorNodes()\n Object.assign(this, {\n parentNode: null,\n parentNodeTarget: null,\n insertBefore: null,\n nodeArrayOrObservableAtIndex: []\n })\n for (const subscriptions of this.subscriptionsForNode.values()) {\n subscriptions.forEach(s => s.dispose())\n }\n this.subscriptionsForNode.clear()\n }\n\n createInitialAdditions (possibleIterable) {\n const status = 'added'\n if (typeof possibleIteratable === 'object' &&\n posibleIterable !== null &&\n Symbol.iterator in possibleIterable) {\n possibleIterable = [...possibleIterable]\n }\n\n return Array.isArray(possibleIterable)\n ? possibleIterable.map((value, index) => ({ index, status, value }))\n : [{ status, index: 0, value: possibleIterable }]\n }\n\n /**\n * Note: array change notification indexes are:\n * - to the original array indexes for deletes\n * - to the new array indexes for adds\n * - sorted by index in ascending order\n */\n observableArrayChange (changes) {\n let adds = []\n let dels = []\n for (const index in changes) {\n const change = changes[index]\n if (change.status === 'added') {\n adds.push([change.index, change.value])\n } else {\n dels.unshift([change.index, change.value])\n }\n }\n dels.forEach(change => this.delChange(...change))\n adds.forEach(change => this.addChange(...change))\n }\n\n /**\n * Add a change at the given index.\n *\n * @param {int} index\n * @param {string|object|Array|Observable.string|Observable.Array|Obseravble.object} jsx\n */\n addChange (index, jsx) {\n this.nodeArrayOrObservableAtIndex.splice(index, 0,\n this.injectNode(jsx, this.lastNodeFor(index)))\n }\n\n injectNode (jsx, nextNode) {\n let nodeArrayOrObservable\n\n if (isObservable(jsx)) {\n const {parentNode, xmlns} = this\n const observer = new JsxObserver(jsx, parentNode, nextNode, xmlns, this.noInitialBinding)\n nodeArrayOrObservable = [observer]\n } else if (typeof jsx !== 'string' && isIterable(jsx)) {\n nodeArrayOrObservable = []\n for (const child of jsx) {\n nodeArrayOrObservable.unshift(\n this.injectNode(child, nextNode))\n }\n } else {\n const $context = contextFor(this.parentNode)\n const isInsideTemplate = 'content' in this.parentNode\n const shouldApplyBindings = $context && !isInsideTemplate && !this.noInitialBinding\n\n if (Array.isArray(jsx)) {\n nodeArrayOrObservable = jsx.map(j => this.anyToNode(j))\n } else {\n nodeArrayOrObservable = [this.anyToNode(jsx)]\n }\n\n for (const node of nodeArrayOrObservable) {\n this.parentNodeTarget.insertBefore(node, nextNode)\n if (shouldApplyBindings && this.canApplyBindings(node)) {\n applyBindings($context, node)\n }\n }\n }\n\n return nodeArrayOrObservable\n }\n\n /**\n * True when Node is a type suitable for applyBindings i.e. a HTMLElement\n * or a Comment.\n * @param {Node} node\n */\n canApplyBindings (node) {\n return node.nodeType === 1 || node.nodeType === 8\n }\n\n delChange (index) {\n this.removeNodeArrayOrObservable(\n this.nodeArrayOrObservableAtIndex[index])\n this.nodeArrayOrObservableAtIndex.splice(index, 1)\n }\n\n getSubscriptionsForNode (node) {\n if (!this.subscriptionsForNode.has(node)) {\n const subscriptions = []\n this.subscriptionsForNode.set(node, subscriptions)\n return subscriptions\n }\n return this.subscriptionsForNode.get(node)\n }\n\n isJsx (jsx) {\n return typeof jsx.elementName === 'string' &&\n 'children' in jsx &&\n 'attributes' in jsx\n }\n\n /**\n * @param {any} value acceptable to turn into a Node\n *\n * The one thing `any` cannot be here is an Array or Observable; both those\n * cases are handled with new JsxObservers.\n */\n anyToNode (any) {\n if (isThenable(any)) { return this.futureJsxNode(any) }\n\n switch (typeof any) {\n case 'object':\n if (any instanceof Error) {\n return this.createComment(any.toString())\n }\n if (any === null) {\n return this.createComment(String(any))\n }\n if (any instanceof Node) {\n return this.cloneJSXorMoveNode(any)\n }\n if (Symbol.iterator in any) {\n return any\n }\n break\n case 'function': return this.anyToNode(any())\n case 'undefined':\n case 'symbol':\n return this.createComment(String(any))\n case 'string': return this.createTextNode(any)\n case 'boolean':\n case 'number':\n case 'bigint':\n default:\n return this.createTextNode(String(any))\n }\n\n return this.isJsx(any)\n ? this.jsxToNode(any)\n : this.createComment(safeStringify(any))\n }\n\n createComment (string) {\n const node = document.createComment(string)\n node[NATIVE_BINDINGS] = true\n return node\n }\n\n createTextNode (string) {\n const node = document.createTextNode(string)\n node[NATIVE_BINDINGS] = true\n return node\n }\n\n /**\n * Clone a node; if that node was originally from JSX, we clone from there\n * so we preserve binding handlers.\n *\n * @param {HTMLElement} node\n */\n cloneJSXorMoveNode (node) {\n return ORIGINAL_JSX_SYM in node\n ? this.jsxToNode(node[ORIGINAL_JSX_SYM])\n : node\n }\n\n /**\n * @param {JSX} jsx to convert to a node.\n */\n jsxToNode (jsx) {\n const xmlns = jsx.attributes.xmlns || NAMESPACES[jsx.elementName] || this.xmlns\n const node = document.createElementNS(xmlns || NAMESPACES.html, jsx.elementName)\n\n /** Slots need to be able to replicate with the attributes, which\n * are not preserved when cloning from template nodes. */\n node[ORIGINAL_JSX_SYM] = jsx\n\n if (isObservable(jsx.attributes)) {\n const subscriptions = this.getSubscriptionsForNode(node)\n subscriptions.push(\n jsx.attributes.subscribe(attrs => {\n this.updateAttributes(node, unwrap(attrs))\n }))\n }\n this.updateAttributes(node, unwrap(jsx.attributes))\n\n this.addDisposable(new JsxObserver(jsx.children, node, null, xmlns, this.noInitialBinding))\n\n return node\n }\n\n futureJsxNode (promise) {\n const obs = observable()\n promise.then(obs).catch(e => obs(e instanceof Error ? e : Error(e)))\n const jo = new JsxObserver(obs, this.parentNode, null, this.xmlns, this.noInitialBinding)\n this.addDisposable(jo)\n return jo.insertBefore\n }\n\n updateAttributes (node, attributes) {\n const subscriptions = this.getSubscriptionsForNode(node)\n const toRemove = new Set([...node.attributes].map(n => n.name))\n\n for (const [name, value] of Object.entries(attributes || {})) {\n toRemove.delete(name)\n if (isObservable(value)) {\n subscriptions.push(\n value.subscribe(attr => this.setNodeAttribute(node, name, value)))\n }\n this.setNodeAttribute(node, name, value)\n }\n\n for (const name of toRemove) {\n this.setNodeAttribute(node, name, undefined)\n }\n }\n\n /**\n * See https://stackoverflow.com/a/52572048\n * @param {string} attr element attribute\n * @return {string} namespace argument for setAtttributeNS\n */\n getNamespaceOfAttribute (attr) {\n const [prefix, ...unqualifiedName] = attr.split(':')\n if (prefix === 'xmlns' || (unqualifiedName.length && NAMESPACES[prefix])) {\n return NAMESPACES[prefix]\n }\n return null\n }\n\n /**\n *\n * @param {HTMLElement} node\n * @param {string} name\n * @param {any} valueOrObservable\n */\n setNodeAttribute (node, name, valueOrObservable) {\n const value = unwrap(valueOrObservable)\n NativeProvider.addValueToNode(node, name, valueOrObservable)\n if (value === undefined) {\n node.removeAttributeNS(null, name)\n } else if (isThenable(valueOrObservable)) {\n Promise.resolve(valueOrObservable)\n .then(v => this.setNodeAttribute(node, name, v))\n } else {\n const ns = this.getNamespaceOfAttribute(name)\n node.setAttributeNS(ns, name, String(value))\n }\n }\n\n /**\n * @param {int} index\n * @return {Comment} that immediately precedes this.\n */\n lastNodeFor (index) {\n const nodesAtIndex = this.nodeArrayOrObservableAtIndex[index] || []\n const [lastNodeOfPrior] = nodesAtIndex.slice(-1)\n const insertBefore = lastNodeOfPrior instanceof JsxObserver\n ? lastNodeOfPrior.insertBefore : lastNodeOfPrior || this.insertBefore\n if (insertBefore) { return insertBefore.parentNode ? insertBefore : null }\n return null\n }\n\n removeAllPriorNodes () {\n const {nodeArrayOrObservableAtIndex} = this\n while (nodeArrayOrObservableAtIndex.length) {\n this.removeNodeArrayOrObservable(nodeArrayOrObservableAtIndex.pop())\n }\n }\n\n removeNodeArrayOrObservable (nodeArrayOrObservable) {\n for (const nodeOrObservable of nodeArrayOrObservable) {\n if (nodeOrObservable instanceof JsxObserver) {\n nodeOrObservable.dispose()\n continue\n }\n const node = nodeOrObservable\n delete node[ORIGINAL_JSX_SYM]\n this.detachAndDispose(node)\n const subscriptions = this.subscriptionsForNode.get(node)\n if (subscriptions) {\n subscriptions.forEach(s => s.dispose())\n this.subscriptionsForNode.delete(node)\n }\n }\n }\n\n /**\n * Detach the given node, and dispose of its children.\n *\n * The cleaning can trigger a lot of garbage collection, so we defer that.\n */\n detachAndDispose (node) {\n if (isIterable(node)) {\n for (const child of node) {\n this.detachAndDispose(child)\n }\n } else {\n node.remove()\n }\n queueCleanNode(node)\n }\n}\n\nexport default JsxObserver\n"],
"mappings": "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",
"sourcesContent": ["import { LifeCycle } from '@tko/lifecycle'\n\nimport { safeStringify, isThenable } from '@tko/utils'\n\nimport { applyBindings, contextFor } from '@tko/bind'\n\nimport { isObservable, unwrap, observable } from '@tko/observable'\n\nimport type { Observable } from '@tko/observable'\n\nimport { isComputed } from '@tko/computed'\n\nimport { NativeProvider, NATIVE_BINDINGS } from '@tko/provider.native'\n\nimport { queueCleanNode } from './jsxClean'\n\nexport const ORIGINAL_JSX_SYM = Symbol('Knockout - Original JSX')\n\nconst NAMESPACES = {\n svg: 'http://www.w3.org/2000/svg',\n html: 'http://www.w3.org/1999/xhtml',\n xml: 'http://www.w3.org/XML/1998/namespace',\n xlink: 'http://www.w3.org/1999/xlink',\n xmlns: 'http://www.w3.org/2000/xmlns/'\n}\n\nfunction isIterable(v) {\n return v && typeof v[Symbol.iterator] === 'function'\n}\n\n/**\n * JSX object from a pre-processor.\n * @typedef {Object} JSX\n * @property {string} elementName becomes the `tagName`\n * @property {Array.<JSX>} children\n * @property {object} attributes\n */\n\ninterface JSX {\n elementName: string\n children: Array<JSX>\n attributes: any\n}\n\ninterface Changes {\n index: number\n status: string\n value: any\n}\n\n/**\n * Observe a variety of possible cases from JSX, modifying the\n * `parentNode` at `insertBefore` with the result.\n */\nexport class JsxObserver extends LifeCycle {\n adoptedInsertBefore: boolean\n noInitialBinding: boolean\n insertBefore: Node | null\n parentNode: Node\n parentNodeTarget: Node | null\n subscriptionsForNode: any\n nodeArrayOrObservableAtIndex: any\n xmlns: any\n\n /**\n * @param {any} jsxOrObservable take a long list of permutations\n */\n constructor(\n jsxOrObservable: any,\n parentNode: Node,\n insertBefore: Node | null = null,\n xmlns?: any,\n noInitialBinding?: boolean | null\n ) {\n super()\n\n const parentNodeIsComment = parentNode.nodeType === Node.COMMENT_NODE\n\n const parentNodeTarget = this.getParentTarget(parentNode)\n\n if (isObservable(jsxOrObservable)) {\n jsxOrObservable.extend({ trackArrayChanges: true })\n this.subscribe(jsxOrObservable, this.observableArrayChange, 'arrayChange')\n\n if (!insertBefore) {\n const insertAt = parentNodeIsComment ? parentNode.nextSibling : null\n insertBefore = this.createComment('O')\n parentNodeTarget?.insertBefore(insertBefore, insertAt)\n } else {\n this.adoptedInsertBefore = true\n }\n }\n\n if (parentNodeIsComment && !insertBefore) {\n // Typcially: insertBefore becomes <!-- /ko -->\n insertBefore = parentNode.nextSibling\n // Mark this so we don't remove the next node - since we didn't create it.\n this.adoptedInsertBefore = true\n }\n\n this.anchorTo(insertBefore || parentNode)\n\n Object.assign(this, {\n insertBefore,\n noInitialBinding,\n parentNode,\n parentNodeTarget,\n xmlns,\n nodeArrayOrObservableAtIndex: [],\n subscriptionsForNode: new Map()\n })\n\n const jsx = unwrap(jsxOrObservable)\n const computed = isComputed(jsxOrObservable)\n\n if (computed || (jsx !== null && jsx !== undefined)) {\n this.observableArrayChange(this.createInitialAdditions(jsx))\n }\n this.noInitialBinding = false\n }\n\n getParentTarget(parentNode: Node): Node | null {\n if ('content' in parentNode) {\n return (parentNode as HTMLTemplateElement).content\n }\n if (parentNode.nodeType === Node.COMMENT_NODE) {\n return (parentNode as Comment).parentNode\n }\n return parentNode\n }\n\n remove() {\n this.dispose()\n }\n override dispose() {\n super.dispose()\n const ib = this.insertBefore\n const insertBeforeIsChild = ib && this.parentNodeTarget === ib.parentNode\n if (insertBeforeIsChild && !this.adoptedInsertBefore) {\n this.parentNodeTarget?.removeChild(ib)\n }\n this.removeAllPriorNodes()\n Object.assign(this, {\n parentNode: null,\n parentNodeTarget: null,\n insertBefore: null,\n nodeArrayOrObservableAtIndex: []\n })\n for (const subscriptions of this.subscriptionsForNode.values()) {\n subscriptions.forEach(s => s.dispose())\n }\n this.subscriptionsForNode.clear()\n }\n\n createInitialAdditions(possibleIterable): Changes[] {\n const status = 'added'\n if (typeof possibleIterable === 'object' && possibleIterable !== null && Symbol.iterator in possibleIterable) {\n possibleIterable = [...possibleIterable]\n }\n\n return Array.isArray(possibleIterable)\n ? possibleIterable.map((value, index) => ({ index, status, value }))\n : [{ status, index: 0, value: possibleIterable }]\n }\n\n /**\n * Note: array change notification indexes are:\n * - to the original array indexes for deletes\n * - to the new array indexes for adds\n * - sorted by index in ascending order\n */\n observableArrayChange(changes: Changes[]) {\n const adds: [number, any][] = []\n const dels: [number, any][] = []\n\n for (const index in changes) {\n const change = changes[index]\n if (change.status === 'added') {\n adds.push([change.index, change.value])\n } else {\n dels.unshift([change.index, change.value])\n }\n }\n\n dels.forEach(change => this.delChange(...change))\n adds.forEach(change => this.addChange(...change))\n }\n\n /**\n * Add a change at the given index.\n *\n * @param {int} index\n * @param {string|object|Array|Observable.string|Observable.Array|Observable.object} jsx\n */\n addChange(\n index: number,\n jsx: string | object | Array<any> | Observable<string> | Observable<any[]> | Observable<object>\n ) {\n this.nodeArrayOrObservableAtIndex.splice(index, 0, this.injectNode(jsx, this.lastNodeFor(index)!))\n }\n\n injectNode(jsx, nextNode: Node) {\n let nodeArrayOrObservable\n\n if (isObservable(jsx)) {\n const { parentNode, xmlns } = this\n const observer = new JsxObserver(jsx, parentNode, nextNode, xmlns, this.noInitialBinding)\n nodeArrayOrObservable = [observer]\n } else if (typeof jsx !== 'string' && isIterable(jsx)) {\n nodeArrayOrObservable = new Array()\n for (const child of jsx) {\n nodeArrayOrObservable.unshift(this.injectNode(child, nextNode))\n }\n } else {\n const $context = contextFor(this.parentNode as HTMLElement)\n const isInsideTemplate = 'content' in this.parentNode\n const shouldApplyBindings = $context && !isInsideTemplate && !this.noInitialBinding\n\n if (Array.isArray(jsx)) {\n nodeArrayOrObservable = jsx.map(j => this.anyToNode(j))\n } else {\n nodeArrayOrObservable = [this.anyToNode(jsx)]\n }\n\n for (const node of nodeArrayOrObservable) {\n this.parentNodeTarget?.insertBefore(node, nextNode)\n if (shouldApplyBindings && this.canApplyBindings(node)) {\n applyBindings($context, node)\n }\n }\n }\n\n return nodeArrayOrObservable\n }\n\n /**\n * True when Node is a type suitable for applyBindings i.e. a HTMLElement\n * or a Comment.\n * @param {Node} node\n */\n canApplyBindings(node: Node): boolean {\n return node.nodeType === Node.ELEMENT_NODE || node.nodeType === Node.COMMENT_NODE\n }\n\n delChange(index: number, _: any) {\n this.removeNodeArrayOrObservable(this.nodeArrayOrObservableAtIndex[index])\n this.nodeArrayOrObservableAtIndex.splice(index, 1)\n }\n\n getSubscriptionsForNode(node: Node) {\n if (!this.subscriptionsForNode.has(node)) {\n const subscriptions = new Array()\n this.subscriptionsForNode.set(node, subscriptions)\n return subscriptions\n }\n return this.subscriptionsForNode.get(node)\n }\n\n isJsx(jsx): jsx is JSX {\n return typeof jsx.elementName === 'string' && 'children' in jsx && 'attributes' in jsx\n }\n\n /**\n * @param {any} value acceptable to turn into a Node\n *\n * The one thing `any` cannot be here is an Array or Observable; both those\n * cases are handled with new JsxObservers.\n */\n anyToNode(any) {\n if (isThenable(any)) {\n return this.futureJsxNode(any)\n }\n\n switch (typeof any) {\n case 'object':\n if (any instanceof Error) {\n return this.createComment(any.toString())\n }\n if (any === null) {\n return this.createComment(String(any))\n }\n if (any instanceof Node) {\n return this.cloneJSXorMoveNode(any)\n }\n if (Symbol.iterator in any) {\n return any\n }\n break\n case 'function':\n return this.anyToNode(any())\n case 'undefined':\n case 'symbol':\n return this.createComment(String(any))\n case 'string':\n return this.createTextNode(any)\n case 'boolean':\n case 'number':\n case 'bigint':\n default:\n return this.createTextNode(String(any))\n }\n\n return this.isJsx(any) ? this.jsxToNode(any) : this.createComment(safeStringify(any))\n }\n\n createComment(string) {\n const node = document.createComment(string)\n node[NATIVE_BINDINGS] = true\n return node\n }\n\n createTextNode(string) {\n const node = document.createTextNode(string)\n node[NATIVE_BINDINGS] = true\n return node\n }\n\n /**\n * Clone a node; if that node was originally from JSX, we clone from there\n * so we preserve binding handlers.\n *\n * @param {HTMLElement} node\n */\n cloneJSXorMoveNode(node: Node) {\n return ORIGINAL_JSX_SYM in node ? this.jsxToNode(node[ORIGINAL_JSX_SYM] as JSX) : node\n }\n\n /**\n * @param {JSX} jsx to convert to a node.\n */\n jsxToNode(jsx: JSX) {\n const xmlns = jsx.attributes.xmlns || NAMESPACES[jsx.elementName] || this.xmlns\n const node = document.createElementNS(xmlns || NAMESPACES.html, jsx.elementName)\n\n /** Slots need to be able to replicate with the attributes, which\n * are not preserved when cloning from template nodes. */\n node[ORIGINAL_JSX_SYM] = jsx\n\n if (isObservable(jsx.attributes)) {\n const subscriptions = this.getSubscriptionsForNode(node)\n subscriptions.push(\n jsx.attributes.subscribe(attrs => {\n this.updateAttributes(node, unwrap(attrs))\n })\n )\n }\n this.updateAttributes(node, unwrap(jsx.attributes))\n\n this.addDisposable(new JsxObserver(jsx.children, node, null, xmlns, this.noInitialBinding))\n\n return node\n }\n\n futureJsxNode(promise) {\n const obs = observable()\n promise.then(obs).catch(e => obs(e instanceof Error ? e : Error(e)))\n const jo = new JsxObserver(obs, this.parentNode, null, this.xmlns, this.noInitialBinding)\n this.addDisposable(jo)\n return jo.insertBefore\n }\n\n updateAttributes(node, attributes) {\n const subscriptions = this.getSubscriptionsForNode(node)\n const toRemove = new Set([...node.attributes].map(n => n.name))\n\n for (const [name, value] of Object.entries(attributes || {})) {\n toRemove.delete(name)\n if (isObservable(value)) {\n subscriptions.push(value.subscribe(attr => this.setNodeAttribute(node, name, value)))\n }\n this.setNodeAttribute(node, name, value)\n }\n\n for (const name of toRemove) {\n this.setNodeAttribute(node, name, undefined)\n }\n }\n\n /**\n * See https://stackoverflow.com/a/52572048\n * @param {string} attr element attribute\n * @return {string} namespace argument for setAtttributeNS\n */\n getNamespaceOfAttribute(attr: string): string | null {\n const [prefix, ...unqualifiedName] = attr.split(':')\n if (prefix === 'xmlns' || (unqualifiedName.length && NAMESPACES[prefix])) {\n return NAMESPACES[prefix]\n }\n return null\n }\n\n /**\n *\n * @param {HTMLElement} node\n * @param {string} name\n * @param {any} valueOrObservable\n */\n setNodeAttribute(node: HTMLElement, name: string, valueOrObservable: any) {\n const value = unwrap(valueOrObservable)\n NativeProvider.addValueToNode(node, name, valueOrObservable)\n if (value === undefined) {\n node.removeAttributeNS(null, name)\n } else if (isThenable(valueOrObservable)) {\n Promise.resolve(valueOrObservable).then(v => this.setNodeAttribute(node, name, v))\n } else {\n const ns = this.getNamespaceOfAttribute(name)\n node.setAttributeNS(ns, name, String(value))\n }\n }\n\n /**\n * @param {int} index\n * @return {Comment} that immediately precedes this.\n */\n lastNodeFor(index: number): Comment | null {\n const nodesAtIndex = this.nodeArrayOrObservableAtIndex[index] || []\n const [lastNodeOfPrior] = nodesAtIndex.slice(-1)\n const insertBefore =\n lastNodeOfPrior instanceof JsxObserver ? lastNodeOfPrior.insertBefore : lastNodeOfPrior || this.insertBefore\n if (insertBefore) {\n return insertBefore.parentNode ? insertBefore : null\n }\n return null\n }\n\n removeAllPriorNodes() {\n const { nodeArrayOrObservableAtIndex } = this\n while (nodeArrayOrObservableAtIndex.length) {\n this.removeNodeArrayOrObservable(nodeArrayOrObservableAtIndex.pop())\n }\n }\n\n removeNodeArrayOrObservable(nodeArrayOrObservable) {\n for (const nodeOrObservable of nodeArrayOrObservable) {\n if (nodeOrObservable instanceof JsxObserver) {\n nodeOrObservable.dispose()\n continue\n }\n const node = nodeOrObservable\n delete node[ORIGINAL_JSX_SYM]\n this.detachAndDispose(node)\n const subscriptions = this.subscriptionsForNode.get(node)\n if (subscriptions) {\n subscriptions.forEach(s => s.dispose())\n this.subscriptionsForNode.delete(node)\n }\n }\n }\n\n /**\n * Detach the given node, and dispose of its children.\n *\n * The cleaning can trigger a lot of garbage collection, so we defer that.\n */\n detachAndDispose(node) {\n if (isIterable(node)) {\n for (const child of node) {\n this.detachAndDispose(child)\n }\n } else {\n node.remove()\n }\n queueCleanNode(node)\n }\n}\n\nexport default JsxObserver\n"],
"mappings": "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",
"names": []
}
{
"version": "4.0.0-beta1.3",
"version": "4.0.0",
"name": "@tko/utils.jsx",

@@ -28,8 +28,8 @@ "description": "TKO JSX Rendering",

"dependencies": {
"@tko/bind": "^4.0.0-beta1.3",
"@tko/computed": "^4.0.0-beta1.3",
"@tko/lifecycle": "^4.0.0-beta1.3",
"@tko/observable": "^4.0.0-beta1.3",
"@tko/provider.native": "^4.0.0-beta1.3",
"@tko/utils": "^4.0.0-beta1.3",
"@tko/bind": "^4.0.0",
"@tko/computed": "^4.0.0",
"@tko/lifecycle": "^4.0.0",
"@tko/observable": "^4.0.0",
"@tko/provider.native": "^4.0.0",
"@tko/utils": "^4.0.0",
"tslib": "^2.2.0"

@@ -53,4 +53,3 @@ },

"url": "https://github.com/knockout/tko/issues"
},
"gitHead": "a8843acb8ae085915115e53a4e057b30731c635e"
}
}
The MIT License (MIT) - http://www.opensource.org/licenses/mit-license.php
Copyright (c) Steven Sanderson, the Knockout.js team, and other contributors
http://knockoutjs.com/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display