@tko/utils.jsx
Advanced tools
+4
-10
@@ -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": [] | ||
| } |
+4
-10
@@ -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": [] | ||
| } |
+6
-14
@@ -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"); |
+2
-2
| { | ||
| "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": [] | ||
| } |
+4
-5
@@ -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": [] | ||
| } |
+81
-40
@@ -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": [] | ||
| } |
+8
-9
| { | ||
| "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" | ||
| } | ||
| } |
-22
| 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
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
368826
6.96%3845
9.14%0
-100%13
-7.14%Updated
Updated
Updated
Updated
Updated
Updated