+91
-76
@@ -1,2 +0,3 @@ | ||
| // @tko/bind 🥊 4.0.0-beta1.3 ESM | ||
| // @tko/bind 🥊 4.0.0 ESM | ||
| "use strict"; | ||
| import { | ||
@@ -13,27 +14,17 @@ extend, | ||
| } from "@tko/utils"; | ||
| import { | ||
| dependencyDetection | ||
| } from "@tko/observable"; | ||
| import { | ||
| computed | ||
| } from "@tko/computed"; | ||
| import { | ||
| dataFor, | ||
| bindingContext, | ||
| boundElementDomDataKey, | ||
| contextSubscribeSymbol | ||
| } from "./bindingContext"; | ||
| import { | ||
| bindingEvent | ||
| } from "./bindingEvent"; | ||
| import { | ||
| BindingResult | ||
| } from "./BindingResult"; | ||
| import { | ||
| LegacyBindingHandler | ||
| } from "./LegacyBindingHandler"; | ||
| import { dependencyDetection } from "@tko/observable"; | ||
| import { computed } from "@tko/computed"; | ||
| import { dataFor, bindingContext, boundElementDomDataKey, contextSubscribeSymbol } from "./bindingContext"; | ||
| import { bindingEvent } from "./bindingEvent"; | ||
| import { BindingResult } from "./BindingResult"; | ||
| import { LegacyBindingHandler } from "./LegacyBindingHandler"; | ||
| const bindingDoesNotRecurseIntoElementTypes = { | ||
| "script": true, | ||
| "textarea": true, | ||
| "template": true | ||
| // Don't want bindings that operate on text nodes to mutate <script> and <textarea> contents, | ||
| // because it's unexpected and a potential XSS issue. | ||
| // Also bindings should not operate on <template> elements since this breaks in Internet Explorer | ||
| // and because such elements' contents are always intended to be bound in a different context | ||
| // from where they appear in the document. | ||
| script: true, | ||
| textarea: true, | ||
| template: true | ||
| }; | ||
@@ -44,3 +35,3 @@ function getBindingProvider() { | ||
| function isProviderForNode(provider, node) { | ||
| const nodeTypes = provider.FOR_NODE_TYPES || [1, 3, 8]; | ||
| const nodeTypes = provider.FOR_NODE_TYPES || [Node.ELEMENT_NODE, Node.TEXT_NODE, Node.COMMENT_NODE]; | ||
| return nodeTypes.includes(node.nodeType); | ||
@@ -96,7 +87,7 @@ } | ||
| function applyBindingsToNodeAndDescendantsInternal(bindingContext2, nodeVerified, asyncBindingsApplied) { | ||
| var isElement = nodeVerified.nodeType === 1; | ||
| const isElement = nodeVerified.nodeType === Node.ELEMENT_NODE; | ||
| if (isElement) { | ||
| virtualElements.normaliseVirtualElementDomStructure(nodeVerified); | ||
| } | ||
| let shouldApplyBindings = isElement || hasBindings(nodeVerified); | ||
| const shouldApplyBindings = isElement || hasBindings(nodeVerified); | ||
| const { shouldBindDescendants } = shouldApplyBindings ? applyBindingsToNodeInternal(nodeVerified, null, bindingContext2, asyncBindingsApplied) : { shouldBindDescendants: true }; | ||
@@ -110,3 +101,3 @@ if (shouldBindDescendants && !bindingDoesNotRecurseIntoElementTypes[tagNameLower(nodeVerified)]) { | ||
| const bindingsConsidered = {}; | ||
| const cyclicDependencyStack = []; | ||
| const cyclicDependencyStack = new Array(); | ||
| objectForEach(bindings, function pushBinding(bindingKey) { | ||
@@ -125,3 +116,5 @@ if (!bindingsConsidered[bindingKey]) { | ||
| if (arrayIndexOf(cyclicDependencyStack, bindingDependencyKey) !== -1) { | ||
| throw Error("Cannot combine the following bindings, because they have a cyclic dependency: " + cyclicDependencyStack.join(", ")); | ||
| throw Error( | ||
| "Cannot combine the following bindings, because they have a cyclic dependency: " + cyclicDependencyStack.join(", ") | ||
| ); | ||
| } else { | ||
@@ -162,3 +155,4 @@ pushBinding(bindingDependencyKey); | ||
| } | ||
| var bindings; | ||
| let bindings = null; | ||
| let bindingsUpdater = null; | ||
| if (sourceBindings && typeof sourceBindings !== "function") { | ||
@@ -170,9 +164,13 @@ bindings = sourceBindings; | ||
| if (isProviderForNode(provider, node)) { | ||
| var bindingsUpdater = computed(function() { | ||
| bindings = sourceBindings ? sourceBindings(bindingContext2, node) : getBindings.call(provider, node, bindingContext2); | ||
| if (bindings && bindingContext2[contextSubscribeSymbol]) { | ||
| bindingContext2[contextSubscribeSymbol](); | ||
| } | ||
| return bindings; | ||
| }, null, { disposeWhenNodeIsRemoved: node }); | ||
| bindingsUpdater = computed( | ||
| function() { | ||
| bindings = sourceBindings ? sourceBindings(bindingContext2, node) : getBindings.call(provider, node, bindingContext2); | ||
| if (bindings && bindingContext2[contextSubscribeSymbol]) { | ||
| bindingContext2[contextSubscribeSymbol](); | ||
| } | ||
| return bindings; | ||
| }, | ||
| null, | ||
| { disposeWhenNodeIsRemoved: node } | ||
| ); | ||
| if (!bindings || !bindingsUpdater.isActive()) { | ||
@@ -183,7 +181,4 @@ bindingsUpdater = null; | ||
| } | ||
| var bindingHandlerThatControlsDescendantBindings; | ||
| let bindingHandlerThatControlsDescendantBindings; | ||
| if (bindings) { | ||
| let allBindings = function() { | ||
| return objectMap(bindingsUpdater ? bindingsUpdater() : bindings, evaluateValueAccessor); | ||
| }; | ||
| const $component = bindingContext2.$component || {}; | ||
@@ -200,15 +195,23 @@ const allBindingHandlers = {}; | ||
| } : (bindingKey) => bindings[bindingKey]; | ||
| const allBindings = function() { | ||
| return objectMap(bindingsUpdater ? bindingsUpdater() : bindings, evaluateValueAccessor); | ||
| }; | ||
| allBindings.has = (key) => key in bindings; | ||
| allBindings.get = (key) => bindings[key] && evaluateValueAccessor(getValueAccessor(key)); | ||
| if (bindingEvent.childrenComplete in bindings) { | ||
| bindingEvent.subscribe(node, bindingEvent.childrenComplete, () => { | ||
| const callback = evaluateValueAccessor(bindings[bindingEvent.childrenComplete]); | ||
| if (!callback) { | ||
| return; | ||
| } | ||
| const nodes = virtualElements.childNodes(node); | ||
| if (nodes.length) { | ||
| callback(nodes, dataFor(nodes[0])); | ||
| } | ||
| }); | ||
| bindingEvent.subscribe( | ||
| node, | ||
| bindingEvent.childrenComplete, | ||
| () => { | ||
| const callback = evaluateValueAccessor(bindings[bindingEvent.childrenComplete]); | ||
| if (!callback) { | ||
| return; | ||
| } | ||
| const nodes = virtualElements.childNodes(node); | ||
| if (nodes.length) { | ||
| callback(nodes, dataFor(nodes[0])); | ||
| } | ||
| }, | ||
| null | ||
| ); | ||
| } | ||
@@ -218,3 +221,3 @@ const bindingsGenerated = topologicalSortBindings(bindings, $component); | ||
| for (const [key, BindingHandlerClass] of bindingsGenerated) { | ||
| let reportBindingError = function(during, errorCaptured) { | ||
| const reportBindingError = function(during, errorCaptured) { | ||
| onBindingError({ | ||
@@ -231,15 +234,17 @@ during, | ||
| }; | ||
| if (node.nodeType === 8 && !BindingHandlerClass.allowVirtualElements) { | ||
| if (node.nodeType === Node.COMMENT_NODE && !BindingHandlerClass.allowVirtualElements) { | ||
| throw new Error(`The binding '${key}' cannot be used with virtual elements`); | ||
| } | ||
| try { | ||
| const bindingHandler = dependencyDetection.ignore(() => new BindingHandlerClass({ | ||
| allBindings, | ||
| $element: node, | ||
| $context: bindingContext2, | ||
| onError: reportBindingError, | ||
| valueAccessor(...v) { | ||
| return getValueAccessor(key)(...v); | ||
| } | ||
| })); | ||
| const bindingHandler = dependencyDetection.ignore( | ||
| () => new BindingHandlerClass({ | ||
| allBindings, | ||
| $element: node, | ||
| $context: bindingContext2, | ||
| onError: reportBindingError, | ||
| valueAccessor(...v) { | ||
| return getValueAccessor(key)(...v); | ||
| } | ||
| }) | ||
| ); | ||
| if (bindingHandler.onValueChange) { | ||
@@ -251,3 +256,5 @@ dependencyDetection.ignore(() => bindingHandler.computed("onValueChange")); | ||
| if (bindingHandlerThatControlsDescendantBindings !== void 0) { | ||
| throw new Error("Multiple bindings (" + bindingHandlerThatControlsDescendantBindings + " and " + key + ") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element."); | ||
| throw new Error( | ||
| "Multiple bindings (" + bindingHandlerThatControlsDescendantBindings + " and " + key + ") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element." | ||
| ); | ||
| } | ||
@@ -261,3 +268,4 @@ bindingHandlerThatControlsDescendantBindings = key; | ||
| } catch (err) { | ||
| reportBindingError("creation", err); | ||
| const error = err instanceof Error ? err : new Error(String(err)); | ||
| reportBindingError("creation", error); | ||
| } | ||
@@ -290,6 +298,11 @@ } | ||
| export function applyBindingAccessorsToNode(node, bindings, viewModelOrBindingContext, asyncBindingsApplied) { | ||
| if (node.nodeType === 1) { | ||
| if (node.nodeType === Node.ELEMENT_NODE) { | ||
| virtualElements.normaliseVirtualElementDomStructure(node); | ||
| } | ||
| return applyBindingsToNodeInternal(node, bindings, getBindingContext(viewModelOrBindingContext), asyncBindingsApplied); | ||
| return applyBindingsToNodeInternal( | ||
| node, | ||
| bindings, | ||
| getBindingContext(viewModelOrBindingContext), | ||
| asyncBindingsApplied | ||
| ); | ||
| } | ||
@@ -305,14 +318,11 @@ export function applyBindingsToNode(node, bindings, viewModelOrBindingContext) { | ||
| const asyncBindingsApplied = /* @__PURE__ */ new Set(); | ||
| if (rootNode.nodeType === 1 || rootNode.nodeType === 8) { | ||
| const bindingContext2 = getBindingContext(viewModelOrBindingContext); | ||
| const bindingContext2 = getBindingContext(viewModelOrBindingContext); | ||
| if (rootNode.nodeType === Node.ELEMENT_NODE || rootNode.nodeType === Node.COMMENT_NODE) { | ||
| applyBindingsToDescendantsInternal(bindingContext2, rootNode, asyncBindingsApplied); | ||
| return new BindingResult({ asyncBindingsApplied, rootNode, bindingContext: bindingContext2 }); | ||
| } | ||
| return new BindingResult({ asyncBindingsApplied, rootNode }); | ||
| return new BindingResult({ asyncBindingsApplied, rootNode, bindingContext: bindingContext2 }); | ||
| } | ||
| export function applyBindings(viewModelOrBindingContext, rootNode, extendContextCallback) { | ||
| const asyncBindingsApplied = /* @__PURE__ */ new Set(); | ||
| if (!options.jQuery === void 0 && options.jQuery) { | ||
| options.jQuery = options.jQuery; | ||
| } | ||
| if (!rootNode) { | ||
@@ -323,3 +333,3 @@ rootNode = window.document.body; | ||
| } | ||
| } else if (rootNode.nodeType !== 1 && rootNode.nodeType !== 8) { | ||
| } else if (rootNode.nodeType !== Node.ELEMENT_NODE && rootNode.nodeType !== Node.COMMENT_NODE) { | ||
| throw Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node"); | ||
@@ -332,3 +342,3 @@ } | ||
| function onBindingError(spec) { | ||
| var error, bindingText; | ||
| let error; | ||
| if (spec.bindingKey) { | ||
@@ -344,3 +354,8 @@ error = spec.errorCaptured; | ||
| spec.stack = error.stack; | ||
| error = new Error(error.message ? error.message : error); | ||
| const message = error.message || String(error); | ||
| const originalName = error.name; | ||
| error = new Error(message); | ||
| if (originalName && originalName !== "Error") { | ||
| error.name = originalName; | ||
| } | ||
| extend(error, spec); | ||
@@ -347,0 +362,0 @@ } |
| { | ||
| "version": 3, | ||
| "sources": ["../src/applyBindings.ts"], | ||
| "sourcesContent": ["\n/* eslint no-cond-assign: 0 */\n\nimport {\n extend, objectMap, virtualElements, tagNameLower, domData, objectForEach,\n arrayIndexOf, arrayForEach, options\n} from '@tko/utils'\n\nimport {\n dependencyDetection\n} from '@tko/observable'\n\nimport {\n computed\n} from '@tko/computed'\n\nimport {\n dataFor, bindingContext, boundElementDomDataKey, contextSubscribeSymbol\n} from './bindingContext'\n\nimport {\n bindingEvent\n} from './bindingEvent'\n\nimport {\n BindingResult\n} from './BindingResult'\n\nimport {\n LegacyBindingHandler\n} from './LegacyBindingHandler'\n\n// The following element types will not be recursed into during binding.\nconst bindingDoesNotRecurseIntoElementTypes = {\n // Don't want bindings that operate on text nodes to mutate <script> and <textarea> contents,\n // because it's unexpected and a potential XSS issue.\n // Also bindings should not operate on <template> elements since this breaks in Internet Explorer\n // and because such elements' contents are always intended to be bound in a different context\n // from where they appear in the document.\n 'script': true,\n 'textarea': true,\n 'template': true\n}\n\nfunction getBindingProvider () {\n return options.bindingProviderInstance.instance || options.bindingProviderInstance\n}\n\nfunction isProviderForNode (provider, node) {\n const nodeTypes = provider.FOR_NODE_TYPES || [1, 3, 8]\n return nodeTypes.includes(node.nodeType)\n}\n\nfunction asProperHandlerClass (handler, bindingKey) {\n if (!handler) { return }\n return handler.isBindingHandlerClass ? handler\n : LegacyBindingHandler.getOrCreateFor(bindingKey, handler)\n}\n\nfunction getBindingHandlerFromComponent (bindingKey, $component) {\n if (!$component || typeof $component.getBindingHandler !== 'function') { return }\n return asProperHandlerClass($component.getBindingHandler(bindingKey))\n}\n\nexport function getBindingHandler (bindingKey) {\n const bindingDefinition = options.getBindingHandler(bindingKey) || getBindingProvider().bindingHandlers.get(bindingKey)\n return asProperHandlerClass(bindingDefinition, bindingKey)\n}\n\n// Returns the value of a valueAccessor function\nfunction evaluateValueAccessor (valueAccessor) {\n return valueAccessor()\n}\n\nfunction applyBindingsToDescendantsInternal (bindingContext, elementOrVirtualElement, asyncBindingsApplied) {\n let nextInQueue = virtualElements.firstChild(elementOrVirtualElement)\n\n if (!nextInQueue) { return }\n\n let currentChild\n const provider = getBindingProvider()\n const preprocessNode = provider.preprocessNode\n\n // Preprocessing allows a binding provider to mutate a node before bindings are applied to it. For example it's\n // possible to insert new siblings after it, and/or replace the node with a different one. This can be used to\n // implement custom binding syntaxes, such as {{ value }} for string interpolation, or custom element types that\n // trigger insertion of <template> contents at that point in the document.\n if (preprocessNode) {\n while (currentChild = nextInQueue) {\n nextInQueue = virtualElements.nextSibling(currentChild)\n preprocessNode.call(provider, currentChild)\n }\n\n // Reset nextInQueue for the next loop\n nextInQueue = virtualElements.firstChild(elementOrVirtualElement)\n }\n\n while (currentChild = nextInQueue) {\n // Keep a record of the next child *before* applying bindings, in case the binding removes the current child from its position\n nextInQueue = virtualElements.nextSibling(currentChild)\n applyBindingsToNodeAndDescendantsInternal(bindingContext, currentChild, asyncBindingsApplied)\n }\n\n bindingEvent.notify(elementOrVirtualElement, bindingEvent.childrenComplete)\n}\n\nfunction hasBindings (node) {\n const provider = getBindingProvider()\n return isProviderForNode(provider, node) && provider.nodeHasBindings(node)\n}\n\nfunction nodeOrChildHasBindings (node) {\n return hasBindings(node) || [...node.childNodes].some(c => nodeOrChildHasBindings(c))\n}\n\nfunction applyBindingsToNodeAndDescendantsInternal (bindingContext, nodeVerified, asyncBindingsApplied) {\n var isElement = nodeVerified.nodeType === 1\n if (isElement) { // Workaround IE <= 8 HTML parsing weirdness\n virtualElements.normaliseVirtualElementDomStructure(nodeVerified)\n }\n\n // Perf optimisation: Apply bindings only if...\n // (1) We need to store the binding info for the node (all element nodes)\n // (2) It might have bindings (e.g., it has a data-bind attribute, or it's a marker for a containerless template)\n\n let shouldApplyBindings = isElement || // Case (1)\n hasBindings(nodeVerified) // Case (2)\n\n const { shouldBindDescendants } = shouldApplyBindings\n ? applyBindingsToNodeInternal(nodeVerified, null, bindingContext, asyncBindingsApplied)\n : { shouldBindDescendants: true }\n\n if (shouldBindDescendants && !bindingDoesNotRecurseIntoElementTypes[tagNameLower(nodeVerified)]) {\n // We're recursing automatically into (real or virtual) child nodes without changing binding contexts. So,\n // * For children of a *real* element, the binding context is certainly the same as on their DOM .parentNode,\n // hence bindingContextsMayDifferFromDomParentElement is false\n // * For children of a *virtual* element, we can't be sure. Evaluating .parentNode on those children may\n // skip over any number of intermediate virtual elements, any of which might define a custom binding context,\n // hence bindingContextsMayDifferFromDomParentElement is true\n applyBindingsToDescendantsInternal(bindingContext, nodeVerified, asyncBindingsApplied)\n }\n}\n\n\nfunction * topologicalSortBindings (bindings, $component) {\n const results = []\n // Depth-first sort\n const bindingsConsidered = {} // A temporary record of which bindings are already in 'result'\n const cyclicDependencyStack = [] // Keeps track of a depth-search so that, if there's a cycle, we know which bindings caused it\n\n objectForEach(bindings, function pushBinding (bindingKey) {\n if (!bindingsConsidered[bindingKey]) {\n const binding = getBindingHandlerFromComponent(bindingKey, $component) || getBindingHandler(bindingKey)\n if (!binding) { return }\n // First add dependencies (if any) of the current binding\n if (binding.after) {\n cyclicDependencyStack.push(bindingKey)\n arrayForEach(binding.after, function (bindingDependencyKey) {\n if (!bindings[bindingDependencyKey]) { return }\n if (arrayIndexOf(cyclicDependencyStack, bindingDependencyKey) !== -1) {\n throw Error('Cannot combine the following bindings, because they have a cyclic dependency: ' + cyclicDependencyStack.join(', '))\n } else {\n pushBinding(bindingDependencyKey)\n }\n })\n cyclicDependencyStack.length--\n }\n // Next add the current binding\n results.push([ bindingKey, binding ])\n }\n bindingsConsidered[bindingKey] = true\n })\n\n for (const result of results) { yield result }\n}\n\nfunction applyBindingsToNodeInternal (node, sourceBindings, bindingContext, asyncBindingsApplied) {\n const bindingInfo = domData.getOrSet(node, boundElementDomDataKey, {})\n // Prevent multiple applyBindings calls for the same node, except when a binding value is specified\n const alreadyBound = bindingInfo.alreadyBound\n if (!sourceBindings) {\n if (alreadyBound) {\n if (!nodeOrChildHasBindings(node)) { return false }\n onBindingError({\n during: 'apply',\n errorCaptured: new Error('You cannot apply bindings multiple times to the same element.'),\n element: node,\n bindingContext\n })\n return false\n }\n bindingInfo.alreadyBound = true\n }\n\n if (!alreadyBound) {\n bindingInfo.context = bindingContext\n }\n\n // Use bindings if given, otherwise fall back on asking the bindings provider to give us some bindings\n var bindings\n if (sourceBindings && typeof sourceBindings !== 'function') {\n bindings = sourceBindings\n } else {\n const provider = getBindingProvider()\n const getBindings = provider.getBindingAccessors\n\n if (isProviderForNode(provider, node)) {\n // Get the binding from the provider within a computed observable so that we can update the bindings whenever\n // the binding context is updated or if the binding provider accesses observables.\n var bindingsUpdater = computed(\n function () {\n bindings = sourceBindings ? sourceBindings(bindingContext, node) : getBindings.call(provider, node, bindingContext)\n // Register a dependency on the binding context to support observable view models.\n if (bindings && bindingContext[contextSubscribeSymbol]) { bindingContext[contextSubscribeSymbol]() }\n return bindings\n },\n null, { disposeWhenNodeIsRemoved: node }\n )\n\n if (!bindings || !bindingsUpdater.isActive()) { bindingsUpdater = null }\n }\n }\n\n var bindingHandlerThatControlsDescendantBindings\n if (bindings) {\n const $component = bindingContext.$component || {}\n\n const allBindingHandlers = {}\n domData.set(node, 'bindingHandlers', allBindingHandlers)\n\n // Return the value accessor for a given binding. When bindings are static (won't be updated because of a binding\n // context update), just return the value accessor from the binding. Otherwise, return a function that always gets\n // the latest binding value and registers a dependency on the binding updater.\n const getValueAccessor = bindingsUpdater\n ? (bindingKey) => function (optionalValue) {\n const valueAccessor = bindingsUpdater()[bindingKey]\n if (arguments.length === 0) {\n return evaluateValueAccessor(valueAccessor)\n } else {\n return valueAccessor(optionalValue)\n }\n } : (bindingKey) => bindings[bindingKey]\n\n // Use of allBindings as a function is maintained for backwards compatibility, but its use is deprecated\n function allBindings () {\n return objectMap(bindingsUpdater ? bindingsUpdater() : bindings, evaluateValueAccessor)\n }\n\n // The following is the 3.x allBindings API\n allBindings.has = (key) => key in bindings\n allBindings.get = (key) => bindings[key] && evaluateValueAccessor(getValueAccessor(key))\n\n if (bindingEvent.childrenComplete in bindings) {\n bindingEvent.subscribe(node, bindingEvent.childrenComplete, () => {\n const callback = evaluateValueAccessor(bindings[bindingEvent.childrenComplete])\n if (!callback) { return }\n const nodes = virtualElements.childNodes(node)\n if (nodes.length) { callback(nodes, dataFor(nodes[0])) }\n })\n }\n\n const bindingsGenerated = topologicalSortBindings(bindings, $component)\n const nodeAsyncBindingPromises = new Set()\n for (const [key, BindingHandlerClass] of bindingsGenerated) {\n // Go through the sorted bindings, calling init and update for each\n function reportBindingError (during, errorCaptured) {\n onBindingError({\n during,\n errorCaptured,\n bindings,\n allBindings,\n bindingKey: key,\n bindingContext,\n element: node,\n valueAccessor: getValueAccessor(key)\n })\n }\n\n if (node.nodeType === 8 && !BindingHandlerClass.allowVirtualElements) {\n throw new Error(`The binding '${key}' cannot be used with virtual elements`)\n }\n\n try {\n const bindingHandler = dependencyDetection.ignore(() =>\n new BindingHandlerClass({\n allBindings,\n $element: node,\n $context: bindingContext,\n onError: reportBindingError,\n valueAccessor (...v) { return getValueAccessor(key)(...v) }\n })\n )\n\n if (bindingHandler.onValueChange) {\n dependencyDetection.ignore(() =>\n bindingHandler.computed('onValueChange')\n )\n }\n\n // Expose the bindings via domData.\n allBindingHandlers[key] = bindingHandler\n\n if (bindingHandler.controlsDescendants) {\n if (bindingHandlerThatControlsDescendantBindings !== undefined) { throw new Error('Multiple bindings (' + bindingHandlerThatControlsDescendantBindings + ' and ' + key + ') are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.') }\n bindingHandlerThatControlsDescendantBindings = key\n }\n\n if (bindingHandler.bindingCompleted instanceof Promise) {\n asyncBindingsApplied.add(bindingHandler.bindingCompleted)\n nodeAsyncBindingPromises.add(bindingHandler.bindingCompleted)\n }\n } catch (err) {\n reportBindingError('creation', err)\n }\n }\n\n triggerDescendantsComplete(node, bindings, nodeAsyncBindingPromises)\n }\n\n const shouldBindDescendants = bindingHandlerThatControlsDescendantBindings === undefined\n return { shouldBindDescendants }\n}\n\n/**\n *\n * @param {HTMLElement} node\n * @param {Object} bindings\n * @param {[Promise]} nodeAsyncBindingPromises\n */\nfunction triggerDescendantsComplete (node, bindings, nodeAsyncBindingPromises) {\n /** descendantsComplete ought to be an instance of the descendantsComplete\n * binding handler. */\n const hasBindingHandler = bindingEvent.descendantsComplete in bindings\n const hasFirstChild = virtualElements.firstChild(node)\n const accessor = hasBindingHandler && evaluateValueAccessor(bindings[bindingEvent.descendantsComplete])\n const callback = () => {\n bindingEvent.notify(node, bindingEvent.descendantsComplete)\n if (accessor && hasFirstChild) { accessor(node) }\n }\n if (nodeAsyncBindingPromises.size) {\n Promise.all(nodeAsyncBindingPromises).then(callback)\n } else {\n callback()\n }\n}\n\n\nfunction getBindingContext (viewModelOrBindingContext, extendContextCallback) {\n return viewModelOrBindingContext && (viewModelOrBindingContext instanceof bindingContext)\n ? viewModelOrBindingContext\n : new bindingContext(viewModelOrBindingContext, undefined, undefined, extendContextCallback)\n}\n\nexport function applyBindingAccessorsToNode (node, bindings, viewModelOrBindingContext, asyncBindingsApplied) {\n if (node.nodeType === 1) { // If it's an element, workaround IE <= 8 HTML parsing weirdness\n virtualElements.normaliseVirtualElementDomStructure(node)\n }\n return applyBindingsToNodeInternal(node, bindings, getBindingContext(viewModelOrBindingContext), asyncBindingsApplied)\n}\n\nexport function applyBindingsToNode (node, bindings, viewModelOrBindingContext) {\n const asyncBindingsApplied = new Set()\n const bindingContext = getBindingContext(viewModelOrBindingContext)\n const bindingAccessors = getBindingProvider().makeBindingAccessors(bindings, bindingContext, node)\n applyBindingAccessorsToNode(node, bindingAccessors, bindingContext, asyncBindingsApplied)\n return new BindingResult({asyncBindingsApplied, rootNode: node, bindingContext})\n}\n\nexport function applyBindingsToDescendants (viewModelOrBindingContext, rootNode) {\n const asyncBindingsApplied = new Set()\n if (rootNode.nodeType === 1 || rootNode.nodeType === 8) {\n const bindingContext = getBindingContext(viewModelOrBindingContext)\n applyBindingsToDescendantsInternal(bindingContext, rootNode, asyncBindingsApplied)\n return new BindingResult({asyncBindingsApplied, rootNode, bindingContext})\n }\n return new BindingResult({asyncBindingsApplied, rootNode})\n}\n\nexport function applyBindings (viewModelOrBindingContext, rootNode, extendContextCallback) {\n const asyncBindingsApplied = new Set()\n // If jQuery is loaded after Knockout, we won't initially have access to it. So save it here.\n if (!options.jQuery === undefined && options.jQuery) {\n options.jQuery = options.jQuery\n }\n\n // rootNode is optional\n if (!rootNode) {\n rootNode = window.document.body\n if (!rootNode) {\n throw Error('ko.applyBindings: could not find window.document.body; has the document been loaded?')\n }\n } else if (rootNode.nodeType !== 1 && rootNode.nodeType !== 8) {\n throw Error('ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node')\n }\n const rootContext = getBindingContext(viewModelOrBindingContext, extendContextCallback)\n applyBindingsToNodeAndDescendantsInternal(rootContext, rootNode, asyncBindingsApplied)\n return Promise.all(asyncBindingsApplied)\n}\n\nfunction onBindingError (spec) {\n var error, bindingText\n if (spec.bindingKey) {\n // During: 'init' or initial 'update'\n error = spec.errorCaptured\n spec.message = 'Unable to process binding \"' + spec.bindingKey +\n '\" in binding \"' + spec.bindingKey +\n '\"\\nMessage: ' + (error.message ? error.message : error)\n } else {\n // During: 'apply'\n error = spec.errorCaptured\n }\n try {\n extend(error, spec)\n } catch (e) {\n // Read-only error e.g. a DOMEXception.\n spec.stack = error.stack\n error = new Error(error.message ? error.message : error)\n extend(error, spec)\n }\n options.onError(error)\n}\n"], | ||
| "mappings": "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", | ||
| "names": [] | ||
| "sourcesContent": ["/* eslint no-cond-assign: 0 */\n\nimport {\n extend,\n objectMap,\n virtualElements,\n tagNameLower,\n domData,\n objectForEach,\n arrayIndexOf,\n arrayForEach,\n options\n} from '@tko/utils'\n\nimport { dependencyDetection } from '@tko/observable'\n\nimport type { Observable } from '@tko/observable'\n\nimport { Computed, computed } from '@tko/computed'\n\nimport { dataFor, bindingContext, boundElementDomDataKey, contextSubscribeSymbol } from './bindingContext'\n\nimport { bindingEvent } from './bindingEvent'\n\nimport { BindingResult } from './BindingResult'\n\nimport { LegacyBindingHandler } from './LegacyBindingHandler'\n\nimport type { Provider } from '@tko/provider'\nimport type { BindingHandler, AllBindings } from './BindingHandler'\nimport type { BindingContext } from './bindingContext'\n\ninterface BindingError {\n during: string\n errorCaptured: Error\n bindings?: any\n allBindings?: AllBindings\n bindingKey?: string\n bindingContext: BindingContext\n element: Node\n valueAccessor?: Function\n message?: string\n stack?: any\n}\n\ntype BindingHandlerOrUndefined = (typeof BindingHandler & BindingHandler) | undefined\n\n// The following element types will not be recursed into during binding.\nconst bindingDoesNotRecurseIntoElementTypes = {\n // Don't want bindings that operate on text nodes to mutate <script> and <textarea> contents,\n // because it's unexpected and a potential XSS issue.\n // Also bindings should not operate on <template> elements since this breaks in Internet Explorer\n // and because such elements' contents are always intended to be bound in a different context\n // from where they appear in the document.\n script: true,\n textarea: true,\n template: true\n}\n\nfunction getBindingProvider(): Provider {\n return options.bindingProviderInstance.instance || options.bindingProviderInstance\n}\n\nfunction isProviderForNode(provider: Provider, node: Node): boolean {\n const nodeTypes = provider.FOR_NODE_TYPES || [Node.ELEMENT_NODE, Node.TEXT_NODE, Node.COMMENT_NODE]\n return nodeTypes.includes(node.nodeType)\n}\n\nfunction asProperHandlerClass(handler?: any, bindingKey?: string): BindingHandlerOrUndefined {\n if (!handler) {\n return\n }\n return handler.isBindingHandlerClass ? handler : LegacyBindingHandler.getOrCreateFor(bindingKey, handler)\n}\n\nfunction getBindingHandlerFromComponent(bindingKey: string, $component: any): BindingHandlerOrUndefined {\n if (!$component || typeof $component.getBindingHandler !== 'function') {\n return\n }\n return asProperHandlerClass($component.getBindingHandler(bindingKey))\n}\n\nexport function getBindingHandler(bindingKey: string): BindingHandlerOrUndefined {\n const bindingDefinition =\n options.getBindingHandler(bindingKey) || getBindingProvider().bindingHandlers.get(bindingKey)\n return asProperHandlerClass(bindingDefinition, bindingKey)\n}\n\n// Returns the value of a valueAccessor function\nfunction evaluateValueAccessor(valueAccessor: Function): any {\n return valueAccessor()\n}\n\nfunction applyBindingsToDescendantsInternal(\n bindingContext: BindingContext,\n elementOrVirtualElement: Node,\n asyncBindingsApplied: Set<any>\n) {\n let nextInQueue: ChildNode | null = virtualElements.firstChild(elementOrVirtualElement)\n\n if (!nextInQueue) {\n return\n }\n\n let currentChild: Node | null\n const provider = getBindingProvider()\n const preprocessNode = provider.preprocessNode\n\n // Preprocessing allows a binding provider to mutate a node before bindings are applied to it. For example it's\n // possible to insert new siblings after it, and/or replace the node with a different one. This can be used to\n // implement custom binding syntaxes, such as {{ value }} for string interpolation, or custom element types that\n // trigger insertion of <template> contents at that point in the document.\n if (preprocessNode) {\n while ((currentChild = nextInQueue)) {\n nextInQueue = virtualElements.nextSibling(currentChild)\n preprocessNode.call(provider, currentChild)\n }\n\n // Reset nextInQueue for the next loop\n nextInQueue = virtualElements.firstChild(elementOrVirtualElement)\n }\n\n while ((currentChild = nextInQueue)) {\n // Keep a record of the next child *before* applying bindings, in case the binding removes the current child from its position\n nextInQueue = virtualElements.nextSibling(currentChild)\n applyBindingsToNodeAndDescendantsInternal(bindingContext, currentChild, asyncBindingsApplied)\n }\n\n bindingEvent.notify(elementOrVirtualElement, bindingEvent.childrenComplete)\n}\n\nfunction hasBindings(node: Node): boolean | undefined {\n const provider = getBindingProvider()\n return isProviderForNode(provider, node) && provider.nodeHasBindings(node as Element)\n}\n\nfunction nodeOrChildHasBindings(node: Node): boolean {\n return hasBindings(node) || [...node.childNodes].some(c => nodeOrChildHasBindings(c))\n}\n\nfunction applyBindingsToNodeAndDescendantsInternal(\n bindingContext: BindingContext,\n nodeVerified: Node,\n asyncBindingsApplied\n) {\n const isElement = nodeVerified.nodeType === Node.ELEMENT_NODE\n if (isElement) {\n // Workaround IE <= 8 HTML parsing weirdness\n virtualElements.normaliseVirtualElementDomStructure(nodeVerified)\n }\n\n // Perf optimisation: Apply bindings only if...\n // (1) We need to store the binding info for the node (all element nodes)\n // (2) It might have bindings (e.g., it has a data-bind attribute, or it's a marker for a containerless template)\n\n const shouldApplyBindings =\n isElement // Case (1)\n || hasBindings(nodeVerified) // Case (2)\n\n const { shouldBindDescendants }: any = shouldApplyBindings\n ? applyBindingsToNodeInternal(nodeVerified, null, bindingContext, asyncBindingsApplied)\n : { shouldBindDescendants: true }\n\n if (shouldBindDescendants && !bindingDoesNotRecurseIntoElementTypes[tagNameLower(nodeVerified as Element)]) {\n // We're recursing automatically into (real or virtual) child nodes without changing binding contexts. So,\n // * For children of a *real* element, the binding context is certainly the same as on their DOM .parentNode,\n // hence bindingContextsMayDifferFromDomParentElement is false\n // * For children of a *virtual* element, we can't be sure. Evaluating .parentNode on those children may\n // skip over any number of intermediate virtual elements, any of which might define a custom binding context,\n // hence bindingContextsMayDifferFromDomParentElement is true\n applyBindingsToDescendantsInternal(bindingContext, nodeVerified, asyncBindingsApplied)\n }\n}\n\nfunction* topologicalSortBindings(bindings: Record<string, any>, $component: any) {\n const results: [string, typeof BindingHandler][] = []\n // Depth-first sort\n const bindingsConsidered = {} // A temporary record of which bindings are already in 'result'\n const cyclicDependencyStack = new Array() // Keeps track of a depth-search so that, if there's a cycle, we know which bindings caused it\n\n objectForEach(bindings, function pushBinding(bindingKey) {\n if (!bindingsConsidered[bindingKey]) {\n const binding = getBindingHandlerFromComponent(bindingKey, $component) || getBindingHandler(bindingKey)\n if (!binding) {\n return\n }\n // First add dependencies (if any) of the current binding\n if (binding.after) {\n cyclicDependencyStack.push(bindingKey)\n arrayForEach(binding.after, function (bindingDependencyKey) {\n if (!bindings[bindingDependencyKey]) {\n return\n }\n if (arrayIndexOf(cyclicDependencyStack, bindingDependencyKey) !== -1) {\n throw Error(\n 'Cannot combine the following bindings, because they have a cyclic dependency: '\n + cyclicDependencyStack.join(', ')\n )\n } else {\n pushBinding(bindingDependencyKey)\n }\n })\n cyclicDependencyStack.length--\n }\n // Next add the current binding\n results.push([bindingKey, binding])\n }\n bindingsConsidered[bindingKey] = true\n })\n\n for (const result of results) {\n yield result\n }\n}\n\nfunction applyBindingsToNodeInternal<T>(\n node: Node,\n sourceBindings: Record<string, any> | null,\n bindingContext: BindingContext<T>,\n asyncBindingsApplied?: Set<any>\n) {\n const bindingInfo = domData.getOrSet(node, boundElementDomDataKey, {})\n // Prevent multiple applyBindings calls for the same node, except when a binding value is specified\n const alreadyBound = bindingInfo.alreadyBound\n if (!sourceBindings) {\n if (alreadyBound) {\n if (!nodeOrChildHasBindings(node)) {\n return false\n }\n onBindingError({\n during: 'apply',\n errorCaptured: new Error('You cannot apply bindings multiple times to the same element.'),\n element: node,\n bindingContext\n })\n return false\n }\n bindingInfo.alreadyBound = true\n }\n\n if (!alreadyBound) {\n bindingInfo.context = bindingContext\n }\n\n // Use bindings if given, otherwise fall back on asking the bindings provider to give us some bindings\n let bindings: Record<string, any> | null = null\n let bindingsUpdater: Computed | null = null\n if (sourceBindings && typeof sourceBindings !== 'function') {\n bindings = sourceBindings\n } else {\n const provider = getBindingProvider()\n const getBindings = provider.getBindingAccessors\n\n if (isProviderForNode(provider, node)) {\n // Get the binding from the provider within a computed observable so that we can update the bindings whenever\n // the binding context is updated or if the binding provider accesses observables.\n bindingsUpdater = computed(\n function () {\n bindings = sourceBindings\n ? sourceBindings(bindingContext, node)\n : getBindings.call(provider, node, bindingContext)\n // Register a dependency on the binding context to support observable view models.\n if (bindings && bindingContext[contextSubscribeSymbol]) {\n bindingContext[contextSubscribeSymbol]()\n }\n return bindings\n },\n null,\n { disposeWhenNodeIsRemoved: node }\n )\n\n if (!bindings || !bindingsUpdater.isActive()) {\n bindingsUpdater = null\n }\n }\n }\n\n let bindingHandlerThatControlsDescendantBindings: string | undefined\n if (bindings) {\n const $component = bindingContext.$component || {}\n\n const allBindingHandlers = {}\n domData.set(node, 'bindingHandlers', allBindingHandlers)\n\n // Return the value accessor for a given binding. When bindings are static (won't be updated because of a binding\n // context update), just return the value accessor from the binding. Otherwise, return a function that always gets\n // the latest binding value and registers a dependency on the binding updater.\n const getValueAccessor = bindingsUpdater\n ? bindingKey =>\n function (optionalValue) {\n const valueAccessor = bindingsUpdater()[bindingKey]\n if (arguments.length === 0) {\n return evaluateValueAccessor(valueAccessor)\n } else {\n return valueAccessor(optionalValue)\n }\n }\n : bindingKey => bindings![bindingKey]\n\n // Use of allBindings as a function is maintained for backwards compatibility, but its use is deprecated\n const allBindings: AllBindings = function (): any {\n return objectMap(bindingsUpdater ? bindingsUpdater() : bindings, evaluateValueAccessor)\n }\n\n // The following is the 3.x allBindings API\n allBindings.has = (key: string) => key in bindings!\n allBindings.get = (key: string) => bindings![key] && evaluateValueAccessor(getValueAccessor(key))\n\n if (bindingEvent.childrenComplete in bindings) {\n bindingEvent.subscribe(\n node,\n bindingEvent.childrenComplete,\n () => {\n const callback = evaluateValueAccessor(bindings![bindingEvent.childrenComplete])\n if (!callback) {\n return\n }\n const nodes = virtualElements.childNodes(node)\n if (nodes.length) {\n callback(nodes, dataFor(nodes[0]))\n }\n },\n null\n )\n }\n\n const bindingsGenerated = topologicalSortBindings(bindings, $component)\n const nodeAsyncBindingPromises = new Set<Promise<any>>()\n for (const [key, BindingHandlerClass] of bindingsGenerated) {\n // Go through the sorted bindings, calling init and update for each\n const reportBindingError = function (during: string, errorCaptured: Error) {\n onBindingError({\n during,\n errorCaptured,\n bindings,\n allBindings,\n bindingKey: key,\n bindingContext,\n element: node,\n valueAccessor: getValueAccessor(key)\n })\n }\n\n if (node.nodeType === Node.COMMENT_NODE && !BindingHandlerClass.allowVirtualElements) {\n throw new Error(`The binding '${key}' cannot be used with virtual elements`)\n }\n\n try {\n const bindingHandler = dependencyDetection.ignore(\n () =>\n new BindingHandlerClass({\n allBindings,\n $element: node,\n $context: bindingContext,\n onError: reportBindingError,\n valueAccessor(...v) {\n return getValueAccessor(key)(...v)\n }\n })\n )\n\n if (bindingHandler.onValueChange) {\n dependencyDetection.ignore(() => bindingHandler.computed('onValueChange'))\n }\n\n // Expose the bindings via domData.\n allBindingHandlers[key] = bindingHandler\n\n if (bindingHandler.controlsDescendants) {\n if (bindingHandlerThatControlsDescendantBindings !== undefined) {\n throw new Error(\n 'Multiple bindings ('\n + bindingHandlerThatControlsDescendantBindings\n + ' and '\n + key\n + ') are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.'\n )\n }\n bindingHandlerThatControlsDescendantBindings = key\n }\n\n if (bindingHandler.bindingCompleted instanceof Promise) {\n asyncBindingsApplied!.add(bindingHandler.bindingCompleted)\n nodeAsyncBindingPromises.add(bindingHandler.bindingCompleted)\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n reportBindingError('creation', error)\n }\n }\n\n triggerDescendantsComplete(node, bindings, nodeAsyncBindingPromises)\n }\n\n const shouldBindDescendants = bindingHandlerThatControlsDescendantBindings === undefined\n return { shouldBindDescendants }\n}\n\n/**\n *\n * @param {HTMLElement} node\n * @param {Object} bindings\n * @param {[Promise]} nodeAsyncBindingPromises\n */\nfunction triggerDescendantsComplete(node: Node, bindings: object, nodeAsyncBindingPromises: Set<Promise<any>>) {\n /** descendantsComplete ought to be an instance of the descendantsComplete\n * binding handler. */\n const hasBindingHandler = bindingEvent.descendantsComplete in bindings\n const hasFirstChild = virtualElements.firstChild(node)\n const accessor = hasBindingHandler && evaluateValueAccessor(bindings[bindingEvent.descendantsComplete])\n const callback = () => {\n bindingEvent.notify(node, bindingEvent.descendantsComplete)\n if (accessor && hasFirstChild) {\n accessor(node)\n }\n }\n if (nodeAsyncBindingPromises.size) {\n Promise.all(nodeAsyncBindingPromises).then(callback)\n } else {\n callback()\n }\n}\n\n// used in applyBinding, bindingContext.ts\nexport type BindingContextExtendCallback<T = any> = (\n self: BindingContext<T>,\n parentContext?: BindingContext<T>,\n dataItem?: T\n) => void\n\nfunction getBindingContext<T = any>(\n viewModelOrBindingContext: any,\n extendContextCallback?: BindingContextExtendCallback<T>\n): BindingContext<T> {\n return viewModelOrBindingContext && viewModelOrBindingContext instanceof bindingContext\n ? viewModelOrBindingContext\n : new bindingContext<T>(viewModelOrBindingContext, undefined, undefined, extendContextCallback)\n}\n\nexport function applyBindingAccessorsToNode<T = any>(\n node: HTMLElement,\n bindings: Record<string, any>,\n viewModelOrBindingContext?: BindingContext<T> | Observable<T> | T,\n asyncBindingsApplied?: Set<any>\n) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n // If it's an element, workaround IE <= 8 HTML parsing weirdness\n virtualElements.normaliseVirtualElementDomStructure(node)\n }\n return applyBindingsToNodeInternal<T>(\n node,\n bindings,\n getBindingContext(viewModelOrBindingContext),\n asyncBindingsApplied\n )\n}\n\nexport function applyBindingsToNode<T = any>(\n node: HTMLElement,\n bindings: Record<string, any>,\n viewModelOrBindingContext: BindingContext<T> | Observable<T> | T\n): BindingResult {\n const asyncBindingsApplied = new Set()\n const bindingContext = getBindingContext<T>(viewModelOrBindingContext)\n const bindingAccessors = getBindingProvider().makeBindingAccessors(bindings, bindingContext, node)\n applyBindingAccessorsToNode(node, bindingAccessors, bindingContext, asyncBindingsApplied)\n return new BindingResult({ asyncBindingsApplied, rootNode: node, bindingContext })\n}\n\nexport function applyBindingsToDescendants<T = any>(\n viewModelOrBindingContext: T | BindingContext<T>,\n rootNode: Node\n): BindingResult {\n const asyncBindingsApplied = new Set()\n const bindingContext = getBindingContext(viewModelOrBindingContext)\n if (rootNode.nodeType === Node.ELEMENT_NODE || rootNode.nodeType === Node.COMMENT_NODE) {\n applyBindingsToDescendantsInternal(bindingContext, rootNode, asyncBindingsApplied)\n return new BindingResult({ asyncBindingsApplied, rootNode, bindingContext })\n }\n return new BindingResult({ asyncBindingsApplied, rootNode, bindingContext })\n}\n\nexport function applyBindings<T = any>(\n viewModelOrBindingContext: BindingContext<T> | Observable<T> | T,\n rootNode: HTMLElement,\n extendContextCallback?: BindingContextExtendCallback<T>\n): Promise<unknown> {\n const asyncBindingsApplied = new Set()\n\n // rootNode is optional\n if (!rootNode) {\n rootNode = window.document.body\n if (!rootNode) {\n throw Error('ko.applyBindings: could not find window.document.body; has the document been loaded?')\n }\n } else if (rootNode.nodeType !== Node.ELEMENT_NODE && rootNode.nodeType !== Node.COMMENT_NODE) {\n throw Error('ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node')\n }\n const rootContext = getBindingContext<T>(viewModelOrBindingContext, extendContextCallback)\n applyBindingsToNodeAndDescendantsInternal(rootContext, rootNode, asyncBindingsApplied)\n return Promise.all(asyncBindingsApplied)\n}\n\nfunction onBindingError(spec: BindingError) {\n let error: Error\n if (spec.bindingKey) {\n // During: 'init' or initial 'update'\n error = spec.errorCaptured\n spec.message =\n 'Unable to process binding \"'\n + spec.bindingKey\n + '\" in binding \"'\n + spec.bindingKey\n + '\"\\nMessage: '\n + (error.message ? error.message : error)\n } else {\n // During: 'apply'\n error = spec.errorCaptured\n }\n try {\n extend(error, spec)\n } catch (e: any) {\n // Read-only error e.g. a DOMEXception.\n spec.stack = error.stack\n\n const message = error.message || String(error)\n const originalName = error.name\n error = new Error(message)\n if (originalName && originalName !== 'Error') {\n error.name = originalName\n }\n extend(error, spec)\n }\n options.onError(error)\n}\n"], | ||
| "mappings": "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", | ||
| "names": ["bindingContext"] | ||
| } |
@@ -1,2 +0,3 @@ | ||
| // @tko/bind 🥊 4.0.0-beta1.3 ESM | ||
| // @tko/bind 🥊 4.0.0 ESM | ||
| "use strict"; | ||
| import { | ||
@@ -16,26 +17,33 @@ fixUpContinuousNodeArray, | ||
| } from "@tko/utils"; | ||
| import { | ||
| dependencyDetection, | ||
| observable | ||
| } from "@tko/observable"; | ||
| import { dependencyDetection, observable } from "@tko/observable"; | ||
| import { computed } from "@tko/computed"; | ||
| function mapNodeAndRefreshWhenChanged(containerNode, mapping, valueToMap, callbackAfterAddingNodes, index) { | ||
| var mappedNodes = []; | ||
| var dependentObservable = computed(function() { | ||
| var newMappedNodes = mapping(valueToMap, index, fixUpContinuousNodeArray(mappedNodes, containerNode)) || []; | ||
| if (mappedNodes.length > 0) { | ||
| replaceDomNodes(mappedNodes, newMappedNodes); | ||
| if (callbackAfterAddingNodes) { | ||
| dependencyDetection.ignore(callbackAfterAddingNodes, null, [valueToMap, newMappedNodes, index]); | ||
| const mappedNodes = []; | ||
| const dependentObservable = computed( | ||
| function() { | ||
| const newMappedNodes = mapping(valueToMap, index, fixUpContinuousNodeArray(mappedNodes, containerNode)) || []; | ||
| if (mappedNodes.length > 0) { | ||
| replaceDomNodes(mappedNodes, newMappedNodes); | ||
| if (callbackAfterAddingNodes) { | ||
| dependencyDetection.ignore(callbackAfterAddingNodes, null, [valueToMap, newMappedNodes, index]); | ||
| } | ||
| } | ||
| mappedNodes.length = 0; | ||
| arrayPushAll(mappedNodes, newMappedNodes); | ||
| }, | ||
| null, | ||
| { | ||
| disposeWhenNodeIsRemoved: containerNode, | ||
| disposeWhen: function() { | ||
| return !anyDomNodeIsAttachedToDocument(mappedNodes); | ||
| } | ||
| } | ||
| mappedNodes.length = 0; | ||
| arrayPushAll(mappedNodes, newMappedNodes); | ||
| }, null, { disposeWhenNodeIsRemoved: containerNode, disposeWhen: function() { | ||
| return !anyDomNodeIsAttachedToDocument(mappedNodes); | ||
| } }); | ||
| return { mappedNodes, dependentObservable: dependentObservable.isActive() ? dependentObservable : void 0 }; | ||
| ); | ||
| return { | ||
| mappedNodes, | ||
| dependentObservable: dependentObservable.isActive() ? dependentObservable : void 0 | ||
| }; | ||
| } | ||
| var lastMappingResultDomDataKey = domData.nextKey(); | ||
| let deletedItemDummyValue = domData.nextKey(); | ||
| const lastMappingResultDomDataKey = domData.nextKey(); | ||
| const deletedItemDummyValue = domData.nextKey(); | ||
| export function setDomNodeChildrenFromArrayMapping(domNode, array, mapping, options, callbackAfterAddingNodes, editScript) { | ||
@@ -47,13 +55,13 @@ array = array || []; | ||
| options = options || {}; | ||
| let lastMappingResult = domData.get(domNode, lastMappingResultDomDataKey); | ||
| let isFirstExecution = !lastMappingResult; | ||
| var newMappingResult = []; | ||
| var lastMappingResultIndex = 0; | ||
| var newMappingResultIndex = 0; | ||
| var nodesToDelete = []; | ||
| var itemsToProcess = []; | ||
| var itemsForBeforeRemoveCallbacks = []; | ||
| var itemsForMoveCallbacks = []; | ||
| var itemsForAfterAddCallbacks = []; | ||
| var mapData; | ||
| const lastMappingResult = domData.get(domNode, lastMappingResultDomDataKey); | ||
| const isFirstExecution = !lastMappingResult; | ||
| const newMappingResult = new Array(); | ||
| let lastMappingResultIndex = 0; | ||
| let newMappingResultIndex = 0; | ||
| const nodesToDelete = []; | ||
| const itemsToProcess = []; | ||
| const itemsForBeforeRemoveCallbacks = []; | ||
| const itemsForMoveCallbacks = []; | ||
| const itemsForAfterAddCallbacks = []; | ||
| let mapData; | ||
| let countWaitingForRemove = 0; | ||
@@ -80,5 +88,5 @@ function itemAdded(value) { | ||
| if (callback) { | ||
| for (var i2 = 0, n = items.length; i2 < n; i2++) { | ||
| arrayForEach(items[i2].mappedNodes, function(node2) { | ||
| callback(node2, i2, items[i2].arrayEntry); | ||
| for (let i = 0, n = items.length; i < n; i++) { | ||
| arrayForEach(items[i].mappedNodes, function(node) { | ||
| callback(node, i, items[i].arrayEntry); | ||
| }); | ||
@@ -92,12 +100,9 @@ } | ||
| if (!editScript || lastMappingResult && lastMappingResult["_countWaitingForRemove"]) { | ||
| var lastArray = isFirstExecution ? [] : arrayMap(lastMappingResult, function(x) { | ||
| const lastArray = arrayMap(lastMappingResult, function(x) { | ||
| return x.arrayEntry; | ||
| }); | ||
| var compareOptions = { | ||
| "dontLimitMoves": options["dontLimitMoves"], | ||
| "sparse": true | ||
| }; | ||
| const compareOptions = { dontLimitMoves: options.dontLimitMoves, sparse: true }; | ||
| editScript = compareArrays(lastArray, array, compareOptions); | ||
| } | ||
| for (var i = 0, editScriptItem, movedIndex, itemIndex; editScriptItem = editScript[i]; i++) { | ||
| for (let i = 0, editScriptItem, movedIndex, itemIndex; editScriptItem = editScript[i]; i++) { | ||
| movedIndex = editScriptItem["moved"]; | ||
@@ -117,3 +122,3 @@ itemIndex = editScriptItem["index"]; | ||
| if (fixUpContinuousNodeArray(mapData.mappedNodes, domNode).length) { | ||
| if (options["beforeRemove"]) { | ||
| if (options.beforeRemove) { | ||
| newMappingResult.push(mapData); | ||
@@ -128,3 +133,3 @@ itemsToProcess.push(mapData); | ||
| } | ||
| if (mapData) { | ||
| if (mapData?.mappedNodes) { | ||
| nodesToDelete.push.apply(nodesToDelete, mapData.mappedNodes); | ||
@@ -154,10 +159,18 @@ } | ||
| domData.set(domNode, lastMappingResultDomDataKey, newMappingResult); | ||
| callCallback(options["beforeMove"], itemsForMoveCallbacks); | ||
| arrayForEach(nodesToDelete, options["beforeRemove"] ? cleanNode : removeNode); | ||
| i = 0; | ||
| for (var nextNode = virtualElements.firstChild(domNode), lastNode, node; mapData = itemsToProcess[i]; i++) { | ||
| callCallback(options.beforeMove, itemsForMoveCallbacks); | ||
| arrayForEach(nodesToDelete, options.beforeRemove ? cleanNode : removeNode); | ||
| for (let k = 0, nextNode = virtualElements.firstChild(domNode), lastNode, node; mapData = itemsToProcess[k]; k++) { | ||
| if (!mapData.mappedNodes) { | ||
| extend(mapData, mapNodeAndRefreshWhenChanged(domNode, mapping, mapData.arrayEntry, callbackAfterAddingNodes, mapData.indexObservable)); | ||
| extend( | ||
| mapData, | ||
| mapNodeAndRefreshWhenChanged( | ||
| domNode, | ||
| mapping, | ||
| mapData.arrayEntry, | ||
| callbackAfterAddingNodes, | ||
| mapData.indexObservable | ||
| ) | ||
| ); | ||
| } | ||
| for (var j = 0; node = mapData.mappedNodes[j]; nextNode = node.nextSibling, lastNode = node, j++) { | ||
| for (let j = 0; node = mapData.mappedNodes[j]; nextNode = node.nextSibling, lastNode = node, j++) { | ||
| if (node !== nextNode) { | ||
@@ -172,8 +185,8 @@ virtualElements.insertAfter(domNode, node, lastNode); | ||
| } | ||
| callCallback(options["beforeRemove"], itemsForBeforeRemoveCallbacks); | ||
| for (i = 0; i < itemsForBeforeRemoveCallbacks.length; ++i) { | ||
| itemsForBeforeRemoveCallbacks[i].arrayEntry = deletedItemDummyValue; | ||
| callCallback(options.beforeRemove, itemsForBeforeRemoveCallbacks); | ||
| for (let x = 0; x < itemsForBeforeRemoveCallbacks.length; ++x) { | ||
| itemsForBeforeRemoveCallbacks[x].arrayEntry = deletedItemDummyValue; | ||
| } | ||
| callCallback(options["afterMove"], itemsForMoveCallbacks); | ||
| callCallback(options["afterAdd"], itemsForAfterAddCallbacks); | ||
| callCallback(options.afterMove, itemsForMoveCallbacks); | ||
| callCallback(options.afterAdd, itemsForAfterAddCallbacks); | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../src/arrayToDomNodeChildren.ts"], | ||
| "sourcesContent": ["/* eslint no-cond-assign: 0 */\nimport {\n fixUpContinuousNodeArray, replaceDomNodes, arrayPushAll,\n anyDomNodeIsAttachedToDocument, domData, arrayMap, arrayForEach,\n virtualElements, extend, cleanNode, removeNode, compareArrays\n} from '@tko/utils'\n\nimport {\n dependencyDetection, observable\n} from '@tko/observable'\n\nimport { computed } from '@tko/computed'\n\n// Objective:\n// * Given an input array, a container DOM node, and a function from array elements to arrays of DOM nodes,\n// map the array elements to arrays of DOM nodes, concatenate together all these arrays, and use them to populate the container DOM node\n// * Next time we're given the same combination of things (with the array possibly having mutated), update the container DOM node\n// so that its children is again the concatenation of the mappings of the array elements, but don't re-map any array elements that we\n// previously mapped - retain those nodes, and just insert/delete other ones\n\n// \"callbackAfterAddingNodes\" will be invoked after any \"mapping\"-generated nodes are inserted into the container node\n// You can use this, for example, to activate bindings on those nodes.\n\nfunction mapNodeAndRefreshWhenChanged (containerNode, mapping, valueToMap, callbackAfterAddingNodes, index) {\n // Map this array value inside a dependentObservable so we re-map when any dependency changes\n var mappedNodes = []\n var dependentObservable = computed(function () {\n var newMappedNodes = mapping(valueToMap, index, fixUpContinuousNodeArray(mappedNodes, containerNode)) || []\n\n // On subsequent evaluations, just replace the previously-inserted DOM nodes\n if (mappedNodes.length > 0) {\n replaceDomNodes(mappedNodes, newMappedNodes)\n if (callbackAfterAddingNodes) { dependencyDetection.ignore(callbackAfterAddingNodes, null, [valueToMap, newMappedNodes, index]) }\n }\n\n // Replace the contents of the mappedNodes array, thereby updating the record\n // of which nodes would be deleted if valueToMap was itself later removed\n mappedNodes.length = 0\n arrayPushAll(mappedNodes, newMappedNodes)\n }, null, { disposeWhenNodeIsRemoved: containerNode, disposeWhen: function () { return !anyDomNodeIsAttachedToDocument(mappedNodes) } })\n return { mappedNodes: mappedNodes, dependentObservable: (dependentObservable.isActive() ? dependentObservable : undefined) }\n}\n\nvar lastMappingResultDomDataKey = domData.nextKey()\nlet deletedItemDummyValue = domData.nextKey()\n\nexport function setDomNodeChildrenFromArrayMapping (domNode, array, mapping, options, callbackAfterAddingNodes, editScript) {\n // Compare the provided array against the previous one\n array = array || []\n if (typeof array.length === 'undefined') {\n array = [array]\n }\n options = options || {}\n let lastMappingResult = domData.get(domNode, lastMappingResultDomDataKey)\n let isFirstExecution = !lastMappingResult\n\n // Build the new mapping result\n var newMappingResult = []\n var lastMappingResultIndex = 0\n var newMappingResultIndex = 0\n\n var nodesToDelete = []\n var itemsToProcess = []\n var itemsForBeforeRemoveCallbacks = []\n var itemsForMoveCallbacks = []\n var itemsForAfterAddCallbacks = []\n var mapData\n let countWaitingForRemove = 0\n\n function itemAdded (value) {\n mapData = { arrayEntry: value, indexObservable: observable(newMappingResultIndex++) }\n newMappingResult.push(mapData)\n itemsToProcess.push(mapData)\n if (!isFirstExecution) {\n itemsForAfterAddCallbacks.push(mapData)\n }\n }\n\n function itemMovedOrRetained (oldPosition) {\n mapData = lastMappingResult[oldPosition]\n if (newMappingResultIndex !== oldPosition) {\n itemsForMoveCallbacks.push(mapData)\n }\n // Since updating the index might change the nodes, do so before calling fixUpContinuousNodeArray\n mapData.indexObservable(newMappingResultIndex++)\n fixUpContinuousNodeArray(mapData.mappedNodes, domNode)\n newMappingResult.push(mapData)\n itemsToProcess.push(mapData)\n }\n\n function callCallback (callback, items) {\n if (callback) {\n for (var i = 0, n = items.length; i < n; i++) {\n arrayForEach(items[i].mappedNodes, function (node) {\n callback(node, i, items[i].arrayEntry)\n })\n }\n }\n }\n\n if (isFirstExecution) {\n arrayForEach(array, itemAdded)\n } else {\n if (!editScript || (lastMappingResult && lastMappingResult['_countWaitingForRemove'])) {\n // Compare the provided array against the previous one\n var lastArray = isFirstExecution ? [] : arrayMap(lastMappingResult, function (x) { return x.arrayEntry })\n var compareOptions = {\n 'dontLimitMoves': options['dontLimitMoves'],\n 'sparse': true\n }\n editScript = compareArrays(lastArray, array, compareOptions)\n }\n\n for (var i = 0, editScriptItem, movedIndex, itemIndex; editScriptItem = editScript[i]; i++) {\n movedIndex = editScriptItem['moved']\n itemIndex = editScriptItem['index']\n switch (editScriptItem['status']) {\n case 'deleted':\n while (lastMappingResultIndex < itemIndex) {\n itemMovedOrRetained(lastMappingResultIndex++)\n }\n if (movedIndex === undefined) {\n mapData = lastMappingResult[lastMappingResultIndex]\n\n // Stop tracking changes to the mapping for these nodes\n if (mapData.dependentObservable) {\n mapData.dependentObservable.dispose()\n mapData.dependentObservable = undefined\n }\n\n // Queue these nodes for later removal\n if (fixUpContinuousNodeArray(mapData.mappedNodes, domNode).length) {\n if (options['beforeRemove']) {\n newMappingResult.push(mapData)\n itemsToProcess.push(mapData)\n countWaitingForRemove++\n if (mapData.arrayEntry === deletedItemDummyValue) {\n mapData = null\n } else {\n itemsForBeforeRemoveCallbacks.push(mapData)\n }\n }\n if (mapData) {\n nodesToDelete.push.apply(nodesToDelete, mapData.mappedNodes)\n }\n }\n }\n lastMappingResultIndex++\n break\n\n case 'added':\n while (newMappingResultIndex < itemIndex) {\n itemMovedOrRetained(lastMappingResultIndex++)\n }\n if (movedIndex !== undefined) {\n itemMovedOrRetained(movedIndex)\n } else {\n itemAdded(editScriptItem['value'])\n }\n break\n }\n }\n\n while (newMappingResultIndex < array.length) {\n itemMovedOrRetained(lastMappingResultIndex++)\n }\n\n // Record that the current view may still contain deleted items\n // because it means we won't be able to use a provided editScript.\n newMappingResult['_countWaitingForRemove'] = countWaitingForRemove\n }\n\n // Store a copy of the array items we just considered so we can difference it next time\n domData.set(domNode, lastMappingResultDomDataKey, newMappingResult)\n\n // Call beforeMove first before any changes have been made to the DOM\n callCallback(options['beforeMove'], itemsForMoveCallbacks)\n\n // Next remove nodes for deleted items (or just clean if there's a beforeRemove callback)\n arrayForEach(nodesToDelete, options['beforeRemove'] ? cleanNode : removeNode)\n\n // Next add/reorder the remaining items (will include deleted items if there's a beforeRemove callback)\n i = 0\n for (var nextNode = virtualElements.firstChild(domNode), lastNode, node; mapData = itemsToProcess[i]; i++) {\n // Get nodes for newly added items\n if (!mapData.mappedNodes) { extend(mapData, mapNodeAndRefreshWhenChanged(domNode, mapping, mapData.arrayEntry, callbackAfterAddingNodes, mapData.indexObservable)) }\n\n // Put nodes in the right place if they aren't there already\n for (var j = 0; node = mapData.mappedNodes[j]; nextNode = node.nextSibling, lastNode = node, j++) {\n if (node !== nextNode) { virtualElements.insertAfter(domNode, node, lastNode) }\n }\n\n // Run the callbacks for newly added nodes (for example, to apply bindings, etc.)\n if (!mapData.initialized && callbackAfterAddingNodes) {\n callbackAfterAddingNodes(mapData.arrayEntry, mapData.mappedNodes, mapData.indexObservable)\n mapData.initialized = true\n }\n }\n\n // If there's a beforeRemove callback, call it after reordering.\n // Note that we assume that the beforeRemove callback will usually be used to remove the nodes using\n // some sort of animation, which is why we first reorder the nodes that will be removed. If the\n // callback instead removes the nodes right away, it would be more efficient to skip reordering them.\n // Perhaps we'll make that change in the future if this scenario becomes more common.\n callCallback(options['beforeRemove'], itemsForBeforeRemoveCallbacks)\n\n // Replace the stored values of deleted items with a dummy value. This provides two benefits: it marks this item\n // as already \"removed\" so we won't call beforeRemove for it again, and it ensures that the item won't match up\n // with an actual item in the array and appear as \"retained\" or \"moved\".\n for (i = 0; i < itemsForBeforeRemoveCallbacks.length; ++i) {\n itemsForBeforeRemoveCallbacks[i].arrayEntry = deletedItemDummyValue\n }\n\n // Finally call afterMove and afterAdd callbacks\n callCallback(options['afterMove'], itemsForMoveCallbacks)\n callCallback(options['afterAdd'], itemsForAfterAddCallbacks)\n}\n"], | ||
| "mappings": "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", | ||
| "sourcesContent": ["/* eslint no-cond-assign: 0 */\nimport {\n fixUpContinuousNodeArray,\n replaceDomNodes,\n arrayPushAll,\n anyDomNodeIsAttachedToDocument,\n domData,\n arrayMap,\n arrayForEach,\n virtualElements,\n extend,\n cleanNode,\n removeNode,\n compareArrays\n} from '@tko/utils'\n\nimport { dependencyDetection, observable } from '@tko/observable'\n\nimport type { Observable } from '@tko/observable'\n\nimport { computed } from '@tko/computed'\n\nimport type { Computed } from '@tko/computed'\n\ntype MappingFunction<T = any> = (valueToMap: T, index: number | Observable<number>, nodes: Node[]) => Node[]\ntype MappingAfterAddFunction<T = any> = (arrayEntry: T, nodes: Node[], index: Observable<number>) => Node[]\ntype MappingHookFunction<T = any> = (nodes: Node[], index: number, arrayEntry: T) => void\n\ninterface MappingOptions<T = any> {\n dontLimitMoves?: boolean\n beforeMove?: MappingHookFunction<T>\n beforeRemove?: MappingHookFunction<T>\n afterAdd?: MappingHookFunction<T>\n afterMove?: MappingHookFunction<T>\n afterRemove?: MappingHookFunction<T>\n sparse?: boolean\n}\n\n// Objective:\n// * Given an input array, a container DOM node, and a function from array elements to arrays of DOM nodes,\n// map the array elements to arrays of DOM nodes, concatenate together all these arrays, and use them to populate the container DOM node\n// * Next time we're given the same combination of things (with the array possibly having mutated), update the container DOM node\n// so that its children is again the concatenation of the mappings of the array elements, but don't re-map any array elements that we\n// previously mapped - retain those nodes, and just insert/delete other ones\n\n// \"callbackAfterAddingNodes\" will be invoked after any \"mapping\"-generated nodes are inserted into the container node\n// You can use this, for example, to activate bindings on those nodes.\n\nfunction mapNodeAndRefreshWhenChanged(\n containerNode: Node,\n mapping: MappingFunction,\n valueToMap: any,\n callbackAfterAddingNodes: MappingAfterAddFunction | undefined,\n index: number | Observable<number>\n) {\n // Map this array value inside a dependentObservable so we re-map when any dependency changes\n const mappedNodes: Node[] = []\n const dependentObservable: Computed<void> = computed(\n function () {\n const newMappedNodes: Node[] =\n mapping(valueToMap, index, fixUpContinuousNodeArray(mappedNodes, containerNode)) || []\n\n // On subsequent evaluations, just replace the previously-inserted DOM nodes\n if (mappedNodes.length > 0) {\n replaceDomNodes(mappedNodes, newMappedNodes)\n if (callbackAfterAddingNodes) {\n dependencyDetection.ignore(callbackAfterAddingNodes, null, [valueToMap, newMappedNodes, index])\n }\n }\n\n // Replace the contents of the mappedNodes array, thereby updating the record\n // of which nodes would be deleted if valueToMap was itself later removed\n mappedNodes.length = 0\n arrayPushAll(mappedNodes, newMappedNodes)\n },\n null,\n {\n disposeWhenNodeIsRemoved: containerNode,\n disposeWhen: function () {\n return !anyDomNodeIsAttachedToDocument(mappedNodes)\n }\n }\n )\n return {\n mappedNodes: mappedNodes,\n dependentObservable: dependentObservable.isActive() ? dependentObservable : undefined\n }\n}\n\nconst lastMappingResultDomDataKey = domData.nextKey()\nconst deletedItemDummyValue = domData.nextKey()\n\nexport function setDomNodeChildrenFromArrayMapping<T = any>(\n domNode: Node,\n array: any,\n mapping: MappingFunction<T>,\n options?: MappingOptions<T>,\n callbackAfterAddingNodes?: MappingAfterAddFunction<T> | ((...params: any) => any),\n editScript?: any[]\n) {\n // Compare the provided array against the previous one\n array = array || []\n if (typeof array.length === 'undefined') {\n array = [array]\n }\n\n options = options || {}\n const lastMappingResult = domData.get(domNode, lastMappingResultDomDataKey)\n const isFirstExecution = !lastMappingResult\n\n // Build the new mapping result\n const newMappingResult = new Array()\n let lastMappingResultIndex = 0\n let newMappingResultIndex = 0\n\n const nodesToDelete: Node[] = []\n const itemsToProcess: MapDataType[] = []\n const itemsForBeforeRemoveCallbacks: MapDataType[] = []\n const itemsForMoveCallbacks: MapDataType[] = []\n const itemsForAfterAddCallbacks: MapDataType[] = []\n let mapData: MapDataType | null\n let countWaitingForRemove = 0\n\n type MapDataType = {\n arrayEntry: any\n indexObservable: Observable<number>\n mappedNodes?: Node[]\n dependentObservable?: Computed<void>\n initialized?: boolean\n }\n\n function itemAdded(value: any) {\n mapData = { arrayEntry: value, indexObservable: observable(newMappingResultIndex++) }\n newMappingResult.push(mapData)\n itemsToProcess.push(mapData)\n if (!isFirstExecution) {\n itemsForAfterAddCallbacks.push(mapData)\n }\n }\n\n function itemMovedOrRetained(oldPosition: number) {\n mapData = lastMappingResult[oldPosition]\n if (newMappingResultIndex !== oldPosition) {\n itemsForMoveCallbacks.push(mapData!)\n }\n // Since updating the index might change the nodes, do so before calling fixUpContinuousNodeArray\n mapData!.indexObservable(newMappingResultIndex++)\n fixUpContinuousNodeArray(mapData!.mappedNodes, domNode)\n newMappingResult.push(mapData)\n itemsToProcess.push(mapData!)\n }\n\n function callCallback(callback: MappingHookFunction<T> | undefined, items: any[]) {\n if (callback) {\n for (let i = 0, n = items.length; i < n; i++) {\n arrayForEach(items[i].mappedNodes, function (node) {\n callback(node, i, items[i].arrayEntry)\n })\n }\n }\n }\n\n if (isFirstExecution) {\n arrayForEach(array, itemAdded)\n } else {\n if (!editScript || (lastMappingResult && lastMappingResult['_countWaitingForRemove'])) {\n // Compare the provided array against the previous one\n const lastArray = arrayMap(lastMappingResult, function (x) {\n return x.arrayEntry\n })\n const compareOptions = { dontLimitMoves: options.dontLimitMoves, sparse: true }\n editScript = compareArrays(lastArray, array, compareOptions)\n }\n\n for (\n let i = 0, editScriptItem: number[], movedIndex: number, itemIndex: number;\n (editScriptItem = editScript[i]);\n i++\n ) {\n movedIndex = editScriptItem['moved']\n itemIndex = editScriptItem['index']\n switch (editScriptItem['status']) {\n case 'deleted':\n while (lastMappingResultIndex < itemIndex) {\n itemMovedOrRetained(lastMappingResultIndex++)\n }\n if (movedIndex === undefined) {\n mapData = lastMappingResult[lastMappingResultIndex]\n\n // Stop tracking changes to the mapping for these nodes\n if (mapData!.dependentObservable) {\n mapData!.dependentObservable.dispose()\n mapData!.dependentObservable = undefined\n }\n\n // Queue these nodes for later removal\n if (fixUpContinuousNodeArray(mapData!.mappedNodes, domNode).length) {\n if (options.beforeRemove) {\n newMappingResult.push(mapData)\n itemsToProcess.push(mapData!)\n countWaitingForRemove++\n if (mapData!.arrayEntry === deletedItemDummyValue) {\n mapData = null\n } else {\n itemsForBeforeRemoveCallbacks.push(mapData!)\n }\n }\n if (mapData?.mappedNodes) {\n nodesToDelete.push.apply(nodesToDelete, mapData.mappedNodes)\n }\n }\n }\n lastMappingResultIndex++\n break\n\n case 'added':\n while (newMappingResultIndex < itemIndex) {\n itemMovedOrRetained(lastMappingResultIndex++)\n }\n if (movedIndex !== undefined) {\n itemMovedOrRetained(movedIndex)\n } else {\n itemAdded(editScriptItem['value'])\n }\n break\n }\n }\n\n while (newMappingResultIndex < array.length) {\n itemMovedOrRetained(lastMappingResultIndex++)\n }\n\n // Record that the current view may still contain deleted items\n // because it means we won't be able to use a provided editScript.\n newMappingResult['_countWaitingForRemove'] = countWaitingForRemove\n }\n\n // Store a copy of the array items we just considered so we can difference it next time\n domData.set(domNode, lastMappingResultDomDataKey, newMappingResult)\n\n // Call beforeMove first before any changes have been made to the DOM\n callCallback(options.beforeMove, itemsForMoveCallbacks)\n\n // Next remove nodes for deleted items (or just clean if there's a beforeRemove callback)\n arrayForEach(nodesToDelete, options.beforeRemove ? cleanNode : removeNode)\n\n // Next add/reorder the remaining items (will include deleted items if there's a beforeRemove callback)\n for (let k = 0, nextNode = virtualElements.firstChild(domNode), lastNode, node; (mapData = itemsToProcess[k]); k++) {\n // Get nodes for newly added items\n if (!mapData.mappedNodes) {\n extend(\n mapData,\n mapNodeAndRefreshWhenChanged(\n domNode,\n mapping,\n mapData.arrayEntry,\n callbackAfterAddingNodes,\n mapData.indexObservable\n )\n )\n }\n\n // Put nodes in the right place if they aren't there already\n for (let j = 0; (node = mapData.mappedNodes![j]); nextNode = node.nextSibling, lastNode = node, j++) {\n if (node !== nextNode) {\n virtualElements.insertAfter(domNode, node, lastNode)\n }\n }\n\n // Run the callbacks for newly added nodes (for example, to apply bindings, etc.)\n if (!mapData.initialized && callbackAfterAddingNodes) {\n callbackAfterAddingNodes(mapData.arrayEntry, mapData.mappedNodes!, mapData.indexObservable)\n mapData.initialized = true\n }\n }\n\n // If there's a beforeRemove callback, call it after reordering.\n // Note that we assume that the beforeRemove callback will usually be used to remove the nodes using\n // some sort of animation, which is why we first reorder the nodes that will be removed. If the\n // callback instead removes the nodes right away, it would be more efficient to skip reordering them.\n // Perhaps we'll make that change in the future if this scenario becomes more common.\n callCallback(options.beforeRemove, itemsForBeforeRemoveCallbacks)\n\n // Replace the stored values of deleted items with a dummy value. This provides two benefits: it marks this item\n // as already \"removed\" so we won't call beforeRemove for it again, and it ensures that the item won't match up\n // with an actual item in the array and appear as \"retained\" or \"moved\".\n for (let x = 0; x < itemsForBeforeRemoveCallbacks.length; ++x) {\n itemsForBeforeRemoveCallbacks[x].arrayEntry = deletedItemDummyValue\n }\n\n // Finally call afterMove and afterAdd callbacks\n callCallback(options.afterMove, itemsForMoveCallbacks)\n callCallback(options.afterAdd, itemsForAfterAddCallbacks)\n}\n"], | ||
| "mappings": ";;AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,qBAAqB,kBAAkB;AAIhD,SAAS,gBAAgB;AA4BzB,SAAS,6BACP,eACA,SACA,YACA,0BACA,OACA;AAEA,QAAM,cAAsB,CAAC;AAC7B,QAAM,sBAAsC;AAAA,IAC1C,WAAY;AACV,YAAM,iBACJ,QAAQ,YAAY,OAAO,yBAAyB,aAAa,aAAa,CAAC,KAAK,CAAC;AAGvF,UAAI,YAAY,SAAS,GAAG;AAC1B,wBAAgB,aAAa,cAAc;AAC3C,YAAI,0BAA0B;AAC5B,8BAAoB,OAAO,0BAA0B,MAAM,CAAC,YAAY,gBAAgB,KAAK,CAAC;AAAA,QAChG;AAAA,MACF;AAIA,kBAAY,SAAS;AACrB,mBAAa,aAAa,cAAc;AAAA,IAC1C;AAAA,IACA;AAAA,IACA;AAAA,MACE,0BAA0B;AAAA,MAC1B,aAAa,WAAY;AACvB,eAAO,CAAC,+BAA+B,WAAW;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA,qBAAqB,oBAAoB,SAAS,IAAI,sBAAsB;AAAA,EAC9E;AACF;AAEA,MAAM,8BAA8B,QAAQ,QAAQ;AACpD,MAAM,wBAAwB,QAAQ,QAAQ;AAEvC,gBAAS,mCACd,SACA,OACA,SACA,SACA,0BACA,YACA;AAEA,UAAQ,SAAS,CAAC;AAClB,MAAI,OAAO,MAAM,WAAW,aAAa;AACvC,YAAQ,CAAC,KAAK;AAAA,EAChB;AAEA,YAAU,WAAW,CAAC;AACtB,QAAM,oBAAoB,QAAQ,IAAI,SAAS,2BAA2B;AAC1E,QAAM,mBAAmB,CAAC;AAG1B,QAAM,mBAAmB,IAAI,MAAM;AACnC,MAAI,yBAAyB;AAC7B,MAAI,wBAAwB;AAE5B,QAAM,gBAAwB,CAAC;AAC/B,QAAM,iBAAgC,CAAC;AACvC,QAAM,gCAA+C,CAAC;AACtD,QAAM,wBAAuC,CAAC;AAC9C,QAAM,4BAA2C,CAAC;AAClD,MAAI;AACJ,MAAI,wBAAwB;AAU5B,WAAS,UAAU,OAAY;AAC7B,cAAU,EAAE,YAAY,OAAO,iBAAiB,WAAW,uBAAuB,EAAE;AACpF,qBAAiB,KAAK,OAAO;AAC7B,mBAAe,KAAK,OAAO;AAC3B,QAAI,CAAC,kBAAkB;AACrB,gCAA0B,KAAK,OAAO;AAAA,IACxC;AAAA,EACF;AAEA,WAAS,oBAAoB,aAAqB;AAChD,cAAU,kBAAkB,WAAW;AACvC,QAAI,0BAA0B,aAAa;AACzC,4BAAsB,KAAK,OAAQ;AAAA,IACrC;AAEA,YAAS,gBAAgB,uBAAuB;AAChD,6BAAyB,QAAS,aAAa,OAAO;AACtD,qBAAiB,KAAK,OAAO;AAC7B,mBAAe,KAAK,OAAQ;AAAA,EAC9B;AAEA,WAAS,aAAa,UAA8C,OAAc;AAChF,QAAI,UAAU;AACZ,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAI,GAAG,KAAK;AAC5C,qBAAa,MAAM,CAAC,EAAE,aAAa,SAAU,MAAM;AACjD,mBAAS,MAAM,GAAG,MAAM,CAAC,EAAE,UAAU;AAAA,QACvC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,kBAAkB;AACpB,iBAAa,OAAO,SAAS;AAAA,EAC/B,OAAO;AACL,QAAI,CAAC,cAAe,qBAAqB,kBAAkB,wBAAwB,GAAI;AAErF,YAAM,YAAY,SAAS,mBAAmB,SAAU,GAAG;AACzD,eAAO,EAAE;AAAA,MACX,CAAC;AACD,YAAM,iBAAiB,EAAE,gBAAgB,QAAQ,gBAAgB,QAAQ,KAAK;AAC9E,mBAAa,cAAc,WAAW,OAAO,cAAc;AAAA,IAC7D;AAEA,aACM,IAAI,GAAG,gBAA0B,YAAoB,WACxD,iBAAiB,WAAW,CAAC,GAC9B,KACA;AACA,mBAAa,eAAe,OAAO;AACnC,kBAAY,eAAe,OAAO;AAClC,cAAQ,eAAe,QAAQ,GAAG;AAAA,QAChC,KAAK;AACH,iBAAO,yBAAyB,WAAW;AACzC,gCAAoB,wBAAwB;AAAA,UAC9C;AACA,cAAI,eAAe,QAAW;AAC5B,sBAAU,kBAAkB,sBAAsB;AAGlD,gBAAI,QAAS,qBAAqB;AAChC,sBAAS,oBAAoB,QAAQ;AACrC,sBAAS,sBAAsB;AAAA,YACjC;AAGA,gBAAI,yBAAyB,QAAS,aAAa,OAAO,EAAE,QAAQ;AAClE,kBAAI,QAAQ,cAAc;AACxB,iCAAiB,KAAK,OAAO;AAC7B,+BAAe,KAAK,OAAQ;AAC5B;AACA,oBAAI,QAAS,eAAe,uBAAuB;AACjD,4BAAU;AAAA,gBACZ,OAAO;AACL,gDAA8B,KAAK,OAAQ;AAAA,gBAC7C;AAAA,cACF;AACA,kBAAI,SAAS,aAAa;AACxB,8BAAc,KAAK,MAAM,eAAe,QAAQ,WAAW;AAAA,cAC7D;AAAA,YACF;AAAA,UACF;AACA;AACA;AAAA,QAEF,KAAK;AACH,iBAAO,wBAAwB,WAAW;AACxC,gCAAoB,wBAAwB;AAAA,UAC9C;AACA,cAAI,eAAe,QAAW;AAC5B,gCAAoB,UAAU;AAAA,UAChC,OAAO;AACL,sBAAU,eAAe,OAAO,CAAC;AAAA,UACnC;AACA;AAAA,MACJ;AAAA,IACF;AAEA,WAAO,wBAAwB,MAAM,QAAQ;AAC3C,0BAAoB,wBAAwB;AAAA,IAC9C;AAIA,qBAAiB,wBAAwB,IAAI;AAAA,EAC/C;AAGA,UAAQ,IAAI,SAAS,6BAA6B,gBAAgB;AAGlE,eAAa,QAAQ,YAAY,qBAAqB;AAGtD,eAAa,eAAe,QAAQ,eAAe,YAAY,UAAU;AAGzE,WAAS,IAAI,GAAG,WAAW,gBAAgB,WAAW,OAAO,GAAG,UAAU,MAAO,UAAU,eAAe,CAAC,GAAI,KAAK;AAElH,QAAI,CAAC,QAAQ,aAAa;AACxB;AAAA,QACE;AAAA,QACA;AAAA,UACE;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR;AAAA,UACA,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAGA,aAAS,IAAI,GAAI,OAAO,QAAQ,YAAa,CAAC,GAAI,WAAW,KAAK,aAAa,WAAW,MAAM,KAAK;AACnG,UAAI,SAAS,UAAU;AACrB,wBAAgB,YAAY,SAAS,MAAM,QAAQ;AAAA,MACrD;AAAA,IACF;AAGA,QAAI,CAAC,QAAQ,eAAe,0BAA0B;AACpD,+BAAyB,QAAQ,YAAY,QAAQ,aAAc,QAAQ,eAAe;AAC1F,cAAQ,cAAc;AAAA,IACxB;AAAA,EACF;AAOA,eAAa,QAAQ,cAAc,6BAA6B;AAKhE,WAAS,IAAI,GAAG,IAAI,8BAA8B,QAAQ,EAAE,GAAG;AAC7D,kCAA8B,CAAC,EAAE,aAAa;AAAA,EAChD;AAGA,eAAa,QAAQ,WAAW,qBAAqB;AACrD,eAAa,QAAQ,UAAU,yBAAyB;AAC1D;", | ||
| "names": [] | ||
| } |
+37
-30
@@ -1,17 +0,11 @@ | ||
| // @tko/bind 🥊 4.0.0-beta1.3 ESM | ||
| // @tko/bind 🥊 4.0.0 ESM | ||
| "use strict"; | ||
| import { extend, options, domData, isObjectLike } from "@tko/utils"; | ||
| import { | ||
| pureComputed | ||
| } from "@tko/computed"; | ||
| import { | ||
| unwrap, | ||
| isObservable | ||
| } from "@tko/observable"; | ||
| import { | ||
| contextAncestorBindingInfo | ||
| } from "./bindingEvent"; | ||
| import { pureComputed } from "@tko/computed"; | ||
| import { unwrap, isObservable } from "@tko/observable"; | ||
| import { contextAncestorBindingInfo } from "./bindingEvent"; | ||
| export const boundElementDomDataKey = domData.nextKey(); | ||
| export const contextSubscribeSymbol = Symbol("Knockout Context Subscription"); | ||
| const inheritParentIndicator = Symbol("Knockout Parent Indicator"); | ||
| export function bindingContext(dataItemOrAccessor, parentContext, dataItemAlias, extendCallback, settings) { | ||
| export const contextSubscribeSymbol = /* @__PURE__ */ Symbol("Knockout Context Subscription"); | ||
| const inheritParentIndicator = /* @__PURE__ */ Symbol("Knockout Parent Indicator"); | ||
| export const bindingContext = function bindingContextFactory(dataItemOrAccessor, parentContext, dataItemAlias, extendCallback, settings) { | ||
| const self = this; | ||
@@ -22,3 +16,2 @@ const shouldInheritData = dataItemOrAccessor === inheritParentIndicator; | ||
| self.ko = options.knockoutInstance; | ||
| let nodes; | ||
| let subscribable; | ||
@@ -37,3 +30,3 @@ function updateContext() { | ||
| } else { | ||
| self.$parents = []; | ||
| self.$parents = new Array(); | ||
| self.$root = dataItem; | ||
@@ -68,3 +61,3 @@ } | ||
| } | ||
| } | ||
| }; | ||
| Object.assign(bindingContext.prototype, { | ||
@@ -93,15 +86,29 @@ lookup(token, globals, node) { | ||
| }, | ||
| // Extend the binding context hierarchy with a new view model object. If the parent context is watching | ||
| // any observables, the new child context will automatically get a dependency on the parent context. | ||
| // But this does not mean that the $data value of the child context will also get updated. If the child | ||
| // view model also depends on the parent view model, you must provide a function that returns the correct | ||
| // view model on each update. | ||
| createChildContext(dataItemOrAccessor, dataItemAlias, extendCallback, settings) { | ||
| return new bindingContext(dataItemOrAccessor, this, dataItemAlias, function(self, parentContext) { | ||
| self.$parentContext = parentContext; | ||
| self.$parent = parentContext.$data; | ||
| self.$parents = (parentContext.$parents || []).slice(0); | ||
| self.$parents.unshift(self.$parent); | ||
| if (extendCallback) { | ||
| extendCallback(self); | ||
| } | ||
| }, settings); | ||
| return new bindingContext( | ||
| dataItemOrAccessor, | ||
| this, | ||
| dataItemAlias, | ||
| function(self, parentContext) { | ||
| self.$parentContext = parentContext; | ||
| self.$parent = parentContext?.$data; | ||
| self.$parents = (parentContext?.$parents ?? []).slice(0); | ||
| self.$parents.unshift(self.$parent); | ||
| if (extendCallback) { | ||
| extendCallback(self); | ||
| } | ||
| }, | ||
| settings | ||
| ); | ||
| }, | ||
| // Extend the binding context with new custom properties. This doesn't change the context hierarchy. | ||
| // Similarly to "child" contexts, provide a function here to make sure that the correct values are set | ||
| // when an observable view model is updated. | ||
| extend(properties) { | ||
| return new bindingContext(inheritParentIndicator, this, null, function(self, parentContext) { | ||
| return new bindingContext(inheritParentIndicator, this, void 0, function(self, parentContext) { | ||
| extend(self, typeof properties === "function" ? properties.call(self) : properties); | ||
@@ -111,3 +118,3 @@ }); | ||
| createStaticChildContext(dataItemOrAccessor, dataItemAlias) { | ||
| return this.createChildContext(dataItemOrAccessor, dataItemAlias, null, { "exportDependencies": true }); | ||
| return this.createChildContext(dataItemOrAccessor, dataItemAlias, null, { exportDependencies: true }); | ||
| } | ||
@@ -120,3 +127,3 @@ }); | ||
| export function contextFor(node) { | ||
| if (node && (node.nodeType === 1 || node.nodeType === 8)) { | ||
| if (node && (node.nodeType === Node.ELEMENT_NODE || node.nodeType === Node.COMMENT_NODE)) { | ||
| return storedBindingContextForNode(node); | ||
@@ -126,4 +133,4 @@ } | ||
| export function dataFor(node) { | ||
| var context = contextFor(node); | ||
| const context = contextFor(node); | ||
| return context ? context.$data : void 0; | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../src/bindingContext.ts"], | ||
| "sourcesContent": ["import { extend, options, domData, isObjectLike } from '@tko/utils'\n\nimport {\n pureComputed\n} from '@tko/computed'\n\nimport {\n unwrap, isObservable\n} from '@tko/observable'\n\nimport {\n contextAncestorBindingInfo\n} from './bindingEvent'\n\nexport const boundElementDomDataKey = domData.nextKey()\n\nexport const contextSubscribeSymbol = Symbol('Knockout Context Subscription')\n\n// Unique stub to indicate inheritance.\nconst inheritParentIndicator = Symbol('Knockout Parent Indicator')\n\n// The bindingContext constructor is only called directly to create the root context. For child\n// contexts, use bindingContext.createChildContext or bindingContext.extend.\nexport function bindingContext (dataItemOrAccessor, parentContext, dataItemAlias, extendCallback, settings) {\n const self = this\n const shouldInheritData = dataItemOrAccessor === inheritParentIndicator\n const realDataItemOrAccessor = shouldInheritData ? undefined : dataItemOrAccessor\n const isFunc = typeof realDataItemOrAccessor === 'function' && !isObservable(realDataItemOrAccessor)\n\n // Export 'ko' in the binding context so it will be available in bindings and templates\n // even if 'ko' isn't exported as a global, such as when using an AMD loader.\n // See https://github.com/SteveSanderson/knockout/issues/490\n self.ko = options.knockoutInstance\n\n let nodes\n let subscribable\n\n // The binding context object includes static properties for the current, parent, and root view models.\n // If a view model is actually stored in an observable, the corresponding binding context object, and\n // any child contexts, must be updated when the view model is changed.\n function updateContext () {\n // Most of the time, the context will directly get a view model object, but if a function is given,\n // we call the function to retrieve the view model. If the function accesses any observables or returns\n // an observable, the dependency is tracked, and those observables can later cause the binding\n // context to be updated.\n const dataItemOrObservable = isFunc ? realDataItemOrAccessor() : realDataItemOrAccessor\n let dataItem = unwrap(dataItemOrObservable)\n\n if (parentContext) {\n // When a \"parent\" context is given, register a dependency on the parent context. Thus whenever the\n // parent context is updated, this context will also be updated.\n if (parentContext[contextSubscribeSymbol]) {\n parentContext[contextSubscribeSymbol]()\n }\n\n // Copy $root and any custom properties from the parent context\n extend(self, parentContext)\n\n // Copy Symbol properties\n if (contextAncestorBindingInfo in parentContext) {\n self[contextAncestorBindingInfo] = parentContext[contextAncestorBindingInfo]\n }\n } else {\n self.$parents = []\n self.$root = dataItem\n }\n\n self[contextSubscribeSymbol] = subscribable\n\n if (shouldInheritData) {\n dataItem = self.$data\n } else {\n self.$rawData = dataItemOrObservable\n self.$data = dataItem\n }\n\n if (dataItemAlias) { self[dataItemAlias] = dataItem }\n\n // The extendCallback function is provided when creating a child context or extending a context.\n // It handles the specific actions needed to finish setting up the binding context. Actions in this\n // function could also add dependencies to this binding context.\n if (extendCallback) { extendCallback(self, parentContext, dataItem) }\n\n return self.$data\n }\n\n if (settings && settings.exportDependencies) {\n // The \"exportDependencies\" option means that the calling code will track any dependencies and re-create\n // the binding context when they change.\n updateContext()\n } else {\n subscribable = pureComputed(updateContext)\n subscribable.peek()\n\n // At this point, the binding context has been initialized, and the \"subscribable\" computed observable is\n // subscribed to any observables that were accessed in the process. If there is nothing to track, the\n // computed will be inactive, and we can safely throw it away. If it's active, the computed is stored in\n // the context object.\n if (subscribable.isActive()) {\n self[contextSubscribeSymbol] = subscribable\n\n // Always notify because even if the model ($data) hasn't changed, other context properties might have changed\n subscribable['equalityComparer'] = null\n } else {\n self[contextSubscribeSymbol] = undefined\n }\n }\n}\n\nObject.assign(bindingContext.prototype, {\n\n lookup (token, globals, node) {\n // short circuits\n switch (token) {\n case '$element': return node\n case '$context': return this\n case 'this': case '$data': return this.$data\n }\n const $data = this.$data\n // instanceof Object covers 1. {}, 2. [], 3. function() {}, 4. new *; it excludes undefined, null, primitives.\n if (isObjectLike($data) && token in $data) { return $data[token] }\n if (token in this) { return this[token] }\n if (token in globals) { return globals[token] }\n\n throw new Error(`The variable \"${token}\" was not found on $data, $context, or globals.`)\n },\n\n // Extend the binding context hierarchy with a new view model object. If the parent context is watching\n // any observables, the new child context will automatically get a dependency on the parent context.\n // But this does not mean that the $data value of the child context will also get updated. If the child\n // view model also depends on the parent view model, you must provide a function that returns the correct\n // view model on each update.\n createChildContext (dataItemOrAccessor, dataItemAlias, extendCallback, settings) {\n return new bindingContext(dataItemOrAccessor, this, dataItemAlias, function (self, parentContext) {\n // Extend the context hierarchy by setting the appropriate pointers\n self.$parentContext = parentContext\n self.$parent = parentContext.$data\n self.$parents = (parentContext.$parents || []).slice(0)\n self.$parents.unshift(self.$parent)\n if (extendCallback) { extendCallback(self) }\n }, settings)\n },\n\n // Extend the binding context with new custom properties. This doesn't change the context hierarchy.\n // Similarly to \"child\" contexts, provide a function here to make sure that the correct values are set\n // when an observable view model is updated.\n extend (properties) {\n // If the parent context references an observable view model, \"_subscribable\" will always be the\n // latest view model object. If not, \"_subscribable\" isn't set, and we can use the static \"$data\" value.\n return new bindingContext(inheritParentIndicator, this, null, function (self, parentContext) {\n extend(self, typeof properties === 'function' ? properties.call(self) : properties)\n })\n },\n\n createStaticChildContext (dataItemOrAccessor, dataItemAlias) {\n return this.createChildContext(dataItemOrAccessor, dataItemAlias, null, { 'exportDependencies': true })\n }\n})\n\nexport function storedBindingContextForNode (node) {\n const bindingInfo = domData.get(node, boundElementDomDataKey)\n return bindingInfo && bindingInfo.context\n}\n\n// Retrieving binding context from arbitrary nodes\nexport function contextFor (node) {\n // We can only do something meaningful for elements and comment nodes (in particular, not text nodes, as IE can't store domdata for them)\n if (node && (node.nodeType === 1 || node.nodeType === 8)) {\n return storedBindingContextForNode(node)\n }\n}\n\nexport function dataFor (node) {\n var context = contextFor(node)\n return context ? context.$data : undefined\n}\n"], | ||
| "mappings": "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", | ||
| "sourcesContent": ["import { extend, options, domData, isObjectLike } from '@tko/utils'\nimport type { KnockoutInstance } from '@tko/builder'\n\nimport { pureComputed } from '@tko/computed'\n\nimport { unwrap, isObservable } from '@tko/observable'\n\nimport type { Observable } from '@tko/observable'\n\nimport { contextAncestorBindingInfo } from './bindingEvent'\n\nimport { BindingContextExtendCallback } from './applyBindings'\n\nexport const boundElementDomDataKey = domData.nextKey()\n\nexport const contextSubscribeSymbol = Symbol('Knockout Context Subscription')\n\n// Unique stub to indicate inheritance.\nconst inheritParentIndicator = Symbol('Knockout Parent Indicator')\n\nexport interface BindingContextSetting {\n exportDependencies?: boolean\n}\n\nexport interface BindingContext<T = any> {\n ko: KnockoutInstance\n\n [symbol: symbol]: any\n $parent?: any\n $parents: any[]\n $root: any\n $data: T\n $rawData: T | Observable<T>\n $index?: Observable<number>\n $parentContext?: BindingContext<any>\n // $componentTemplateNodes: any; added in makeChildBindingContext to context\n // $componentTemplateSlotNodes; added in makeChildBindingContext to context\n\n $component?: any\n\n extend(properties: object): BindingContext<T>\n extend(properties: (self: BindingContext<T>) => object): BindingContext<T>\n\n lookup(token: string, globals: any, node: any)\n\n createChildContext(\n dataItemOrAccessor: any,\n dataItemAlias?: string,\n extendCallback?: Function,\n settings?: BindingContextSetting\n ): BindingContext\n createStaticChildContext(dataItemOrAccessor: any, dataItemAlias: any): BindingContext\n}\n\n// Interface for the factory method 'bindingContext', which creates and returns a typed instance of BindingContext<T>\nexport interface bindingContext {\n new <T = any>(\n dataItemOrAccessor: any,\n parentContext?: BindingContext,\n dataItemAlias?: string,\n extendCallback?: BindingContextExtendCallback,\n settings?: BindingContextSetting\n ): BindingContext<T>\n}\n\n// The bindingContext constructor is only called directly to create the root context. For child\n// contexts, use bindingContext.createChildContext or bindingContext.extend.\nexport const bindingContext = function bindingContextFactory<T>(\n dataItemOrAccessor: any,\n parentContext?: BindingContext,\n dataItemAlias?: string,\n extendCallback?: BindingContextExtendCallback<T>,\n settings?: BindingContextSetting\n) {\n const self = this\n const shouldInheritData = dataItemOrAccessor === inheritParentIndicator\n const realDataItemOrAccessor = shouldInheritData ? undefined : dataItemOrAccessor\n const isFunc = typeof realDataItemOrAccessor === 'function' && !isObservable(realDataItemOrAccessor)\n\n // Export 'ko' in the binding context so it will be available in bindings and templates\n // even if 'ko' isn't exported as a global, such as when using an AMD loader.\n // See https://github.com/SteveSanderson/knockout/issues/490\n self.ko = options.knockoutInstance\n\n let subscribable: any\n\n // The binding context object includes static properties for the current, parent, and root view models.\n // If a view model is actually stored in an observable, the corresponding binding context object, and\n // any child contexts, must be updated when the view model is changed.\n function updateContext() {\n // Most of the time, the context will directly get a view model object, but if a function is given,\n // we call the function to retrieve the view model. If the function accesses any observables or returns\n // an observable, the dependency is tracked, and those observables can later cause the binding\n // context to be updated.\n const dataItemOrObservable = isFunc ? realDataItemOrAccessor() : realDataItemOrAccessor\n let dataItem = unwrap(dataItemOrObservable)\n\n if (parentContext) {\n // When a \"parent\" context is given, register a dependency on the parent context. Thus whenever the\n // parent context is updated, this context will also be updated.\n if (parentContext[contextSubscribeSymbol]) {\n parentContext[contextSubscribeSymbol]()\n }\n\n // Copy $root and any custom properties from the parent context\n extend(self, parentContext)\n\n // Copy Symbol properties\n if (contextAncestorBindingInfo in parentContext) {\n self[contextAncestorBindingInfo] = parentContext[contextAncestorBindingInfo]\n }\n } else {\n self.$parents = new Array()\n self.$root = dataItem\n }\n\n self[contextSubscribeSymbol] = subscribable\n\n if (shouldInheritData) {\n dataItem = self.$data\n } else {\n self.$rawData = dataItemOrObservable\n self.$data = dataItem\n }\n\n if (dataItemAlias) {\n self[dataItemAlias] = dataItem\n }\n\n // The extendCallback function is provided when creating a child context or extending a context.\n // It handles the specific actions needed to finish setting up the binding context. Actions in this\n // function could also add dependencies to this binding context.\n if (extendCallback) {\n extendCallback(self, parentContext, dataItem)\n }\n\n return self.$data\n }\n\n if (settings && settings.exportDependencies) {\n // The \"exportDependencies\" option means that the calling code will track any dependencies and re-create\n // the binding context when they change.\n updateContext()\n } else {\n subscribable = pureComputed(updateContext)\n subscribable.peek()\n\n // At this point, the binding context has been initialized, and the \"subscribable\" computed observable is\n // subscribed to any observables that were accessed in the process. If there is nothing to track, the\n // computed will be inactive, and we can safely throw it away. If it's active, the computed is stored in\n // the context object.\n if (subscribable.isActive()) {\n self[contextSubscribeSymbol] = subscribable\n\n // Always notify because even if the model ($data) hasn't changed, other context properties might have changed\n subscribable['equalityComparer'] = null\n } else {\n self[contextSubscribeSymbol] = undefined\n }\n }\n} as unknown as bindingContext\n\nObject.assign(bindingContext.prototype, {\n lookup(token: string, globals: any, node: any) {\n // short circuits\n switch (token) {\n case '$element':\n return node\n case '$context':\n return this\n case 'this':\n case '$data':\n return this.$data\n }\n const $data = this.$data\n // instanceof Object covers 1. {}, 2. [], 3. function() {}, 4. new *; it excludes undefined, null, primitives.\n if (isObjectLike($data) && token in $data) {\n return $data[token]\n }\n if (token in this) {\n return this[token]\n }\n if (token in globals) {\n return globals[token]\n }\n\n throw new Error(`The variable \"${token}\" was not found on $data, $context, or globals.`)\n },\n\n // Extend the binding context hierarchy with a new view model object. If the parent context is watching\n // any observables, the new child context will automatically get a dependency on the parent context.\n // But this does not mean that the $data value of the child context will also get updated. If the child\n // view model also depends on the parent view model, you must provide a function that returns the correct\n // view model on each update.\n createChildContext(\n dataItemOrAccessor: any,\n dataItemAlias?: string,\n extendCallback?: BindingContextExtendCallback,\n settings?: BindingContextSetting\n ): BindingContext {\n return new bindingContext(\n dataItemOrAccessor,\n this,\n dataItemAlias,\n function (self, parentContext) {\n // Extend the context hierarchy by setting the appropriate pointers\n self.$parentContext = parentContext\n self.$parent = parentContext?.$data\n self.$parents = (parentContext?.$parents ?? []).slice(0)\n self.$parents.unshift(self.$parent)\n if (extendCallback) {\n extendCallback(self)\n }\n },\n settings\n )\n },\n\n // Extend the binding context with new custom properties. This doesn't change the context hierarchy.\n // Similarly to \"child\" contexts, provide a function here to make sure that the correct values are set\n // when an observable view model is updated.\n extend(properties) {\n // If the parent context references an observable view model, \"_subscribable\" will always be the\n // latest view model object. If not, \"_subscribable\" isn't set, and we can use the static \"$data\" value.\n return new bindingContext(inheritParentIndicator, this, undefined, function (self, parentContext) {\n extend(self, typeof properties === 'function' ? properties.call(self) : properties)\n })\n },\n\n createStaticChildContext(dataItemOrAccessor: any, dataItemAlias: any): BindingContext {\n return this.createChildContext(dataItemOrAccessor, dataItemAlias, null, { exportDependencies: true })\n }\n})\n\nexport function storedBindingContextForNode(node: Node) {\n const bindingInfo = domData.get(node, boundElementDomDataKey)\n return bindingInfo && bindingInfo.context\n}\n\n// Retrieving binding context from arbitrary nodes\nexport function contextFor(node: Node) {\n // We can only do something meaningful for elements and comment nodes (in particular, not text nodes, as IE can't store domdata for them)\n if (node && (node.nodeType === Node.ELEMENT_NODE || node.nodeType === Node.COMMENT_NODE)) {\n return storedBindingContextForNode(node)\n }\n}\n\nexport function dataFor<T = any>(node: Node): T | undefined {\n const context = contextFor(node)\n return context ? context.$data : undefined\n}\n"], | ||
| "mappings": ";;AAAA,SAAS,QAAQ,SAAS,SAAS,oBAAoB;AAGvD,SAAS,oBAAoB;AAE7B,SAAS,QAAQ,oBAAoB;AAIrC,SAAS,kCAAkC;AAIpC,aAAM,yBAAyB,QAAQ,QAAQ;AAE/C,aAAM,yBAAyB,uBAAO,+BAA+B;AAG5E,MAAM,yBAAyB,uBAAO,2BAA2B;AAiD1D,aAAM,iBAAiB,SAAS,sBACrC,oBACA,eACA,eACA,gBACA,UACA;AACA,QAAM,OAAO;AACb,QAAM,oBAAoB,uBAAuB;AACjD,QAAM,yBAAyB,oBAAoB,SAAY;AAC/D,QAAM,SAAS,OAAO,2BAA2B,cAAc,CAAC,aAAa,sBAAsB;AAKnG,OAAK,KAAK,QAAQ;AAElB,MAAI;AAKJ,WAAS,gBAAgB;AAKvB,UAAM,uBAAuB,SAAS,uBAAuB,IAAI;AACjE,QAAI,WAAW,OAAO,oBAAoB;AAE1C,QAAI,eAAe;AAGjB,UAAI,cAAc,sBAAsB,GAAG;AACzC,sBAAc,sBAAsB,EAAE;AAAA,MACxC;AAGA,aAAO,MAAM,aAAa;AAG1B,UAAI,8BAA8B,eAAe;AAC/C,aAAK,0BAA0B,IAAI,cAAc,0BAA0B;AAAA,MAC7E;AAAA,IACF,OAAO;AACL,WAAK,WAAW,IAAI,MAAM;AAC1B,WAAK,QAAQ;AAAA,IACf;AAEA,SAAK,sBAAsB,IAAI;AAE/B,QAAI,mBAAmB;AACrB,iBAAW,KAAK;AAAA,IAClB,OAAO;AACL,WAAK,WAAW;AAChB,WAAK,QAAQ;AAAA,IACf;AAEA,QAAI,eAAe;AACjB,WAAK,aAAa,IAAI;AAAA,IACxB;AAKA,QAAI,gBAAgB;AAClB,qBAAe,MAAM,eAAe,QAAQ;AAAA,IAC9C;AAEA,WAAO,KAAK;AAAA,EACd;AAEA,MAAI,YAAY,SAAS,oBAAoB;AAG3C,kBAAc;AAAA,EAChB,OAAO;AACL,mBAAe,aAAa,aAAa;AACzC,iBAAa,KAAK;AAMlB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,sBAAsB,IAAI;AAG/B,mBAAa,kBAAkB,IAAI;AAAA,IACrC,OAAO;AACL,WAAK,sBAAsB,IAAI;AAAA,IACjC;AAAA,EACF;AACF;AAEA,OAAO,OAAO,eAAe,WAAW;AAAA,EACtC,OAAO,OAAe,SAAc,MAAW;AAE7C,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AACH,eAAO,KAAK;AAAA,IAChB;AACA,UAAM,QAAQ,KAAK;AAEnB,QAAI,aAAa,KAAK,KAAK,SAAS,OAAO;AACzC,aAAO,MAAM,KAAK;AAAA,IACpB;AACA,QAAI,SAAS,MAAM;AACjB,aAAO,KAAK,KAAK;AAAA,IACnB;AACA,QAAI,SAAS,SAAS;AACpB,aAAO,QAAQ,KAAK;AAAA,IACtB;AAEA,UAAM,IAAI,MAAM,iBAAiB,KAAK,iDAAiD;AAAA,EACzF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBACE,oBACA,eACA,gBACA,UACgB;AAChB,WAAO,IAAI;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAU,MAAM,eAAe;AAE7B,aAAK,iBAAiB;AACtB,aAAK,UAAU,eAAe;AAC9B,aAAK,YAAY,eAAe,YAAY,CAAC,GAAG,MAAM,CAAC;AACvD,aAAK,SAAS,QAAQ,KAAK,OAAO;AAClC,YAAI,gBAAgB;AAClB,yBAAe,IAAI;AAAA,QACrB;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,YAAY;AAGjB,WAAO,IAAI,eAAe,wBAAwB,MAAM,QAAW,SAAU,MAAM,eAAe;AAChG,aAAO,MAAM,OAAO,eAAe,aAAa,WAAW,KAAK,IAAI,IAAI,UAAU;AAAA,IACpF,CAAC;AAAA,EACH;AAAA,EAEA,yBAAyB,oBAAyB,eAAoC;AACpF,WAAO,KAAK,mBAAmB,oBAAoB,eAAe,MAAM,EAAE,oBAAoB,KAAK,CAAC;AAAA,EACtG;AACF,CAAC;AAEM,gBAAS,4BAA4B,MAAY;AACtD,QAAM,cAAc,QAAQ,IAAI,MAAM,sBAAsB;AAC5D,SAAO,eAAe,YAAY;AACpC;AAGO,gBAAS,WAAW,MAAY;AAErC,MAAI,SAAS,KAAK,aAAa,KAAK,gBAAgB,KAAK,aAAa,KAAK,eAAe;AACxF,WAAO,4BAA4B,IAAI;AAAA,EACzC;AACF;AAEO,gBAAS,QAAiB,MAA2B;AAC1D,QAAM,UAAU,WAAW,IAAI;AAC/B,SAAO,UAAU,QAAQ,QAAQ;AACnC;", | ||
| "names": [] | ||
| } |
@@ -1,10 +0,12 @@ | ||
| // @tko/bind 🥊 4.0.0-beta1.3 ESM | ||
| // @tko/bind 🥊 4.0.0 ESM | ||
| "use strict"; | ||
| import { domData } from "@tko/utils"; | ||
| import { subscribable } from "@tko/observable"; | ||
| export const contextAncestorBindingInfo = Symbol("_ancestorBindingInfo"); | ||
| export const contextAncestorBindingInfo = /* @__PURE__ */ Symbol("_ancestorBindingInfo"); | ||
| const boundElementDomDataKey = domData.nextKey(); | ||
| export const bindingEvent = { | ||
| //TODO better: String-Enum "BindingEventEnum" | ||
| childrenComplete: "childrenComplete", | ||
| descendantsComplete: "descendantsComplete", | ||
| subscribe(node, event, callback, context) { | ||
| subscribe(node, event, callback, callbackContext) { | ||
| const bindingInfo = domData.getOrSet(node, boundElementDomDataKey, {}); | ||
@@ -14,3 +16,3 @@ if (!bindingInfo.eventSubscribable) { | ||
| } | ||
| return bindingInfo.eventSubscribable.subscribe(callback, context, event); | ||
| return bindingInfo.eventSubscribable.subscribe(callback, callbackContext, event); | ||
| }, | ||
@@ -21,2 +23,3 @@ notify(node, event) { | ||
| if (bindingInfo.eventSubscribable) { | ||
| ; | ||
| bindingInfo.eventSubscribable.notifySubscribers(node, event); | ||
@@ -23,0 +26,0 @@ } |
| { | ||
| "version": 3, | ||
| "sources": ["../src/bindingEvent.ts"], | ||
| "sourcesContent": ["\nimport { domData } from '@tko/utils'\nimport { subscribable } from '@tko/observable'\n\nexport const contextAncestorBindingInfo = Symbol('_ancestorBindingInfo')\nconst boundElementDomDataKey = domData.nextKey()\n\nexport const bindingEvent = {\n childrenComplete: 'childrenComplete',\n descendantsComplete: 'descendantsComplete',\n\n subscribe (node, event, callback, context) {\n const bindingInfo = domData.getOrSet(node, boundElementDomDataKey, {})\n if (!bindingInfo.eventSubscribable) {\n bindingInfo.eventSubscribable = new subscribable()\n }\n return bindingInfo.eventSubscribable.subscribe(callback, context, event)\n },\n\n notify (node, event) {\n const bindingInfo = domData.get(node, boundElementDomDataKey)\n if (bindingInfo) {\n if (bindingInfo.eventSubscribable) {\n bindingInfo.eventSubscribable.notifySubscribers(node, event)\n }\n }\n }\n}\n\n"], | ||
| "mappings": ";AACA;AACA;AAEO,aAAM,6BAA6B,OAAO,sBAAsB;AACvE,MAAM,yBAAyB,QAAQ,QAAQ;AAExC,aAAM,eAAe;AAAA,EAC1B,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EAErB,UAAW,MAAM,OAAO,UAAU,SAAS;AACzC,UAAM,cAAc,QAAQ,SAAS,MAAM,wBAAwB,CAAC,CAAC;AACrE,QAAI,CAAC,YAAY,mBAAmB;AAClC,kBAAY,oBAAoB,IAAI,aAAa;AAAA,IACnD;AACA,WAAO,YAAY,kBAAkB,UAAU,UAAU,SAAS,KAAK;AAAA,EACzE;AAAA,EAEA,OAAQ,MAAM,OAAO;AACnB,UAAM,cAAc,QAAQ,IAAI,MAAM,sBAAsB;AAC5D,QAAI,aAAa;AACf,UAAI,YAAY,mBAAmB;AACjC,oBAAY,kBAAkB,kBAAkB,MAAM,KAAK;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AACF;", | ||
| "sourcesContent": ["import { domData } from '@tko/utils'\nimport { subscribable } from '@tko/observable'\nimport type { Subscribable, SubscriptionCallback } from '@tko/observable'\nimport type Subscription from '@tko/observable/src/Subscription'\n\nexport const contextAncestorBindingInfo = Symbol('_ancestorBindingInfo')\nconst boundElementDomDataKey = domData.nextKey()\n\nexport const bindingEvent = {\n //TODO better: String-Enum \"BindingEventEnum\"\n childrenComplete: 'childrenComplete',\n descendantsComplete: 'descendantsComplete',\n\n subscribe(\n node: Node,\n event: string | 'childrenComplete' | 'descendantsComplete',\n callback: (node: Node) => void,\n callbackContext?: any\n ): Subscription {\n const bindingInfo = domData.getOrSet(node, boundElementDomDataKey, {})\n if (!bindingInfo.eventSubscribable) {\n bindingInfo.eventSubscribable = new subscribable()\n }\n return (bindingInfo.eventSubscribable as Subscribable).subscribe(callback, callbackContext, event)\n },\n\n notify(node: Node, event: string) {\n const bindingInfo = domData.get(node, boundElementDomDataKey)\n if (bindingInfo) {\n if (bindingInfo.eventSubscribable) {\n ;(bindingInfo.eventSubscribable as Subscribable).notifySubscribers(node, event)\n }\n }\n }\n}\n"], | ||
| "mappings": ";;AAAA,SAAS,eAAe;AACxB,SAAS,oBAAoB;AAItB,aAAM,6BAA6B,uBAAO,sBAAsB;AACvE,MAAM,yBAAyB,QAAQ,QAAQ;AAExC,aAAM,eAAe;AAAA;AAAA,EAE1B,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EAErB,UACE,MACA,OACA,UACA,iBACc;AACd,UAAM,cAAc,QAAQ,SAAS,MAAM,wBAAwB,CAAC,CAAC;AACrE,QAAI,CAAC,YAAY,mBAAmB;AAClC,kBAAY,oBAAoB,IAAI,aAAa;AAAA,IACnD;AACA,WAAQ,YAAY,kBAAmC,UAAU,UAAU,iBAAiB,KAAK;AAAA,EACnG;AAAA,EAEA,OAAO,MAAY,OAAe;AAChC,UAAM,cAAc,QAAQ,IAAI,MAAM,sBAAsB;AAC5D,QAAI,aAAa;AACf,UAAI,YAAY,mBAAmB;AACjC;AAAC,QAAC,YAAY,kBAAmC,kBAAkB,MAAM,KAAK;AAAA,MAChF;AAAA,IACF;AAAA,EACF;AACF;", | ||
| "names": [] | ||
| } |
@@ -1,2 +0,3 @@ | ||
| // @tko/bind 🥊 4.0.0-beta1.3 ESM | ||
| // @tko/bind 🥊 4.0.0 ESM | ||
| "use strict"; | ||
| import { options } from "@tko/utils"; | ||
@@ -9,9 +10,7 @@ import { isWriteableObservable } from "@tko/observable"; | ||
| const { $element, valueAccessor, allBindings, $context } = params; | ||
| Object.assign(this, { | ||
| valueAccessor, | ||
| allBindings, | ||
| $element, | ||
| $context, | ||
| $data: $context.$data | ||
| }); | ||
| this.$element = $element; | ||
| this.valueAccessor = valueAccessor; | ||
| this.allBindings = allBindings; | ||
| this.$context = $context; | ||
| this.$data = $context.$data; | ||
| this.anchorTo($element); | ||
@@ -39,2 +38,8 @@ } | ||
| } | ||
| /* Overload this for asynchronous bindings or bindings that recursively | ||
| apply bindings (e.g. components, foreach, template). | ||
| A binding should be complete when it has run through once, notably | ||
| in server-side bindings for pre-rendering. | ||
| */ | ||
| get bindingCompleted() { | ||
@@ -46,4 +51,7 @@ return true; | ||
| } | ||
| static registerBindingHandler(handler, name, provider = options.bindingProviderInstance) { | ||
| provider.bindingHandlers.set(name, handler); | ||
| } | ||
| } | ||
| const ResolveSymbol = Symbol("Async Binding Resolved"); | ||
| const ResolveSymbol = /* @__PURE__ */ Symbol("Async Binding Resolved"); | ||
| export class AsyncBindingHandler extends BindingHandler { | ||
@@ -50,0 +58,0 @@ constructor(params) { |
| { | ||
| "version": 3, | ||
| "sources": ["../src/BindingHandler.ts"], | ||
| "sourcesContent": ["\nimport { options } from '@tko/utils'\nimport { isWriteableObservable } from '@tko/observable'\nimport { LifeCycle } from '@tko/lifecycle'\n\nexport class BindingHandler extends LifeCycle {\n constructor (params) {\n super()\n const {$element, valueAccessor, allBindings, $context} = params\n Object.assign(this, {\n valueAccessor,\n allBindings,\n $element,\n $context,\n $data: $context.$data\n })\n\n this.anchorTo($element)\n }\n\n get value () { return this.valueAccessor() }\n set value (v) {\n const va = this.valueAccessor()\n if (isWriteableObservable(va)) {\n va(v)\n } else {\n this.valueAccessor(v)\n }\n }\n\n get controlsDescendants () { return false }\n\n static get allowVirtualElements () { return false }\n static get isBindingHandlerClass () { return true }\n\n /* Overload this for asynchronous bindings or bindings that recursively\n apply bindings (e.g. components, foreach, template).\n\n A binding should be complete when it has run through once, notably\n in server-side bindings for pre-rendering.\n */\n get bindingCompleted () { return true }\n\n static registerAs (name, provider = options.bindingProviderInstance) {\n provider.bindingHandlers.set(name, this)\n }\n}\n\n/**\n * An AsyncBindingHandler shall call `completeBinding` when the binding\n * is to be considered complete.\n */\nconst ResolveSymbol = Symbol('Async Binding Resolved')\n\nexport class AsyncBindingHandler extends BindingHandler {\n constructor (params) {\n super(params)\n this.bindingCompletion = new Promise((resolve) => {\n this[ResolveSymbol] = resolve\n })\n this.completeBinding = bindingResult => this[ResolveSymbol](bindingResult)\n }\n\n get bindingCompleted () { return this.bindingCompletion }\n}\n"], | ||
| "mappings": ";AACA;AACA;AACA;AAEO,aAAM,uBAAuB,UAAU;AAAA,EAC5C,YAAa,QAAQ;AACnB,UAAM;AACN,UAAM,EAAC,UAAU,eAAe,aAAa,aAAY;AACzD,WAAO,OAAO,MAAM;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,SAAS;AAAA,IAClB,CAAC;AAED,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,MAEI,QAAS;AAAE,WAAO,KAAK,cAAc;AAAA,EAAE;AAAA,MACvC,MAAO,GAAG;AACZ,UAAM,KAAK,KAAK,cAAc;AAC9B,QAAI,sBAAsB,EAAE,GAAG;AAC7B,SAAG,CAAC;AAAA,IACN,OAAO;AACL,WAAK,cAAc,CAAC;AAAA,IACtB;AAAA,EACF;AAAA,MAEI,sBAAuB;AAAE,WAAO;AAAA,EAAM;AAAA,aAE/B,uBAAwB;AAAE,WAAO;AAAA,EAAM;AAAA,aACvC,wBAAyB;AAAE,WAAO;AAAA,EAAK;AAAA,MAQ9C,mBAAoB;AAAE,WAAO;AAAA,EAAK;AAAA,SAE/B,WAAY,MAAM,WAAW,QAAQ,yBAAyB;AACnE,aAAS,gBAAgB,IAAI,MAAM,IAAI;AAAA,EACzC;AACF;AAMA,MAAM,gBAAgB,OAAO,wBAAwB;AAE9C,aAAM,4BAA4B,eAAe;AAAA,EACtD,YAAa,QAAQ;AACnB,UAAM,MAAM;AACZ,SAAK,oBAAoB,IAAI,QAAQ,CAAC,YAAY;AAChD,WAAK,iBAAiB;AAAA,IACxB,CAAC;AACD,SAAK,kBAAkB,mBAAiB,KAAK,eAAe,aAAa;AAAA,EAC3E;AAAA,MAEI,mBAAoB;AAAE,WAAO,KAAK;AAAA,EAAkB;AAC1D;", | ||
| "sourcesContent": ["import { options } from '@tko/utils'\nimport { isWriteableObservable } from '@tko/observable'\nimport { LifeCycle } from '@tko/lifecycle'\nimport type { BindingContext } from './bindingContext'\n\nexport type BindingHandlerControlsDescendant = { controlsDescendantBindings: boolean }\nexport type BindingHandlerAddBinding = (name: string, value: any) => void\n\n// usage in applyBindings, BindingHandler, event, checked, options\nexport interface AllBindings {\n (): any\n\n get(name: string): any\n get<T = any>(name: string): T\n\n has(name: string): boolean\n}\n\nexport class BindingHandler<T = any> extends LifeCycle {\n after?: string[]\n init?: (\n element: any,\n valueAccessor: () => T,\n allBindings: AllBindings,\n viewModel: any,\n bindingContext: BindingContext<any>\n ) => void | BindingHandlerControlsDescendant\n update?: (\n element: any,\n valueAccessor: () => T,\n allBindings: AllBindings,\n viewModel: any,\n bindingContext: BindingContext<any>\n ) => void\n options?: any\n preprocess?: (\n value: string | undefined,\n name: string,\n addBinding: BindingHandlerAddBinding\n ) => string | undefined | void\n\n $context: BindingContext // most likly BindingContext but params must be typed first\n $element: HTMLElement\n $data: any\n bindingCompletion: any\n valueAccessor: Function\n completeBinding: any\n allBindings: AllBindings\n\n constructor(params) {\n super()\n const { $element, valueAccessor, allBindings, $context } = params\n\n this.$element = $element\n this.valueAccessor = valueAccessor\n this.allBindings = allBindings\n this.$context = $context\n this.$data = $context.$data\n\n this.anchorTo($element)\n }\n\n get value() {\n return this.valueAccessor()\n }\n set value(v) {\n const va = this.valueAccessor()\n if (isWriteableObservable(va)) {\n va(v)\n } else {\n this.valueAccessor(v)\n }\n }\n\n get controlsDescendants() {\n return false\n }\n\n static get allowVirtualElements() {\n return false\n }\n static get isBindingHandlerClass() {\n return true\n }\n\n /* Overload this for asynchronous bindings or bindings that recursively\n apply bindings (e.g. components, foreach, template).\n\n A binding should be complete when it has run through once, notably\n in server-side bindings for pre-rendering.\n */\n get bindingCompleted(): Promise<boolean> | boolean {\n return true\n }\n\n static registerAs(name: string, provider = options.bindingProviderInstance) {\n provider.bindingHandlers.set(name, this) //todo dangerous javascript: this in static function = this is calling object\n }\n\n static registerBindingHandler(handler: BindingHandler, name: string, provider = options.bindingProviderInstance) {\n provider.bindingHandlers.set(name, handler)\n }\n}\n\n/**\n * An AsyncBindingHandler shall call `completeBinding` when the binding\n * is to be considered complete.\n */\nconst ResolveSymbol = Symbol('Async Binding Resolved')\n\nexport class AsyncBindingHandler extends BindingHandler {\n constructor(params) {\n super(params)\n this.bindingCompletion = new Promise(resolve => {\n this[ResolveSymbol] = resolve\n })\n this.completeBinding = bindingResult => this[ResolveSymbol](bindingResult)\n }\n\n override get bindingCompleted(): Promise<boolean> {\n return this.bindingCompletion\n }\n}\n"], | ||
| "mappings": ";;AAAA,SAAS,eAAe;AACxB,SAAS,6BAA6B;AACtC,SAAS,iBAAiB;AAgBnB,aAAM,uBAAgC,UAAU;AAAA,EA+BrD,YAAY,QAAQ;AAClB,UAAM;AACN,UAAM,EAAE,UAAU,eAAe,aAAa,SAAS,IAAI;AAE3D,SAAK,WAAW;AAChB,SAAK,gBAAgB;AACrB,SAAK,cAAc;AACnB,SAAK,WAAW;AAChB,SAAK,QAAQ,SAAS;AAEtB,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,KAAK,cAAc;AAAA,EAC5B;AAAA,EACA,IAAI,MAAM,GAAG;AACX,UAAM,KAAK,KAAK,cAAc;AAC9B,QAAI,sBAAsB,EAAE,GAAG;AAC7B,SAAG,CAAC;AAAA,IACN,OAAO;AACL,WAAK,cAAc,CAAC;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,IAAI,sBAAsB;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,uBAAuB;AAChC,WAAO;AAAA,EACT;AAAA,EACA,WAAW,wBAAwB;AACjC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,mBAA+C;AACjD,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,WAAW,MAAc,WAAW,QAAQ,yBAAyB;AAC1E,aAAS,gBAAgB,IAAI,MAAM,IAAI;AAAA,EACzC;AAAA,EAEA,OAAO,uBAAuB,SAAyB,MAAc,WAAW,QAAQ,yBAAyB;AAC/G,aAAS,gBAAgB,IAAI,MAAM,OAAO;AAAA,EAC5C;AACF;AAMA,MAAM,gBAAgB,uBAAO,wBAAwB;AAE9C,aAAM,4BAA4B,eAAe;AAAA,EACtD,YAAY,QAAQ;AAClB,UAAM,MAAM;AACZ,SAAK,oBAAoB,IAAI,QAAQ,aAAW;AAC9C,WAAK,aAAa,IAAI;AAAA,IACxB,CAAC;AACD,SAAK,kBAAkB,mBAAiB,KAAK,aAAa,EAAE,aAAa;AAAA,EAC3E;AAAA,EAEA,IAAa,mBAAqC;AAChD,WAAO,KAAK;AAAA,EACd;AACF;", | ||
| "names": [] | ||
| } |
+10
-33
@@ -1,30 +0,9 @@ | ||
| // @tko/bind 🥊 4.0.0-beta1.3 ESM | ||
| var __async = (__this, __arguments, generator) => { | ||
| return new Promise((resolve, reject) => { | ||
| var fulfilled = (value) => { | ||
| try { | ||
| step(generator.next(value)); | ||
| } catch (e) { | ||
| reject(e); | ||
| } | ||
| }; | ||
| var rejected = (value) => { | ||
| try { | ||
| step(generator.throw(value)); | ||
| } catch (e) { | ||
| reject(e); | ||
| } | ||
| }; | ||
| var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); | ||
| step((generator = generator.apply(__this, __arguments)).next()); | ||
| }); | ||
| }; | ||
| // @tko/bind 🥊 4.0.0 ESM | ||
| "use strict"; | ||
| export class BindingResult { | ||
| constructor({ asyncBindingsApplied, rootNode, bindingContext }) { | ||
| Object.assign(this, { | ||
| rootNode, | ||
| bindingContext, | ||
| isSync: asyncBindingsApplied.size === 0, | ||
| isComplete: this.isSync | ||
| }); | ||
| this.rootNode = rootNode; | ||
| this.bindingContext = bindingContext; | ||
| this.isSync = asyncBindingsApplied.size === 0; | ||
| this.isComplete = this.isSync; | ||
| if (!this.isSync) { | ||
@@ -34,9 +13,7 @@ this.completionPromise = this.completeWhenBindingsFinish(asyncBindingsApplied); | ||
| } | ||
| completeWhenBindingsFinish(asyncBindingsApplied) { | ||
| return __async(this, null, function* () { | ||
| yield Promise.all(asyncBindingsApplied); | ||
| this.isComplete = true; | ||
| return this; | ||
| }); | ||
| async completeWhenBindingsFinish(asyncBindingsApplied) { | ||
| await Promise.all(asyncBindingsApplied); | ||
| this.isComplete = true; | ||
| return this; | ||
| } | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../src/BindingResult.ts"], | ||
| "sourcesContent": ["\n\nexport class BindingResult {\n constructor ({asyncBindingsApplied, rootNode, bindingContext}) {\n Object.assign(this, {\n rootNode,\n bindingContext,\n isSync: asyncBindingsApplied.size === 0,\n isComplete: this.isSync\n })\n\n if (!this.isSync) {\n this.completionPromise = this.completeWhenBindingsFinish(asyncBindingsApplied)\n }\n }\n\n async completeWhenBindingsFinish (asyncBindingsApplied) {\n await Promise.all(asyncBindingsApplied)\n this.isComplete = true\n return this\n }\n}\n"], | ||
| "mappings": ";;;;;;;;;;;;;;;;;;;;;AAEO,aAAM,cAAc;AAAA,EACzB,YAAa,EAAC,sBAAsB,UAAU,kBAAiB;AAC7D,WAAO,OAAO,MAAM;AAAA,MAClB;AAAA,MACA;AAAA,MACA,QAAQ,qBAAqB,SAAS;AAAA,MACtC,YAAY,KAAK;AAAA,IACnB,CAAC;AAED,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,oBAAoB,KAAK,2BAA2B,oBAAoB;AAAA,IAC/E;AAAA,EACF;AAAA,EAEM,2BAA4B,sBAAsB;AAAA;AACtD,YAAM,QAAQ,IAAI,oBAAoB;AACtC,WAAK,aAAa;AAClB,aAAO;AAAA,IACT;AAAA;AACF;", | ||
| "sourcesContent": ["import type { BindingContext } from './bindingContext'\n\nexport class BindingResult {\n isSync: boolean\n isComplete: boolean\n completionPromise: Promise<BindingResult>\n rootNode: Node\n bindingContext: BindingContext\n\n constructor({ asyncBindingsApplied, rootNode, bindingContext }) {\n this.rootNode = rootNode\n this.bindingContext = bindingContext\n this.isSync = asyncBindingsApplied.size === 0\n this.isComplete = this.isSync\n\n if (!this.isSync) {\n this.completionPromise = this.completeWhenBindingsFinish(asyncBindingsApplied)\n }\n }\n\n async completeWhenBindingsFinish(asyncBindingsApplied: Set<any>) {\n await Promise.all(asyncBindingsApplied)\n this.isComplete = true\n return this\n }\n}\n"], | ||
| "mappings": ";;AAEO,aAAM,cAAc;AAAA,EAOzB,YAAY,EAAE,sBAAsB,UAAU,eAAe,GAAG;AAC9D,SAAK,WAAW;AAChB,SAAK,iBAAiB;AACtB,SAAK,SAAS,qBAAqB,SAAS;AAC5C,SAAK,aAAa,KAAK;AAEvB,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,oBAAoB,KAAK,2BAA2B,oBAAoB;AAAA,IAC/E;AAAA,EACF;AAAA,EAEA,MAAM,2BAA2B,sBAAgC;AAC/D,UAAM,QAAQ,IAAI,oBAAoB;AACtC,SAAK,aAAa;AAClB,WAAO;AAAA,EACT;AACF;", | ||
| "names": [] | ||
| } |
@@ -1,22 +0,3 @@ | ||
| // @tko/bind 🥊 4.0.0-beta1.3 ESM | ||
| var __async = (__this, __arguments, generator) => { | ||
| return new Promise((resolve, reject) => { | ||
| var fulfilled = (value) => { | ||
| try { | ||
| step(generator.next(value)); | ||
| } catch (e) { | ||
| reject(e); | ||
| } | ||
| }; | ||
| var rejected = (value) => { | ||
| try { | ||
| step(generator.throw(value)); | ||
| } catch (e) { | ||
| reject(e); | ||
| } | ||
| }; | ||
| var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); | ||
| step((generator = generator.apply(__this, __arguments)).next()); | ||
| }); | ||
| }; | ||
| // @tko/bind 🥊 4.0.0 ESM | ||
| "use strict"; | ||
| import { applyBindingsToDescendants } from "./applyBindings"; | ||
@@ -28,16 +9,14 @@ import { AsyncBindingHandler } from "./BindingHandler"; | ||
| } | ||
| applyBindingsToDescendants(childContext, callback) { | ||
| return __async(this, null, function* () { | ||
| const bindingResult = applyBindingsToDescendants(childContext, this.$element); | ||
| if (bindingResult.isSync) { | ||
| this.bindingCompletion = bindingResult; | ||
| } else { | ||
| yield bindingResult.completionPromise; | ||
| } | ||
| if (callback) { | ||
| callback(bindingResult); | ||
| } | ||
| this.completeBinding(bindingResult); | ||
| }); | ||
| async applyBindingsToDescendants(childContext, callback) { | ||
| const bindingResult = applyBindingsToDescendants(childContext, this.$element); | ||
| if (bindingResult.isSync) { | ||
| this.bindingCompletion = bindingResult; | ||
| } else { | ||
| await bindingResult.completionPromise; | ||
| } | ||
| if (callback) { | ||
| callback(bindingResult); | ||
| } | ||
| this.completeBinding(bindingResult); | ||
| } | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../src/DescendantBindingHandler.ts"], | ||
| "sourcesContent": ["\n\nimport { applyBindingsToDescendants } from './applyBindings'\nimport { AsyncBindingHandler } from './BindingHandler'\n\n/**\n * This DescendantBindingHandler is a base class for bindings that control\n * descendants, such as the `if`, `with`, `component`, `foreach` and `template`\n * bindings.\n */\nexport class DescendantBindingHandler extends AsyncBindingHandler {\n get controlsDescendants () { return true }\n\n async applyBindingsToDescendants (childContext, callback) {\n const bindingResult = applyBindingsToDescendants(childContext, this.$element)\n if (bindingResult.isSync) {\n this.bindingCompletion = bindingResult\n } else {\n await bindingResult.completionPromise\n }\n if (callback) { callback(bindingResult) }\n this.completeBinding(bindingResult)\n }\n}\n"], | ||
| "mappings": ";;;;;;;;;;;;;;;;;;;;;AAEA;AACA;AAOO,aAAM,iCAAiC,oBAAoB;AAAA,MAC5D,sBAAuB;AAAE,WAAO;AAAA,EAAK;AAAA,EAEnC,2BAA4B,cAAc,UAAU;AAAA;AACxD,YAAM,gBAAgB,2BAA2B,cAAc,KAAK,QAAQ;AAC5E,UAAI,cAAc,QAAQ;AACxB,aAAK,oBAAoB;AAAA,MAC3B,OAAO;AACL,cAAM,cAAc;AAAA,MACtB;AACA,UAAI,UAAU;AAAE,iBAAS,aAAa;AAAA,MAAE;AACxC,WAAK,gBAAgB,aAAa;AAAA,IACpC;AAAA;AACF;", | ||
| "sourcesContent": ["import { applyBindingsToDescendants } from './applyBindings'\nimport { AsyncBindingHandler } from './BindingHandler'\nimport type { BindingResult } from './BindingResult'\nimport type { BindingContext } from './bindingContext'\n\n/**\n * This DescendantBindingHandler is a base class for bindings that control\n * descendants, such as the `if`, `with`, `component`, `foreach` and `template`\n * bindings.\n */\nexport class DescendantBindingHandler extends AsyncBindingHandler {\n override get controlsDescendants() {\n return true\n }\n\n async applyBindingsToDescendants(childContext: BindingContext, callback?: (result: BindingResult) => void) {\n const bindingResult = applyBindingsToDescendants(childContext, this.$element)\n if (bindingResult.isSync) {\n this.bindingCompletion = bindingResult\n } else {\n await bindingResult.completionPromise\n }\n if (callback) {\n callback(bindingResult)\n }\n this.completeBinding(bindingResult)\n }\n}\n"], | ||
| "mappings": ";;AAAA,SAAS,kCAAkC;AAC3C,SAAS,2BAA2B;AAS7B,aAAM,iCAAiC,oBAAoB;AAAA,EAChE,IAAa,sBAAsB;AACjC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,2BAA2B,cAA8B,UAA4C;AACzG,UAAM,gBAAgB,2BAA2B,cAAc,KAAK,QAAQ;AAC5E,QAAI,cAAc,QAAQ;AACxB,WAAK,oBAAoB;AAAA,IAC3B,OAAO;AACL,YAAM,cAAc;AAAA,IACtB;AACA,QAAI,UAAU;AACZ,eAAS,aAAa;AAAA,IACxB;AACA,SAAK,gBAAgB,aAAa;AAAA,EACpC;AACF;", | ||
| "names": [] | ||
| } |
+4
-8
@@ -1,12 +0,8 @@ | ||
| // @tko/bind 🥊 4.0.0-beta1.3 ESM | ||
| // @tko/bind 🥊 4.0.0 ESM | ||
| "use strict"; | ||
| export * from "./bindingContext"; | ||
| export * from "./applyBindings"; | ||
| export * from "./arrayToDomNodeChildren"; | ||
| export { | ||
| BindingHandler, | ||
| AsyncBindingHandler | ||
| } from "./BindingHandler"; | ||
| export { | ||
| DescendantBindingHandler | ||
| } from "./DescendantBindingHandler"; | ||
| export { BindingHandler, AsyncBindingHandler } from "./BindingHandler"; | ||
| export { DescendantBindingHandler } from "./DescendantBindingHandler"; | ||
| export { bindingEvent } from "./bindingEvent"; |
| { | ||
| "version": 3, | ||
| "sources": ["../src/index.ts"], | ||
| "sourcesContent": ["\nexport * from './bindingContext'\nexport * from './applyBindings'\nexport * from './arrayToDomNodeChildren'\n\nexport {\n BindingHandler,\n AsyncBindingHandler\n} from './BindingHandler'\n\nexport {\n DescendantBindingHandler\n} from './DescendantBindingHandler'\n\nexport { bindingEvent } from './bindingEvent'\n"], | ||
| "mappings": ";AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAIA;", | ||
| "sourcesContent": ["export * from './bindingContext'\nexport * from './applyBindings'\nexport * from './arrayToDomNodeChildren'\n\nexport { BindingHandler, AsyncBindingHandler } from './BindingHandler'\n\nexport type { AllBindings } from './BindingHandler'\n\nexport { DescendantBindingHandler } from './DescendantBindingHandler'\n\nexport type { BindingContext } from './bindingContext'\n\nexport { bindingEvent } from './bindingEvent'\n"], | ||
| "mappings": ";;AAAA,cAAc;AACd,cAAc;AACd,cAAc;AAEd,SAAS,gBAAgB,2BAA2B;AAIpD,SAAS,gCAAgC;AAIzC,SAAS,oBAAoB;", | ||
| "names": [] | ||
| } |
+4
-8
@@ -1,12 +0,8 @@ | ||
| // @tko/bind 🥊 4.0.0-beta1.3 MJS | ||
| // @tko/bind 🥊 4.0.0 MJS | ||
| "use strict"; | ||
| export * from "./bindingContext"; | ||
| export * from "./applyBindings"; | ||
| export * from "./arrayToDomNodeChildren"; | ||
| export { | ||
| BindingHandler, | ||
| AsyncBindingHandler | ||
| } from "./BindingHandler"; | ||
| export { | ||
| DescendantBindingHandler | ||
| } from "./DescendantBindingHandler"; | ||
| export { BindingHandler, AsyncBindingHandler } from "./BindingHandler"; | ||
| export { DescendantBindingHandler } from "./DescendantBindingHandler"; | ||
| export { bindingEvent } from "./bindingEvent"; |
| { | ||
| "version": 3, | ||
| "sources": ["../src/index.ts"], | ||
| "sourcesContent": ["\nexport * from './bindingContext'\nexport * from './applyBindings'\nexport * from './arrayToDomNodeChildren'\n\nexport {\n BindingHandler,\n AsyncBindingHandler\n} from './BindingHandler'\n\nexport {\n DescendantBindingHandler\n} from './DescendantBindingHandler'\n\nexport { bindingEvent } from './bindingEvent'\n"], | ||
| "mappings": ";AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAIA;", | ||
| "sourcesContent": ["export * from './bindingContext'\nexport * from './applyBindings'\nexport * from './arrayToDomNodeChildren'\n\nexport { BindingHandler, AsyncBindingHandler } from './BindingHandler'\n\nexport type { AllBindings } from './BindingHandler'\n\nexport { DescendantBindingHandler } from './DescendantBindingHandler'\n\nexport type { BindingContext } from './bindingContext'\n\nexport { bindingEvent } from './bindingEvent'\n"], | ||
| "mappings": ";;AAAA,cAAc;AACd,cAAc;AACd,cAAc;AAEd,SAAS,gBAAgB,2BAA2B;AAIpD,SAAS,gCAAgC;AAIzC,SAAS,oBAAoB;", | ||
| "names": [] | ||
| } |
@@ -1,2 +0,3 @@ | ||
| // @tko/bind 🥊 4.0.0-beta1.3 ESM | ||
| // @tko/bind 🥊 4.0.0 ESM | ||
| "use strict"; | ||
| import { virtualElements, options } from "@tko/utils"; | ||
@@ -7,2 +8,5 @@ import { BindingHandler } from "./BindingHandler"; | ||
| export class LegacyBindingHandler extends BindingHandler { | ||
| get handler() { | ||
| return void 0; | ||
| } | ||
| constructor(params) { | ||
@@ -33,9 +37,3 @@ super(params); | ||
| get legacyArgs() { | ||
| return [ | ||
| this.$element, | ||
| this.valueAccessor, | ||
| this.allBindings, | ||
| this.$data, | ||
| this.$context | ||
| ]; | ||
| return [this.$element, this.valueAccessor, this.allBindings, this.$data, this.$context]; | ||
| } | ||
@@ -46,2 +44,11 @@ get controlsDescendants() { | ||
| } | ||
| /** | ||
| * Create a handler instance from the `origin`, which may be: | ||
| * | ||
| * 1. an object (becomes LegacyBindingHandler) | ||
| * 2. a function (becomes LegacyBindingHandler with `init: function`) | ||
| * | ||
| * If given an object (the only kind supported in knockout 3.x and before), it | ||
| * shall draw the `init`, `update`, and `allowVirtualElements` properties | ||
| */ | ||
| static getOrCreateFor(key, handler) { | ||
@@ -48,0 +55,0 @@ if (legacyBindingMap.has(handler)) { |
| { | ||
| "version": 3, | ||
| "sources": ["../src/LegacyBindingHandler.ts"], | ||
| "sourcesContent": ["\nimport { virtualElements, options } from '@tko/utils'\nimport { BindingHandler } from './BindingHandler'\n\n/**\n * We have no guarantees, for users employing legacy bindings,\n * that it has not been changed with a modification like\n *\n * ko.bindingHandlers[name] = { init: ...}\n *\n * ... so we have to keep track by way of a map.\n */\nconst PossibleWeakMap = options.global.WeakMap || Map\nconst legacyBindingMap = new PossibleWeakMap()\n\nexport class LegacyBindingHandler extends BindingHandler {\n constructor (params) {\n super(params)\n const handler = this.handler\n this.onError = params.onError\n\n if (typeof handler.dispose === 'function') {\n this.addDisposable(handler)\n }\n\n try {\n this.initReturn = handler.init && handler.init(...this.legacyArgs)\n } catch (e) {\n params.onError('init', e)\n }\n }\n\n onValueChange () {\n const handler = this.handler\n if (typeof handler.update !== 'function') { return }\n try {\n handler.update(...this.legacyArgs)\n } catch (e) {\n this.onError('update', e)\n }\n }\n\n get legacyArgs () {\n return [\n this.$element, this.valueAccessor, this.allBindings,\n this.$data, this.$context\n ]\n }\n\n get controlsDescendants () {\n const objectToTest = this.initReturn || this.handler || {}\n return objectToTest.controlsDescendantBindings\n }\n\n /**\n * Create a handler instance from the `origin`, which may be:\n *\n * 1. an object (becomes LegacyBindingHandler)\n * 2. a function (becomes LegacyBindingHandler with `init: function`)\n *\n * If given an object (the only kind supported in knockout 3.x and before), it\n * shall draw the `init`, `update`, and `allowVirtualElements` properties\n */\n static getOrCreateFor (key, handler) {\n if (legacyBindingMap.has(handler)) {\n return legacyBindingMap.get(handler)\n }\n const newLegacyHandler = this.createFor(key, handler)\n legacyBindingMap.set(handler, newLegacyHandler)\n return newLegacyHandler\n }\n\n static createFor (key, handler) {\n if (typeof handler === 'function') {\n const [initFn, disposeFn] = [handler, handler.dispose]\n return class extends LegacyBindingHandler {\n get handler () {\n const init = initFn.bind(this)\n const dispose = disposeFn ? disposeFn.bind(this) : null\n return { init, dispose }\n }\n static get after () { return handler.after }\n static get allowVirtualElements () {\n return handler.allowVirtualElements || virtualElements.allowedBindings[key]\n }\n }\n }\n\n if (typeof handler === 'object') {\n return class extends LegacyBindingHandler {\n get handler () { return handler }\n static get after () { return handler.after }\n static get allowVirtualElements () {\n return handler.allowVirtualElements || virtualElements.allowedBindings[key]\n }\n }\n }\n\n throw new Error('The given handler is not an appropriate type.')\n }\n}\n"], | ||
| "mappings": ";AACA;AACA;AAUA,MAAM,kBAAkB,QAAQ,OAAO,WAAW;AAClD,MAAM,mBAAmB,IAAI,gBAAgB;AAEtC,aAAM,6BAA6B,eAAe;AAAA,EACvD,YAAa,QAAQ;AACnB,UAAM,MAAM;AACZ,UAAM,UAAU,KAAK;AACrB,SAAK,UAAU,OAAO;AAEtB,QAAI,OAAO,QAAQ,YAAY,YAAY;AACzC,WAAK,cAAc,OAAO;AAAA,IAC5B;AAEA,QAAI;AACF,WAAK,aAAa,QAAQ,QAAQ,QAAQ,KAAK,GAAG,KAAK,UAAU;AAAA,IACnE,SAAS,GAAP;AACA,aAAO,QAAQ,QAAQ,CAAC;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,gBAAiB;AACf,UAAM,UAAU,KAAK;AACrB,QAAI,OAAO,QAAQ,WAAW,YAAY;AAAE;AAAA,IAAO;AACnD,QAAI;AACF,cAAQ,OAAO,GAAG,KAAK,UAAU;AAAA,IACnC,SAAS,GAAP;AACA,WAAK,QAAQ,UAAU,CAAC;AAAA,IAC1B;AAAA,EACF;AAAA,MAEI,aAAc;AAChB,WAAO;AAAA,MACL,KAAK;AAAA,MAAU,KAAK;AAAA,MAAe,KAAK;AAAA,MACxC,KAAK;AAAA,MAAO,KAAK;AAAA,IACnB;AAAA,EACF;AAAA,MAEI,sBAAuB;AACzB,UAAM,eAAe,KAAK,cAAc,KAAK,WAAW,CAAC;AACzD,WAAO,aAAa;AAAA,EACtB;AAAA,SAWO,eAAgB,KAAK,SAAS;AACnC,QAAI,iBAAiB,IAAI,OAAO,GAAG;AACjC,aAAO,iBAAiB,IAAI,OAAO;AAAA,IACrC;AACA,UAAM,mBAAmB,KAAK,UAAU,KAAK,OAAO;AACpD,qBAAiB,IAAI,SAAS,gBAAgB;AAC9C,WAAO;AAAA,EACT;AAAA,SAEO,UAAW,KAAK,SAAS;AAC9B,QAAI,OAAO,YAAY,YAAY;AACjC,YAAM,CAAC,QAAQ,aAAa,CAAC,SAAS,QAAQ,OAAO;AACrD,aAAO,cAAc,qBAAqB;AAAA,YACpC,UAAW;AACb,gBAAM,OAAO,OAAO,KAAK,IAAI;AAC7B,gBAAM,UAAU,YAAY,UAAU,KAAK,IAAI,IAAI;AACnD,iBAAO,EAAE,MAAM,QAAQ;AAAA,QACzB;AAAA,mBACW,QAAS;AAAE,iBAAO,QAAQ;AAAA,QAAM;AAAA,mBAChC,uBAAwB;AACjC,iBAAO,QAAQ,wBAAwB,gBAAgB,gBAAgB;AAAA,QACzE;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,YAAY,UAAU;AAC/B,aAAO,cAAc,qBAAqB;AAAA,YACpC,UAAW;AAAE,iBAAO;AAAA,QAAQ;AAAA,mBACrB,QAAS;AAAE,iBAAO,QAAQ;AAAA,QAAM;AAAA,mBAChC,uBAAwB;AACjC,iBAAO,QAAQ,wBAAwB,gBAAgB,gBAAgB;AAAA,QACzE;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AACF;", | ||
| "sourcesContent": ["import { virtualElements, options } from '@tko/utils'\nimport { BindingHandler } from './BindingHandler'\n\n/**\n * We have no guarantees, for users employing legacy bindings,\n * that it has not been changed with a modification like\n *\n * ko.bindingHandlers[name] = { init: ...}\n *\n * ... so we have to keep track by way of a map.\n */\nconst PossibleWeakMap = options.global.WeakMap || Map\nconst legacyBindingMap = new PossibleWeakMap()\n\nexport class LegacyBindingHandler extends BindingHandler {\n get handler(): any {\n // Needed to prevent tsc error for using this.handler\n // is overriden in factory functions. Any must be used for return type\n return undefined\n }\n initReturn: any\n onError: (step: string, error: unknown) => void\n constructor(params: any) {\n super(params)\n const handler = this.handler\n this.onError = params.onError\n\n if (typeof handler.dispose === 'function') {\n this.addDisposable(handler)\n }\n\n try {\n this.initReturn = handler.init && handler.init(...this.legacyArgs)\n } catch (e) {\n params.onError('init', e)\n }\n }\n\n onValueChange(): void {\n const handler = this.handler\n if (typeof handler.update !== 'function') {\n return\n }\n try {\n handler.update(...this.legacyArgs)\n } catch (e) {\n this.onError('update', e)\n }\n }\n\n get legacyArgs(): any[] {\n return [this.$element, this.valueAccessor, this.allBindings, this.$data, this.$context]\n }\n\n override get controlsDescendants(): boolean {\n const objectToTest = this.initReturn || this.handler || {}\n return objectToTest.controlsDescendantBindings\n }\n\n /**\n * Create a handler instance from the `origin`, which may be:\n *\n * 1. an object (becomes LegacyBindingHandler)\n * 2. a function (becomes LegacyBindingHandler with `init: function`)\n *\n * If given an object (the only kind supported in knockout 3.x and before), it\n * shall draw the `init`, `update`, and `allowVirtualElements` properties\n */\n static getOrCreateFor(key: string | undefined, handler: any): any {\n if (legacyBindingMap.has(handler)) {\n return legacyBindingMap.get(handler)\n }\n const newLegacyHandler = this.createFor(key, handler)\n legacyBindingMap.set(handler, newLegacyHandler)\n return newLegacyHandler\n }\n\n static createFor(key: string | undefined, handler: any): any {\n if (typeof handler === 'function') {\n const [initFn, disposeFn] = [handler, handler.dispose]\n return class extends LegacyBindingHandler {\n override get handler() {\n const init = initFn.bind(this)\n const dispose = disposeFn ? disposeFn.bind(this) : null\n return { init, dispose }\n }\n static get after() {\n return handler.after\n }\n static override get allowVirtualElements() {\n return handler.allowVirtualElements || virtualElements.allowedBindings[key!]\n }\n }\n }\n\n if (typeof handler === 'object') {\n return class extends LegacyBindingHandler {\n override get handler() {\n return handler\n }\n static get after() {\n return handler.after\n }\n static override get allowVirtualElements() {\n return handler.allowVirtualElements || virtualElements.allowedBindings[key!]\n }\n }\n }\n\n throw new Error('The given handler is not an appropriate type.')\n }\n}\n"], | ||
| "mappings": ";;AAAA,SAAS,iBAAiB,eAAe;AACzC,SAAS,sBAAsB;AAU/B,MAAM,kBAAkB,QAAQ,OAAO,WAAW;AAClD,MAAM,mBAAmB,IAAI,gBAAgB;AAEtC,aAAM,6BAA6B,eAAe;AAAA,EACvD,IAAI,UAAe;AAGjB,WAAO;AAAA,EACT;AAAA,EAGA,YAAY,QAAa;AACvB,UAAM,MAAM;AACZ,UAAM,UAAU,KAAK;AACrB,SAAK,UAAU,OAAO;AAEtB,QAAI,OAAO,QAAQ,YAAY,YAAY;AACzC,WAAK,cAAc,OAAO;AAAA,IAC5B;AAEA,QAAI;AACF,WAAK,aAAa,QAAQ,QAAQ,QAAQ,KAAK,GAAG,KAAK,UAAU;AAAA,IACnE,SAAS,GAAG;AACV,aAAO,QAAQ,QAAQ,CAAC;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,gBAAsB;AACpB,UAAM,UAAU,KAAK;AACrB,QAAI,OAAO,QAAQ,WAAW,YAAY;AACxC;AAAA,IACF;AACA,QAAI;AACF,cAAQ,OAAO,GAAG,KAAK,UAAU;AAAA,IACnC,SAAS,GAAG;AACV,WAAK,QAAQ,UAAU,CAAC;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,IAAI,aAAoB;AACtB,WAAO,CAAC,KAAK,UAAU,KAAK,eAAe,KAAK,aAAa,KAAK,OAAO,KAAK,QAAQ;AAAA,EACxF;AAAA,EAEA,IAAa,sBAA+B;AAC1C,UAAM,eAAe,KAAK,cAAc,KAAK,WAAW,CAAC;AACzD,WAAO,aAAa;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,eAAe,KAAyB,SAAmB;AAChE,QAAI,iBAAiB,IAAI,OAAO,GAAG;AACjC,aAAO,iBAAiB,IAAI,OAAO;AAAA,IACrC;AACA,UAAM,mBAAmB,KAAK,UAAU,KAAK,OAAO;AACpD,qBAAiB,IAAI,SAAS,gBAAgB;AAC9C,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,UAAU,KAAyB,SAAmB;AAC3D,QAAI,OAAO,YAAY,YAAY;AACjC,YAAM,CAAC,QAAQ,SAAS,IAAI,CAAC,SAAS,QAAQ,OAAO;AACrD,aAAO,cAAc,qBAAqB;AAAA,QACxC,IAAa,UAAU;AACrB,gBAAM,OAAO,OAAO,KAAK,IAAI;AAC7B,gBAAM,UAAU,YAAY,UAAU,KAAK,IAAI,IAAI;AACnD,iBAAO,EAAE,MAAM,QAAQ;AAAA,QACzB;AAAA,QACA,WAAW,QAAQ;AACjB,iBAAO,QAAQ;AAAA,QACjB;AAAA,QACA,WAAoB,uBAAuB;AACzC,iBAAO,QAAQ,wBAAwB,gBAAgB,gBAAgB,GAAI;AAAA,QAC7E;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,YAAY,UAAU;AAC/B,aAAO,cAAc,qBAAqB;AAAA,QACxC,IAAa,UAAU;AACrB,iBAAO;AAAA,QACT;AAAA,QACA,WAAW,QAAQ;AACjB,iBAAO,QAAQ;AAAA,QACjB;AAAA,QACA,WAAoB,uBAAuB;AACzC,iBAAO,QAAQ,wBAAwB,gBAAgB,gBAAgB,GAAI;AAAA,QAC7E;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AACF;", | ||
| "names": [] | ||
| } |
+8
-9
| { | ||
| "version": "4.0.0-beta1.3", | ||
| "version": "4.0.0", | ||
| "name": "@tko/bind", | ||
@@ -7,11 +7,11 @@ "description": "TKO DOM-Observable Binding", | ||
| "dependencies": { | ||
| "@tko/computed": "^4.0.0-beta1.3", | ||
| "@tko/lifecycle": "^4.0.0-beta1.3", | ||
| "@tko/observable": "^4.0.0-beta1.3", | ||
| "@tko/provider": "^4.0.0-beta1.3", | ||
| "@tko/utils": "^4.0.0-beta1.3", | ||
| "@tko/computed": "^4.0.0", | ||
| "@tko/lifecycle": "^4.0.0", | ||
| "@tko/observable": "^4.0.0", | ||
| "@tko/provider": "^4.0.0", | ||
| "@tko/utils": "^4.0.0", | ||
| "tslib": "^2.2.0" | ||
| }, | ||
| "peerDependencies": { | ||
| "@tko/binding.foreach": "^4.0.0-alpha9.0" | ||
| "@tko/binding.foreach": "^4.0.0" | ||
| }, | ||
@@ -50,4 +50,3 @@ "files": [ | ||
| "./helpers/*": "./helpers/*" | ||
| }, | ||
| "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
AI-detected possible typosquat
Supply chain riskAI has identified this package as a potential typosquat of a more popular package. This suggests that the package may be intentionally mimicking another package's name, description, or other metadata.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
417410
8.32%4044
5.64%0
-100%0
-100%23
-4.17%Updated
Updated
Updated
Updated
Updated