@tko/binding.core 4.0.0-alpha8.0 → 4.0.0-beta1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/attr.js +36 -0
  2. package/dist/attr.js.map +7 -0
  3. package/dist/checked.js +94 -0
  4. package/dist/checked.js.map +7 -0
  5. package/dist/click.js +5 -0
  6. package/dist/click.js.map +7 -0
  7. package/dist/css.js +28 -0
  8. package/dist/css.js.map +7 -0
  9. package/dist/descendantsComplete.js +14 -0
  10. package/dist/descendantsComplete.js.map +7 -0
  11. package/dist/enableDisable.js +21 -0
  12. package/dist/enableDisable.js.map +7 -0
  13. package/dist/event.js +75 -0
  14. package/dist/event.js.map +7 -0
  15. package/dist/hasfocus.js +48 -0
  16. package/dist/hasfocus.js.map +7 -0
  17. package/dist/html.js +15 -0
  18. package/dist/html.js.map +7 -0
  19. package/dist/index.cjs +3956 -0
  20. package/dist/index.cjs.map +7 -0
  21. package/dist/index.js +50 -0
  22. package/dist/index.js.map +7 -0
  23. package/dist/index.mjs +50 -0
  24. package/dist/index.mjs.map +7 -0
  25. package/dist/let.js +12 -0
  26. package/dist/let.js.map +7 -0
  27. package/dist/options.js +130 -0
  28. package/dist/options.js.map +7 -0
  29. package/dist/selectedOptions.js +41 -0
  30. package/dist/selectedOptions.js.map +7 -0
  31. package/dist/style.js +30 -0
  32. package/dist/style.js.map +7 -0
  33. package/dist/submit.js +26 -0
  34. package/dist/submit.js.map +7 -0
  35. package/dist/test-helper.js +14 -0
  36. package/dist/test-helper.js.map +7 -0
  37. package/dist/text.js +13 -0
  38. package/dist/text.js.map +7 -0
  39. package/dist/textInput.js +151 -0
  40. package/dist/textInput.js.map +7 -0
  41. package/dist/uniqueName.js +13 -0
  42. package/dist/uniqueName.js.map +7 -0
  43. package/dist/using.js +12 -0
  44. package/dist/using.js.map +7 -0
  45. package/dist/value.js +103 -0
  46. package/dist/value.js.map +7 -0
  47. package/dist/visible.js +20 -0
  48. package/dist/visible.js.map +7 -0
  49. package/package.json +18 -28
  50. package/dist/binding.core.es6.js +0 -1044
  51. package/dist/binding.core.es6.js.map +0 -1
  52. package/dist/binding.core.js +0 -1143
  53. package/dist/binding.core.js.map +0 -1
package/dist/index.js ADDED
@@ -0,0 +1,50 @@
1
+ // @tko/binding.core 🥊 4.0.0-beta1.0 ESM
2
+ import { attr } from "./attr";
3
+ import { checked, checkedValue } from "./checked";
4
+ import { click } from "./click";
5
+ import { css } from "./css";
6
+ import descendantsComplete from "./descendantsComplete";
7
+ import { enable, disable } from "./enableDisable";
8
+ import { eventHandler, onHandler } from "./event";
9
+ import { hasfocus } from "./hasfocus";
10
+ import { html } from "./html";
11
+ import $let from "./let";
12
+ import { options } from "./options";
13
+ import { selectedOptions } from "./selectedOptions";
14
+ import { style } from "./style";
15
+ import { submit } from "./submit";
16
+ import { text } from "./text";
17
+ import { textInput } from "./textInput";
18
+ import { uniqueName } from "./uniqueName";
19
+ import { value } from "./value";
20
+ import { visible, hidden } from "./visible";
21
+ import { using } from "./using";
22
+ export var bindings = {
23
+ attr,
24
+ checked,
25
+ checkedValue,
26
+ click,
27
+ css,
28
+ "class": css,
29
+ descendantsComplete,
30
+ enable,
31
+ "event": eventHandler,
32
+ disable,
33
+ hasfocus,
34
+ hasFocus: hasfocus,
35
+ hidden,
36
+ html,
37
+ "let": $let,
38
+ on: onHandler,
39
+ options,
40
+ selectedOptions,
41
+ style,
42
+ submit,
43
+ text,
44
+ textInput,
45
+ textinput: textInput,
46
+ uniqueName,
47
+ using,
48
+ value,
49
+ visible
50
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts"],
4
+ "sourcesContent": ["\nimport {attr} from './attr'\nimport {checked, checkedValue} from './checked'\nimport {click} from './click'\nimport {css} from './css'\nimport descendantsComplete from './descendantsComplete'\nimport {enable, disable} from './enableDisable'\nimport {eventHandler, onHandler} from './event'\nimport {hasfocus} from './hasfocus'\nimport {html} from './html'\nimport $let from './let'\nimport {options} from './options'\nimport {selectedOptions} from './selectedOptions'\nimport {style} from './style'\nimport {submit} from './submit'\nimport {text} from './text'\nimport {textInput} from './textInput'\nimport {uniqueName} from './uniqueName'\nimport {value} from './value'\nimport {visible, hidden} from './visible'\nimport {using} from './using'\n\nexport var bindings = {\n attr,\n checked,\n checkedValue,\n click,\n css,\n 'class': css,\n descendantsComplete,\n enable,\n 'event': eventHandler,\n disable,\n hasfocus,\n hasFocus: hasfocus,\n hidden,\n html,\n 'let': $let,\n on: onHandler,\n options,\n selectedOptions,\n style,\n submit,\n text,\n textInput,\n textinput: textInput,\n uniqueName,\n using,\n value,\n visible\n}\n"],
5
+ "mappings": ";AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEO,WAAI,WAAW;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,IAAI;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;",
6
+ "names": []
7
+ }
package/dist/index.mjs ADDED
@@ -0,0 +1,50 @@
1
+ // @tko/binding.core 🥊 4.0.0-beta1.0 MJS
2
+ import { attr } from "./attr";
3
+ import { checked, checkedValue } from "./checked";
4
+ import { click } from "./click";
5
+ import { css } from "./css";
6
+ import descendantsComplete from "./descendantsComplete";
7
+ import { enable, disable } from "./enableDisable";
8
+ import { eventHandler, onHandler } from "./event";
9
+ import { hasfocus } from "./hasfocus";
10
+ import { html } from "./html";
11
+ import $let from "./let";
12
+ import { options } from "./options";
13
+ import { selectedOptions } from "./selectedOptions";
14
+ import { style } from "./style";
15
+ import { submit } from "./submit";
16
+ import { text } from "./text";
17
+ import { textInput } from "./textInput";
18
+ import { uniqueName } from "./uniqueName";
19
+ import { value } from "./value";
20
+ import { visible, hidden } from "./visible";
21
+ import { using } from "./using";
22
+ export var bindings = {
23
+ attr,
24
+ checked,
25
+ checkedValue,
26
+ click,
27
+ css,
28
+ "class": css,
29
+ descendantsComplete,
30
+ enable,
31
+ "event": eventHandler,
32
+ disable,
33
+ hasfocus,
34
+ hasFocus: hasfocus,
35
+ hidden,
36
+ html,
37
+ "let": $let,
38
+ on: onHandler,
39
+ options,
40
+ selectedOptions,
41
+ style,
42
+ submit,
43
+ text,
44
+ textInput,
45
+ textinput: textInput,
46
+ uniqueName,
47
+ using,
48
+ value,
49
+ visible
50
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts"],
4
+ "sourcesContent": ["\nimport {attr} from './attr'\nimport {checked, checkedValue} from './checked'\nimport {click} from './click'\nimport {css} from './css'\nimport descendantsComplete from './descendantsComplete'\nimport {enable, disable} from './enableDisable'\nimport {eventHandler, onHandler} from './event'\nimport {hasfocus} from './hasfocus'\nimport {html} from './html'\nimport $let from './let'\nimport {options} from './options'\nimport {selectedOptions} from './selectedOptions'\nimport {style} from './style'\nimport {submit} from './submit'\nimport {text} from './text'\nimport {textInput} from './textInput'\nimport {uniqueName} from './uniqueName'\nimport {value} from './value'\nimport {visible, hidden} from './visible'\nimport {using} from './using'\n\nexport var bindings = {\n attr,\n checked,\n checkedValue,\n click,\n css,\n 'class': css,\n descendantsComplete,\n enable,\n 'event': eventHandler,\n disable,\n hasfocus,\n hasFocus: hasfocus,\n hidden,\n html,\n 'let': $let,\n on: onHandler,\n options,\n selectedOptions,\n style,\n submit,\n text,\n textInput,\n textinput: textInput,\n uniqueName,\n using,\n value,\n visible\n}\n"],
5
+ "mappings": ";AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEO,WAAI,WAAW;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,IAAI;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;",
6
+ "names": []
7
+ }
package/dist/let.js ADDED
@@ -0,0 +1,12 @@
1
+ // @tko/binding.core 🥊 4.0.0-beta1.0 ESM
2
+ import {
3
+ applyBindingsToDescendants
4
+ } from "@tko/bind";
5
+ export default {
6
+ init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
7
+ var innerContext = bindingContext["extend"](valueAccessor);
8
+ applyBindingsToDescendants(innerContext, element);
9
+ return { "controlsDescendantBindings": true };
10
+ },
11
+ allowVirtualElements: true
12
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/let.ts"],
4
+ "sourcesContent": ["\nimport {\n applyBindingsToDescendants\n} from '@tko/bind'\n\nexport default {\n init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {\n // Make a modified binding context, with extra properties, and apply it to descendant elements\n var innerContext = bindingContext['extend'](valueAccessor)\n applyBindingsToDescendants(innerContext, element)\n\n return { 'controlsDescendantBindings': true }\n },\n allowVirtualElements: true\n}\n"],
5
+ "mappings": ";AACA;AAAA;AAAA;AAIA,eAAe;AAAA,EACb,MAAM,SAAU,SAAS,eAAe,aAAa,WAAW,gBAAgB;AAE9E,QAAI,eAAe,eAAe,UAAU,aAAa;AACzD,+BAA2B,cAAc,OAAO;AAEhD,WAAO,EAAE,8BAA8B,KAAK;AAAA,EAC9C;AAAA,EACA,sBAAsB;AACxB;",
6
+ "names": []
7
+ }
@@ -0,0 +1,130 @@
1
+ // @tko/binding.core 🥊 4.0.0-beta1.0 ESM
2
+ import {
3
+ tagNameLower,
4
+ arrayFilter,
5
+ arrayMap,
6
+ setTextContent,
7
+ arrayIndexOf,
8
+ setOptionNodeSelectionState,
9
+ triggerEvent,
10
+ ensureSelectElementIsRenderedCorrectly,
11
+ selectExtensions
12
+ } from "@tko/utils";
13
+ import {
14
+ unwrap,
15
+ dependencyDetection
16
+ } from "@tko/observable";
17
+ import {
18
+ setDomNodeChildrenFromArrayMapping
19
+ } from "@tko/bind";
20
+ var captionPlaceholder = {};
21
+ export var options = {
22
+ init: function(element) {
23
+ if (tagNameLower(element) !== "select") {
24
+ throw new Error("options binding applies only to SELECT elements");
25
+ }
26
+ while (element.length > 0) {
27
+ element.remove(0);
28
+ }
29
+ return { "controlsDescendantBindings": true };
30
+ },
31
+ update: function(element, valueAccessor, allBindings) {
32
+ function selectedOptions() {
33
+ return arrayFilter(element.options, function(node) {
34
+ return node.selected;
35
+ });
36
+ }
37
+ var selectWasPreviouslyEmpty = element.length == 0, multiple = element.multiple, previousScrollTop = !selectWasPreviouslyEmpty && multiple ? element.scrollTop : null, unwrappedArray = unwrap(valueAccessor()), valueAllowUnset = allBindings.get("valueAllowUnset") && allBindings["has"]("value"), includeDestroyed = allBindings.get("optionsIncludeDestroyed"), arrayToDomNodeChildrenOptions = {}, captionValue, filteredArray, previousSelectedValues = [];
38
+ if (!valueAllowUnset) {
39
+ if (multiple) {
40
+ previousSelectedValues = arrayMap(selectedOptions(), selectExtensions.readValue);
41
+ } else if (element.selectedIndex >= 0) {
42
+ previousSelectedValues.push(selectExtensions.readValue(element.options[element.selectedIndex]));
43
+ }
44
+ }
45
+ if (unwrappedArray) {
46
+ if (typeof unwrappedArray.length === "undefined") {
47
+ unwrappedArray = [unwrappedArray];
48
+ }
49
+ filteredArray = arrayFilter(unwrappedArray, function(item) {
50
+ return includeDestroyed || item === void 0 || item === null || !unwrap(item["_destroy"]);
51
+ });
52
+ if (allBindings["has"]("optionsCaption")) {
53
+ captionValue = unwrap(allBindings.get("optionsCaption"));
54
+ if (captionValue !== null && captionValue !== void 0) {
55
+ filteredArray.unshift(captionPlaceholder);
56
+ }
57
+ }
58
+ } else {
59
+ }
60
+ function applyToObject(object, predicate, defaultValue) {
61
+ var predicateType = typeof predicate;
62
+ if (predicateType === "function") {
63
+ return predicate(object);
64
+ } else if (predicateType == "string") {
65
+ return object[predicate];
66
+ } else {
67
+ return defaultValue;
68
+ }
69
+ }
70
+ var itemUpdate = false;
71
+ function optionForArrayItem(arrayEntry, index, oldOptions) {
72
+ if (oldOptions.length) {
73
+ previousSelectedValues = !valueAllowUnset && oldOptions[0].selected ? [selectExtensions.readValue(oldOptions[0])] : [];
74
+ itemUpdate = true;
75
+ }
76
+ var option = element.ownerDocument.createElement("option");
77
+ if (arrayEntry === captionPlaceholder) {
78
+ setTextContent(option, allBindings.get("optionsCaption"));
79
+ selectExtensions.writeValue(option, void 0);
80
+ } else {
81
+ var optionValue = applyToObject(arrayEntry, allBindings.get("optionsValue"), arrayEntry);
82
+ selectExtensions.writeValue(option, unwrap(optionValue));
83
+ var optionText = applyToObject(arrayEntry, allBindings.get("optionsText"), optionValue);
84
+ setTextContent(option, optionText);
85
+ }
86
+ return [option];
87
+ }
88
+ arrayToDomNodeChildrenOptions["beforeRemove"] = function(option) {
89
+ element.removeChild(option);
90
+ };
91
+ function setSelectionCallback(arrayEntry, newOptions) {
92
+ if (itemUpdate && valueAllowUnset) {
93
+ selectExtensions.writeValue(element, unwrap(allBindings.get("value")), true);
94
+ } else if (previousSelectedValues.length) {
95
+ var isSelected = arrayIndexOf(previousSelectedValues, selectExtensions.readValue(newOptions[0])) >= 0;
96
+ setOptionNodeSelectionState(newOptions[0], isSelected);
97
+ if (itemUpdate && !isSelected) {
98
+ dependencyDetection.ignore(triggerEvent, null, [element, "change"]);
99
+ }
100
+ }
101
+ }
102
+ var callback = setSelectionCallback;
103
+ if (allBindings["has"]("optionsAfterRender") && typeof allBindings.get("optionsAfterRender") === "function") {
104
+ callback = function(arrayEntry, newOptions) {
105
+ setSelectionCallback(arrayEntry, newOptions);
106
+ dependencyDetection.ignore(allBindings.get("optionsAfterRender"), null, [newOptions[0], arrayEntry !== captionPlaceholder ? arrayEntry : void 0]);
107
+ };
108
+ }
109
+ setDomNodeChildrenFromArrayMapping(element, filteredArray, optionForArrayItem, arrayToDomNodeChildrenOptions, callback);
110
+ dependencyDetection.ignore(function() {
111
+ if (valueAllowUnset) {
112
+ selectExtensions.writeValue(element, unwrap(allBindings.get("value")), true);
113
+ } else {
114
+ var selectionChanged;
115
+ if (multiple) {
116
+ selectionChanged = previousSelectedValues.length && selectedOptions().length < previousSelectedValues.length;
117
+ } else {
118
+ selectionChanged = previousSelectedValues.length && element.selectedIndex >= 0 ? selectExtensions.readValue(element.options[element.selectedIndex]) !== previousSelectedValues[0] : previousSelectedValues.length || element.selectedIndex >= 0;
119
+ }
120
+ if (selectionChanged) {
121
+ triggerEvent(element, "change");
122
+ }
123
+ }
124
+ });
125
+ ensureSelectElementIsRenderedCorrectly(element);
126
+ if (previousScrollTop && Math.abs(previousScrollTop - element.scrollTop) > 20) {
127
+ element.scrollTop = previousScrollTop;
128
+ }
129
+ }
130
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/options.ts"],
4
+ "sourcesContent": ["\nimport {\n tagNameLower, arrayFilter, arrayMap, setTextContent, arrayIndexOf,\n setOptionNodeSelectionState, triggerEvent, domData,\n ensureSelectElementIsRenderedCorrectly, selectExtensions\n} from '@tko/utils'\n\nimport {\n unwrap, dependencyDetection\n} from '@tko/observable'\n\nimport {\n setDomNodeChildrenFromArrayMapping\n} from '@tko/bind'\n\nvar captionPlaceholder = {}\n\nexport var options = {\n init: function (element) {\n if (tagNameLower(element) !== 'select') { throw new Error('options binding applies only to SELECT elements') }\n\n // Remove all existing <option>s.\n while (element.length > 0) {\n element.remove(0)\n }\n\n // Ensures that the binding processor doesn't try to bind the options\n return { 'controlsDescendantBindings': true }\n },\n update: function (element, valueAccessor, allBindings) {\n function selectedOptions () {\n return arrayFilter(element.options, function (node) { return node.selected })\n }\n\n var selectWasPreviouslyEmpty = element.length == 0,\n multiple = element.multiple,\n previousScrollTop = (!selectWasPreviouslyEmpty && multiple) ? element.scrollTop : null,\n unwrappedArray = unwrap(valueAccessor()),\n valueAllowUnset = allBindings.get('valueAllowUnset') && allBindings['has']('value'),\n includeDestroyed = allBindings.get('optionsIncludeDestroyed'),\n arrayToDomNodeChildrenOptions = {},\n captionValue,\n filteredArray,\n previousSelectedValues = []\n\n if (!valueAllowUnset) {\n if (multiple) {\n previousSelectedValues = arrayMap(selectedOptions(), selectExtensions.readValue)\n } else if (element.selectedIndex >= 0) {\n previousSelectedValues.push(selectExtensions.readValue(element.options[element.selectedIndex]))\n }\n }\n\n if (unwrappedArray) {\n if (typeof unwrappedArray.length === 'undefined') // Coerce single value into array\n { unwrappedArray = [unwrappedArray] }\n\n // Filter out any entries marked as destroyed\n filteredArray = arrayFilter(unwrappedArray, function (item) {\n return includeDestroyed || item === undefined || item === null || !unwrap(item['_destroy'])\n })\n\n // If caption is included, add it to the array\n if (allBindings['has']('optionsCaption')) {\n captionValue = unwrap(allBindings.get('optionsCaption'))\n // If caption value is null or undefined, don't show a caption\n if (captionValue !== null && captionValue !== undefined) {\n filteredArray.unshift(captionPlaceholder)\n }\n }\n } else {\n // If a falsy value is provided (e.g. null), we'll simply empty the select element\n }\n\n function applyToObject (object, predicate, defaultValue) {\n var predicateType = typeof predicate\n if (predicateType === 'function') // Given a function; run it against the data value\n { return predicate(object) } else if (predicateType == 'string') // Given a string; treat it as a property name on the data value\n { return object[predicate] } else // Given no optionsText arg; use the data value itself\n { return defaultValue }\n }\n\n // The following functions can run at two different times:\n // The first is when the whole array is being updated directly from this binding handler.\n // The second is when an observable value for a specific array entry is updated.\n // oldOptions will be empty in the first case, but will be filled with the previously generated option in the second.\n var itemUpdate = false\n function optionForArrayItem (arrayEntry, index, oldOptions) {\n if (oldOptions.length) {\n previousSelectedValues = !valueAllowUnset && oldOptions[0].selected ? [ selectExtensions.readValue(oldOptions[0]) ] : []\n itemUpdate = true\n }\n var option = element.ownerDocument.createElement('option')\n if (arrayEntry === captionPlaceholder) {\n setTextContent(option, allBindings.get('optionsCaption'))\n selectExtensions.writeValue(option, undefined)\n } else {\n // Apply a value to the option element\n var optionValue = applyToObject(arrayEntry, allBindings.get('optionsValue'), arrayEntry)\n selectExtensions.writeValue(option, unwrap(optionValue))\n\n // Apply some text to the option element\n var optionText = applyToObject(arrayEntry, allBindings.get('optionsText'), optionValue)\n setTextContent(option, optionText)\n }\n return [option]\n }\n\n // By using a beforeRemove callback, we delay the removal until after new items are added. This fixes a selection\n // problem in IE<=8 and Firefox. See https://github.com/knockout/knockout/issues/1208\n arrayToDomNodeChildrenOptions['beforeRemove'] =\n function (option) {\n element.removeChild(option)\n }\n\n function setSelectionCallback (arrayEntry, newOptions) {\n if (itemUpdate && valueAllowUnset) {\n // The model value is authoritative, so make sure its value is the one selected\n // There is no need to use dependencyDetection.ignore since setDomNodeChildrenFromArrayMapping does so already.\n selectExtensions.writeValue(element, unwrap(allBindings.get('value')), true /* allowUnset */)\n } else if (previousSelectedValues.length) {\n // IE6 doesn't like us to assign selection to OPTION nodes before they're added to the document.\n // That's why we first added them without selection. Now it's time to set the selection.\n var isSelected = arrayIndexOf(previousSelectedValues, selectExtensions.readValue(newOptions[0])) >= 0\n setOptionNodeSelectionState(newOptions[0], isSelected)\n\n // If this option was changed from being selected during a single-item update, notify the change\n if (itemUpdate && !isSelected) {\n dependencyDetection.ignore(triggerEvent, null, [element, 'change'])\n }\n }\n }\n\n var callback = setSelectionCallback\n if (allBindings['has']('optionsAfterRender') && typeof allBindings.get('optionsAfterRender') === 'function') {\n callback = function (arrayEntry, newOptions) {\n setSelectionCallback(arrayEntry, newOptions)\n dependencyDetection.ignore(allBindings.get('optionsAfterRender'), null, [newOptions[0], arrayEntry !== captionPlaceholder ? arrayEntry : undefined])\n }\n }\n\n setDomNodeChildrenFromArrayMapping(element, filteredArray, optionForArrayItem, arrayToDomNodeChildrenOptions, callback)\n\n dependencyDetection.ignore(function () {\n if (valueAllowUnset) {\n // The model value is authoritative, so make sure its value is the one selected\n selectExtensions.writeValue(element, unwrap(allBindings.get('value')), true /* allowUnset */)\n } else {\n // Determine if the selection has changed as a result of updating the options list\n var selectionChanged\n if (multiple) {\n // For a multiple-select box, compare the new selection count to the previous one\n // But if nothing was selected before, the selection can't have changed\n selectionChanged = previousSelectedValues.length && selectedOptions().length < previousSelectedValues.length\n } else {\n // For a single-select box, compare the current value to the previous value\n // But if nothing was selected before or nothing is selected now, just look for a change in selection\n selectionChanged = (previousSelectedValues.length && element.selectedIndex >= 0)\n ? (selectExtensions.readValue(element.options[element.selectedIndex]) !== previousSelectedValues[0])\n : (previousSelectedValues.length || element.selectedIndex >= 0)\n }\n\n // Ensure consistency between model value and selected option.\n // If the dropdown was changed so that selection is no longer the same,\n // notify the value or selectedOptions binding.\n if (selectionChanged) {\n triggerEvent(element, 'change')\n }\n }\n })\n\n // Workaround for IE bug\n ensureSelectElementIsRenderedCorrectly(element)\n\n if (previousScrollTop && Math.abs(previousScrollTop - element.scrollTop) > 20) { element.scrollTop = previousScrollTop }\n }\n}\n"],
5
+ "mappings": ";AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA;AAAA;AAAA;AAIA;AAAA;AAAA;AAIA,IAAI,qBAAqB,CAAC;AAEnB,WAAI,UAAU;AAAA,EACnB,MAAM,SAAU,SAAS;AACvB,QAAI,aAAa,OAAO,MAAM,UAAU;AAAE,YAAM,IAAI,MAAM,iDAAiD;AAAA,IAAE;AAG7G,WAAO,QAAQ,SAAS,GAAG;AACzB,cAAQ,OAAO,CAAC;AAAA,IAClB;AAGA,WAAO,EAAE,8BAA8B,KAAK;AAAA,EAC9C;AAAA,EACA,QAAQ,SAAU,SAAS,eAAe,aAAa;AACrD,+BAA4B;AAC1B,aAAO,YAAY,QAAQ,SAAS,SAAU,MAAM;AAAE,eAAO,KAAK;AAAA,MAAS,CAAC;AAAA,IAC9E;AAEA,QAAI,2BAA2B,QAAQ,UAAU,GAC/C,WAAW,QAAQ,UACnB,oBAAqB,CAAC,4BAA4B,WAAY,QAAQ,YAAY,MAClF,iBAAiB,OAAO,cAAc,CAAC,GACvC,kBAAkB,YAAY,IAAI,iBAAiB,KAAK,YAAY,OAAO,OAAO,GAClF,mBAAmB,YAAY,IAAI,yBAAyB,GAC5D,gCAAgC,CAAC,GACjC,cACA,eACA,yBAAyB,CAAC;AAE5B,QAAI,CAAC,iBAAiB;AACpB,UAAI,UAAU;AACZ,iCAAyB,SAAS,gBAAgB,GAAG,iBAAiB,SAAS;AAAA,MACjF,WAAW,QAAQ,iBAAiB,GAAG;AACrC,+BAAuB,KAAK,iBAAiB,UAAU,QAAQ,QAAQ,QAAQ,cAAc,CAAC;AAAA,MAChG;AAAA,IACF;AAEA,QAAI,gBAAgB;AAClB,UAAI,OAAO,eAAe,WAAW,aACnC;AAAE,yBAAiB,CAAC,cAAc;AAAA,MAAE;AAGtC,sBAAgB,YAAY,gBAAgB,SAAU,MAAM;AAC1D,eAAO,oBAAoB,SAAS,UAAa,SAAS,QAAQ,CAAC,OAAO,KAAK,WAAW;AAAA,MAC5F,CAAC;AAGD,UAAI,YAAY,OAAO,gBAAgB,GAAG;AACxC,uBAAe,OAAO,YAAY,IAAI,gBAAgB,CAAC;AAEvD,YAAI,iBAAiB,QAAQ,iBAAiB,QAAW;AACvD,wBAAc,QAAQ,kBAAkB;AAAA,QAC1C;AAAA,MACF;AAAA,IACF,OAAO;AAAA,IAEP;AAEA,2BAAwB,QAAQ,WAAW,cAAc;AACvD,UAAI,gBAAgB,OAAO;AAC3B,UAAI,kBAAkB,YACd;AAAE,eAAO,UAAU,MAAM;AAAA,MAAE,WAAW,iBAAiB,UACvD;AAAE,eAAO,OAAO;AAAA,MAAW,OACzB;AAAE,eAAO;AAAA,MAAa;AAAA,IAClC;AAMA,QAAI,aAAa;AACjB,gCAA6B,YAAY,OAAO,YAAY;AAC1D,UAAI,WAAW,QAAQ;AACrB,iCAAyB,CAAC,mBAAmB,WAAW,GAAG,WAAW,CAAE,iBAAiB,UAAU,WAAW,EAAE,CAAE,IAAI,CAAC;AACvH,qBAAa;AAAA,MACf;AACA,UAAI,SAAS,QAAQ,cAAc,cAAc,QAAQ;AACzD,UAAI,eAAe,oBAAoB;AACrC,uBAAe,QAAQ,YAAY,IAAI,gBAAgB,CAAC;AACxD,yBAAiB,WAAW,QAAQ,MAAS;AAAA,MAC/C,OAAO;AAEL,YAAI,cAAc,cAAc,YAAY,YAAY,IAAI,cAAc,GAAG,UAAU;AACvF,yBAAiB,WAAW,QAAQ,OAAO,WAAW,CAAC;AAGvD,YAAI,aAAa,cAAc,YAAY,YAAY,IAAI,aAAa,GAAG,WAAW;AACtF,uBAAe,QAAQ,UAAU;AAAA,MACnC;AACA,aAAO,CAAC,MAAM;AAAA,IAChB;AAIA,kCAA8B,kBACtB,SAAU,QAAQ;AAChB,cAAQ,YAAY,MAAM;AAAA,IAC5B;AAER,kCAA+B,YAAY,YAAY;AACrD,UAAI,cAAc,iBAAiB;AAGjC,yBAAiB,WAAW,SAAS,OAAO,YAAY,IAAI,OAAO,CAAC,GAAG,IAAqB;AAAA,MAC9F,WAAW,uBAAuB,QAAQ;AAGxC,YAAI,aAAa,aAAa,wBAAwB,iBAAiB,UAAU,WAAW,EAAE,CAAC,KAAK;AACpG,oCAA4B,WAAW,IAAI,UAAU;AAGrD,YAAI,cAAc,CAAC,YAAY;AAC7B,8BAAoB,OAAO,cAAc,MAAM,CAAC,SAAS,QAAQ,CAAC;AAAA,QACpE;AAAA,MACF;AAAA,IACF;AAEA,QAAI,WAAW;AACf,QAAI,YAAY,OAAO,oBAAoB,KAAK,OAAO,YAAY,IAAI,oBAAoB,MAAM,YAAY;AAC3G,iBAAW,SAAU,YAAY,YAAY;AAC3C,6BAAqB,YAAY,UAAU;AAC3C,4BAAoB,OAAO,YAAY,IAAI,oBAAoB,GAAG,MAAM,CAAC,WAAW,IAAI,eAAe,qBAAqB,aAAa,MAAS,CAAC;AAAA,MACrJ;AAAA,IACF;AAEA,uCAAmC,SAAS,eAAe,oBAAoB,+BAA+B,QAAQ;AAEtH,wBAAoB,OAAO,WAAY;AACrC,UAAI,iBAAiB;AAEnB,yBAAiB,WAAW,SAAS,OAAO,YAAY,IAAI,OAAO,CAAC,GAAG,IAAqB;AAAA,MAC9F,OAAO;AAEL,YAAI;AACJ,YAAI,UAAU;AAGZ,6BAAmB,uBAAuB,UAAU,gBAAgB,EAAE,SAAS,uBAAuB;AAAA,QACxG,OAAO;AAGL,6BAAoB,uBAAuB,UAAU,QAAQ,iBAAiB,IAC7D,iBAAiB,UAAU,QAAQ,QAAQ,QAAQ,cAAc,MAAM,uBAAuB,KAC9F,uBAAuB,UAAU,QAAQ,iBAAiB;AAAA,QAC7E;AAKA,YAAI,kBAAkB;AACpB,uBAAa,SAAS,QAAQ;AAAA,QAChC;AAAA,MACF;AAAA,IACF,CAAC;AAGD,2CAAuC,OAAO;AAE9C,QAAI,qBAAqB,KAAK,IAAI,oBAAoB,QAAQ,SAAS,IAAI,IAAI;AAAE,cAAQ,YAAY;AAAA,IAAkB;AAAA,EACzH;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,41 @@
1
+ // @tko/binding.core 🥊 4.0.0-beta1.0 ESM
2
+ import {
3
+ arrayForEach,
4
+ setOptionNodeSelectionState,
5
+ arrayIndexOf,
6
+ registerEventHandler,
7
+ tagNameLower,
8
+ selectExtensions
9
+ } from "@tko/utils";
10
+ import {
11
+ unwrap
12
+ } from "@tko/observable";
13
+ export var selectedOptions = {
14
+ after: ["options", "foreach"],
15
+ init: function(element, valueAccessor, allBindings) {
16
+ registerEventHandler(element, "change", function() {
17
+ var value = valueAccessor(), valueToWrite = [];
18
+ arrayForEach(element.getElementsByTagName("option"), function(node) {
19
+ if (node.selected) {
20
+ valueToWrite.push(selectExtensions.readValue(node));
21
+ }
22
+ });
23
+ valueAccessor(valueToWrite);
24
+ });
25
+ },
26
+ update: function(element, valueAccessor) {
27
+ if (tagNameLower(element) != "select") {
28
+ throw new Error("values binding applies only to SELECT elements");
29
+ }
30
+ var newValue = unwrap(valueAccessor()), previousScrollTop = element.scrollTop;
31
+ if (newValue && typeof newValue.length === "number") {
32
+ arrayForEach(element.getElementsByTagName("option"), function(node) {
33
+ var isSelected = arrayIndexOf(newValue, selectExtensions.readValue(node)) >= 0;
34
+ if (node.selected != isSelected) {
35
+ setOptionNodeSelectionState(node, isSelected);
36
+ }
37
+ });
38
+ }
39
+ element.scrollTop = previousScrollTop;
40
+ }
41
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/selectedOptions.ts"],
4
+ "sourcesContent": ["\nimport {\n arrayForEach, setOptionNodeSelectionState, arrayIndexOf,\n registerEventHandler, tagNameLower, selectExtensions\n} from '@tko/utils'\n\nimport {\n unwrap\n} from '@tko/observable'\n\nexport var selectedOptions = {\n after: ['options', 'foreach'],\n\n init: function (element, valueAccessor, allBindings) {\n registerEventHandler(element, 'change', function () {\n var value = valueAccessor(), valueToWrite = []\n arrayForEach(element.getElementsByTagName('option'), function (node) {\n if (node.selected) { valueToWrite.push(selectExtensions.readValue(node)) }\n })\n valueAccessor(valueToWrite)\n })\n },\n\n update: function (element, valueAccessor) {\n if (tagNameLower(element) != 'select') { throw new Error('values binding applies only to SELECT elements') }\n\n var newValue = unwrap(valueAccessor()),\n previousScrollTop = element.scrollTop\n\n if (newValue && typeof newValue.length === 'number') {\n arrayForEach(element.getElementsByTagName('option'), function (node) {\n var isSelected = arrayIndexOf(newValue, selectExtensions.readValue(node)) >= 0\n if (node.selected != isSelected) { // This check prevents flashing of the select element in IE\n setOptionNodeSelectionState(node, isSelected)\n }\n })\n }\n\n element.scrollTop = previousScrollTop\n }\n}\n"],
5
+ "mappings": ";AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAIO,WAAI,kBAAkB;AAAA,EAC3B,OAAO,CAAC,WAAW,SAAS;AAAA,EAE5B,MAAM,SAAU,SAAS,eAAe,aAAa;AACnD,yBAAqB,SAAS,UAAU,WAAY;AAClD,UAAI,QAAQ,cAAc,GAAG,eAAe,CAAC;AAC7C,mBAAa,QAAQ,qBAAqB,QAAQ,GAAG,SAAU,MAAM;AACnE,YAAI,KAAK,UAAU;AAAE,uBAAa,KAAK,iBAAiB,UAAU,IAAI,CAAC;AAAA,QAAE;AAAA,MAC3E,CAAC;AACD,oBAAc,YAAY;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA,EAEA,QAAQ,SAAU,SAAS,eAAe;AACxC,QAAI,aAAa,OAAO,KAAK,UAAU;AAAE,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAAE;AAE3G,QAAI,WAAW,OAAO,cAAc,CAAC,GACnC,oBAAoB,QAAQ;AAE9B,QAAI,YAAY,OAAO,SAAS,WAAW,UAAU;AACnD,mBAAa,QAAQ,qBAAqB,QAAQ,GAAG,SAAU,MAAM;AACnE,YAAI,aAAa,aAAa,UAAU,iBAAiB,UAAU,IAAI,CAAC,KAAK;AAC7E,YAAI,KAAK,YAAY,YAAY;AAC/B,sCAA4B,MAAM,UAAU;AAAA,QAC9C;AAAA,MACF,CAAC;AAAA,IACH;AAEA,YAAQ,YAAY;AAAA,EACtB;AACF;",
6
+ "names": []
7
+ }
package/dist/style.js ADDED
@@ -0,0 +1,30 @@
1
+ // @tko/binding.core 🥊 4.0.0-beta1.0 ESM
2
+ import {
3
+ objectForEach,
4
+ options
5
+ } from "@tko/utils";
6
+ import {
7
+ unwrap
8
+ } from "@tko/observable";
9
+ const { jQueryInstance } = options;
10
+ export var style = {
11
+ update: function(element, valueAccessor) {
12
+ var value = unwrap(valueAccessor() || {});
13
+ objectForEach(value, function(styleName, styleValue) {
14
+ styleValue = unwrap(styleValue);
15
+ if (styleValue === null || styleValue === void 0 || styleValue === false) {
16
+ styleValue = "";
17
+ }
18
+ if (jQueryInstance) {
19
+ jQueryInstance(element).css(styleName, styleValue);
20
+ } else {
21
+ styleName = styleName.replace(/-(\w)/g, (all, letter) => letter.toUpperCase());
22
+ const previousStyle = element.style[styleName];
23
+ element.style[styleName] = styleValue;
24
+ if (styleValue !== previousStyle && element.style[styleName] === previousStyle && !isNaN(styleValue)) {
25
+ element.style[styleName] = styleValue + "px";
26
+ }
27
+ }
28
+ });
29
+ }
30
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/style.ts"],
4
+ "sourcesContent": ["\nimport {\n objectForEach, options\n} from '@tko/utils'\n\nimport {\n unwrap\n} from '@tko/observable'\n\nconst {jQueryInstance} = options\n\nexport var style = {\n update: function (element, valueAccessor) {\n var value = unwrap(valueAccessor() || {})\n objectForEach(value, function (styleName, styleValue) {\n styleValue = unwrap(styleValue)\n\n if (styleValue === null || styleValue === undefined || styleValue === false) {\n // Empty string removes the value, whereas null/undefined have no effect\n styleValue = ''\n }\n\n if (jQueryInstance) {\n jQueryInstance(element).css(styleName, styleValue)\n } else {\n styleName = styleName.replace(/-(\\w)/g, (all, letter) => letter.toUpperCase())\n const previousStyle = element.style[styleName]\n element.style[styleName] = styleValue\n if (styleValue !== previousStyle && element.style[styleName] === previousStyle && !isNaN(styleValue)) {\n element.style[styleName] = styleValue + 'px'\n }\n }\n })\n }\n}\n"],
5
+ "mappings": ";AACA;AAAA;AAAA;AAAA;AAIA;AAAA;AAAA;AAIA,MAAM,EAAC,mBAAkB;AAElB,WAAI,QAAQ;AAAA,EACjB,QAAQ,SAAU,SAAS,eAAe;AACxC,QAAI,QAAQ,OAAO,cAAc,KAAK,CAAC,CAAC;AACxC,kBAAc,OAAO,SAAU,WAAW,YAAY;AACpD,mBAAa,OAAO,UAAU;AAE9B,UAAI,eAAe,QAAQ,eAAe,UAAa,eAAe,OAAO;AAE3E,qBAAa;AAAA,MACf;AAEA,UAAI,gBAAgB;AAClB,uBAAe,OAAO,EAAE,IAAI,WAAW,UAAU;AAAA,MACnD,OAAO;AACL,oBAAY,UAAU,QAAQ,UAAU,CAAC,KAAK,WAAW,OAAO,YAAY,CAAC;AAC7E,cAAM,gBAAgB,QAAQ,MAAM;AACpC,gBAAQ,MAAM,aAAa;AAC3B,YAAI,eAAe,iBAAiB,QAAQ,MAAM,eAAe,iBAAiB,CAAC,MAAM,UAAU,GAAG;AACpG,kBAAQ,MAAM,aAAa,aAAa;AAAA,QAC1C;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;",
6
+ "names": []
7
+ }
package/dist/submit.js ADDED
@@ -0,0 +1,26 @@
1
+ // @tko/binding.core 🥊 4.0.0-beta1.0 ESM
2
+ import {
3
+ registerEventHandler
4
+ } from "@tko/utils";
5
+ export var submit = {
6
+ init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
7
+ if (typeof valueAccessor() !== "function") {
8
+ throw new Error("The value for a submit binding must be a function");
9
+ }
10
+ registerEventHandler(element, "submit", function(event) {
11
+ var handlerReturnValue;
12
+ var value = valueAccessor();
13
+ try {
14
+ handlerReturnValue = value.call(bindingContext["$data"], element);
15
+ } finally {
16
+ if (handlerReturnValue !== true) {
17
+ if (event.preventDefault) {
18
+ event.preventDefault();
19
+ } else {
20
+ event.returnValue = false;
21
+ }
22
+ }
23
+ }
24
+ });
25
+ }
26
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/submit.ts"],
4
+ "sourcesContent": ["\nimport {\n registerEventHandler\n} from '@tko/utils'\n\nexport var submit = {\n init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {\n if (typeof valueAccessor() !== 'function') { throw new Error('The value for a submit binding must be a function') }\n registerEventHandler(element, 'submit', function (event) {\n var handlerReturnValue\n var value = valueAccessor()\n try { handlerReturnValue = value.call(bindingContext['$data'], element) } finally {\n if (handlerReturnValue !== true) { // Normally we want to prevent default action. Developer can override this be explicitly returning true.\n if (event.preventDefault) { event.preventDefault() } else { event.returnValue = false }\n }\n }\n })\n }\n}\n"],
5
+ "mappings": ";AACA;AAAA;AAAA;AAIO,WAAI,SAAS;AAAA,EAClB,MAAM,SAAU,SAAS,eAAe,aAAa,WAAW,gBAAgB;AAC9E,QAAI,OAAO,cAAc,MAAM,YAAY;AAAE,YAAM,IAAI,MAAM,mDAAmD;AAAA,IAAE;AAClH,yBAAqB,SAAS,UAAU,SAAU,OAAO;AACvD,UAAI;AACJ,UAAI,QAAQ,cAAc;AAC1B,UAAI;AAAE,6BAAqB,MAAM,KAAK,eAAe,UAAU,OAAO;AAAA,MAAE,UAAE;AACxE,YAAI,uBAAuB,MAAM;AAC/B,cAAI,MAAM,gBAAgB;AAAE,kBAAM,eAAe;AAAA,UAAE,OAAO;AAAE,kBAAM,cAAc;AAAA,UAAM;AAAA,QACxF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,14 @@
1
+ // @tko/binding.core 🥊 4.0.0-beta1.0 ESM
2
+ import {
3
+ arrayFilter,
4
+ arrayMap,
5
+ selectExtensions
6
+ } from "@tko/utils";
7
+ export var matchers = {
8
+ toHaveSelectedValues(expectedValues) {
9
+ const selectedNodes = arrayFilter(this.actual.childNodes, (node) => node.selected);
10
+ const selectedValues = arrayMap(selectedNodes, (node) => selectExtensions.readValue(node));
11
+ this.actual = selectedValues;
12
+ return this.env.equals_(selectedValues, expectedValues);
13
+ }
14
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/test-helper.ts"],
4
+ "sourcesContent": ["\nimport {\n arrayFilter, arrayMap, selectExtensions\n} from '@tko/utils'\n\n/**\n * Note that these matchers cannot be included in jasmine-13-helpers.js.\n *\n * When using Rollup to create the tests, it creates multiple files e.g.\n * - optionsBehaviors\n * - checkedBehaviors\n * - ...\n *\n * This is problematic if domData access is imported via jasmine-13-helper,\n * since there'll be only one instance of domData imported i.e. the imports\n * should look like this:\n *\n * - optionsBehaviors\n * - utils/dom/data\n * - checkedBehaviors\n * - utils/dom/data/\n *\n * But what happens is that the singleton in data.js (dataStore) is created\n * in jasmine-13-helper, so when it's referenced it always comes from\n * the very first import. So in checkedBehaviors any reference to domData\n * would get it from the `dataStore` in optionsBehaviors (because it was\n * imported first).\n *\n * Or at least that seems to be the dragon here.\n */\n\nexport var matchers = {\n toHaveSelectedValues (expectedValues) {\n const selectedNodes = arrayFilter(this.actual.childNodes, node => node.selected)\n const selectedValues = arrayMap(selectedNodes, node => selectExtensions.readValue(node))\n this.actual = selectedValues // Fix explanatory message\n return this.env.equals_(selectedValues, expectedValues)\n }\n}\n"],
5
+ "mappings": ";AACA;AAAA;AAAA;AAAA;AAAA;AA8BO,WAAI,WAAW;AAAA,EACpB,qBAAsB,gBAAgB;AACpC,UAAM,gBAAgB,YAAY,KAAK,OAAO,YAAY,UAAQ,KAAK,QAAQ;AAC/E,UAAM,iBAAiB,SAAS,eAAe,UAAQ,iBAAiB,UAAU,IAAI,CAAC;AACvF,SAAK,SAAS;AACd,WAAO,KAAK,IAAI,QAAQ,gBAAgB,cAAc;AAAA,EACxD;AACF;",
6
+ "names": []
7
+ }
package/dist/text.js ADDED
@@ -0,0 +1,13 @@
1
+ // @tko/binding.core 🥊 4.0.0-beta1.0 ESM
2
+ import {
3
+ setTextContent
4
+ } from "@tko/utils";
5
+ export var text = {
6
+ init: function() {
7
+ return { controlsDescendantBindings: true };
8
+ },
9
+ update: function(element, valueAccessor) {
10
+ setTextContent(element, valueAccessor());
11
+ },
12
+ allowVirtualElements: true
13
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/text.ts"],
4
+ "sourcesContent": ["import {\n setTextContent\n} from '@tko/utils'\n\nexport var text = {\n init: function () {\n // Prevent binding on the dynamically-injected text node (as developers are unlikely to expect that, and it has security implications).\n // It should also make things faster, as we no longer have to consider whether the text node might be bindable.\n return { controlsDescendantBindings: true }\n },\n update: function (element, valueAccessor) {\n setTextContent(element, valueAccessor())\n },\n allowVirtualElements: true\n}\n"],
5
+ "mappings": ";AAAA;AAAA;AAAA;AAIO,WAAI,OAAO;AAAA,EAChB,MAAM,WAAY;AAGhB,WAAO,EAAE,4BAA4B,KAAK;AAAA,EAC5C;AAAA,EACA,QAAQ,SAAU,SAAS,eAAe;AACxC,mBAAe,SAAS,cAAc,CAAC;AAAA,EACzC;AAAA,EACA,sBAAsB;AACxB;",
6
+ "names": []
7
+ }
@@ -0,0 +1,151 @@
1
+ // @tko/binding.core 🥊 4.0.0-beta1.0 ESM
2
+ import {
3
+ domData,
4
+ registerEventHandler,
5
+ ieVersion,
6
+ safeSetTimeout,
7
+ options,
8
+ arrayForEach
9
+ } from "@tko/utils";
10
+ import {
11
+ unwrap
12
+ } from "@tko/observable";
13
+ import {
14
+ BindingHandler
15
+ } from "@tko/bind";
16
+ var parseVersion, operaVersion, safariVersion, firefoxVersion;
17
+ class TextInput extends BindingHandler {
18
+ get aliases() {
19
+ return "textinput";
20
+ }
21
+ constructor(...args) {
22
+ super(...args);
23
+ this.previousElementValue = this.$element.value;
24
+ if (options.debug && this.constructor._forceUpdateOn) {
25
+ arrayForEach(this.constructor._forceUpdateOn, (eventName) => {
26
+ if (eventName.slice(0, 5) === "after") {
27
+ this.addEventListener(eventName.slice(5), "deferUpdateModel");
28
+ } else {
29
+ this.addEventListener(eventName, "updateModel");
30
+ }
31
+ });
32
+ }
33
+ for (const eventName of this.eventsIndicatingSyncValueChange()) {
34
+ this.addEventListener(eventName, "updateModel");
35
+ }
36
+ for (const eventName of this.eventsIndicatingDeferValueChange()) {
37
+ this.addEventListener(eventName, "deferUpdateModel");
38
+ }
39
+ this.computed("updateView");
40
+ }
41
+ eventsIndicatingSyncValueChange() {
42
+ return ["input", "change", "blur"];
43
+ }
44
+ eventsIndicatingDeferValueChange() {
45
+ return [];
46
+ }
47
+ updateModel(event) {
48
+ const element = this.$element;
49
+ clearTimeout(this.timeoutHandle);
50
+ this.elementValueBeforeEvent = this.timeoutHandle = void 0;
51
+ const elementValue = element.value;
52
+ if (this.previousElementValue !== elementValue) {
53
+ if (options.debug && event) {
54
+ element._ko_textInputProcessedEvent = event.type;
55
+ }
56
+ this.previousElementValue = elementValue;
57
+ this.value = elementValue;
58
+ }
59
+ }
60
+ deferUpdateModel(event) {
61
+ const element = this.$element;
62
+ if (!this.timeoutHandle) {
63
+ this.elementValueBeforeEvent = element.value;
64
+ const handler2 = options.debug ? this.updateModel.bind(this, { type: event.type }) : this.updateModel;
65
+ this.timeoutHandle = safeSetTimeout(handler2, 4);
66
+ }
67
+ }
68
+ updateView() {
69
+ let modelValue = unwrap(this.value);
70
+ if (modelValue === null || modelValue === void 0) {
71
+ modelValue = "";
72
+ }
73
+ if (this.elementValueBeforeEvent !== void 0 && modelValue === this.elementValueBeforeEvent) {
74
+ setTimeout(this.updateView.bind(this), 4);
75
+ } else if (this.$element.value !== modelValue) {
76
+ this.previousElementValue = modelValue;
77
+ this.$element.value = modelValue;
78
+ this.previousElementValue = this.$element.value;
79
+ }
80
+ }
81
+ }
82
+ class TextInputIE extends TextInput {
83
+ constructor(...args) {
84
+ super(...args);
85
+ if (ieVersion < 11) {
86
+ this.addEventListener("propertychange", (event) => event.propertyName === "value" && this.updateModel(event));
87
+ }
88
+ if (ieVersion >= 8 && ieVersion < 10) {
89
+ this.watchForSelectionChangeEvent();
90
+ this.addEventListener("dragend", "deferUpdateModel");
91
+ }
92
+ }
93
+ eventsIndicatingSyncValueChange() {
94
+ return [...super.eventsIndicatingValueChange(), "keypress"];
95
+ }
96
+ selectionChangeHandler(event) {
97
+ const target = this.activeElement;
98
+ const handler2 = target && domData.get(target, selectionChangeHandlerName);
99
+ if (handler2) {
100
+ handler2(event);
101
+ }
102
+ }
103
+ watchForSelectionChangeEvent(element, ieUpdateModel) {
104
+ const ownerDoc = element.ownerDocument;
105
+ if (!domData.get(ownerDoc, selectionChangeRegisteredName)) {
106
+ domData.set(ownerDoc, selectionChangeRegisteredName, true);
107
+ registerEventHandler(ownerDoc, "selectionchange", this.selectionChangeHandler.bind(ownerDoc));
108
+ }
109
+ domData.set(element, selectionChangeHandlerName, handler);
110
+ }
111
+ }
112
+ class TextInputIE9 extends TextInputIE {
113
+ updateModel(...args) {
114
+ this.deferUpdateModel(...args);
115
+ }
116
+ }
117
+ class TextInputIE8 extends TextInputIE {
118
+ eventsIndicatingValueChange() {
119
+ return [...super.eventsIndicatingValueChange(), "keyup", "keydown"];
120
+ }
121
+ }
122
+ class TextInputLegacySafari extends TextInput {
123
+ eventsIndicatingDeferValueChange() {
124
+ return ["keydown", "paste", "cut"];
125
+ }
126
+ }
127
+ class TextInputLegacyOpera extends TextInput {
128
+ eventsIndicatingDeferValueChange() {
129
+ return ["keydown"];
130
+ }
131
+ }
132
+ class TextInputLegacyFirefox extends TextInput {
133
+ eventsIndicatingValueChange() {
134
+ return [
135
+ ...super.eventsIndicatingSyncValueChange(),
136
+ "DOMAutoComplete",
137
+ "dragdrop",
138
+ "drop"
139
+ ];
140
+ }
141
+ }
142
+ const w = options.global;
143
+ if (w.navigator) {
144
+ const parseVersion2 = (matches) => matches && parseFloat(matches[1]);
145
+ const userAgent = w.navigator.userAgent;
146
+ const isChrome = userAgent.match(/Chrome\/([^ ]+)/);
147
+ operaVersion = w.opera && w.opera.version && parseInt(w.opera.version());
148
+ safariVersion = parseVersion2(userAgent.match(/Version\/([^ ]+) Safari/));
149
+ firefoxVersion = parseVersion2(userAgent.match(/Firefox\/([^ ]*)/));
150
+ }
151
+ export const textInput = ieVersion === 8 ? TextInputIE8 : ieVersion === 9 ? TextInputIE9 : ieVersion ? TextInputIE : safariVersion && safariVersion < 5 ? TextInputLegacySafari : operaVersion < 11 ? TextInputLegacyOpera : firefoxVersion && firefoxVersion < 4 ? TextInputLegacyFirefox : TextInput;