@tko/observable 4.0.0-beta1.3 → 4.0.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.
- package/dist/Subscription.js +4 -5
- package/dist/Subscription.js.map +2 -2
- package/dist/defer.js +2 -1
- package/dist/defer.js.map +2 -2
- package/dist/dependencyDetection.js +11 -3
- package/dist/dependencyDetection.js.map +2 -2
- package/dist/extenders.js +12 -23
- package/dist/extenders.js.map +3 -3
- package/dist/index.cjs +346 -276
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +3 -9
- package/dist/index.js.map +2 -2
- package/dist/index.mjs +3 -9
- package/dist/index.mjs.map +2 -2
- package/dist/mappingHelpers.js +14 -11
- package/dist/mappingHelpers.js.map +2 -2
- package/dist/observable.js +39 -13
- package/dist/observable.js.map +3 -3
- package/dist/observableArray.changeTracking.js +20 -21
- package/dist/observableArray.changeTracking.js.map +2 -2
- package/dist/observableArray.js +25 -27
- package/dist/observableArray.js.map +2 -2
- package/dist/subscribable.js +12 -17
- package/dist/subscribable.js.map +2 -2
- package/dist/subscribableSymbol.js +3 -2
- package/dist/subscribableSymbol.js.map +2 -2
- package/package.json +3 -4
- package/LICENSE +0 -22
package/dist/Subscription.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
// @tko/observable 🥊 4.0.0
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
addDisposeCallback
|
|
5
|
-
} from "@tko/utils";
|
|
1
|
+
// @tko/observable 🥊 4.0.0 ESM
|
|
2
|
+
"use strict";
|
|
3
|
+
import { removeDisposeCallback, addDisposeCallback } from "@tko/utils";
|
|
6
4
|
export default class Subscription {
|
|
7
5
|
constructor(target, observer, disposeCallback) {
|
|
8
6
|
this._target = target;
|
|
@@ -22,6 +20,7 @@ export default class Subscription {
|
|
|
22
20
|
this._node = node;
|
|
23
21
|
addDisposeCallback(node, this._domNodeDisposalCallback = this.dispose.bind(this));
|
|
24
22
|
}
|
|
23
|
+
// TC39 Observable API
|
|
25
24
|
unsubscribe() {
|
|
26
25
|
this.dispose();
|
|
27
26
|
}
|
package/dist/Subscription.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/Subscription.ts"],
|
|
4
|
-
"sourcesContent": ["
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["import { removeDisposeCallback, addDisposeCallback } from '@tko/utils'\n\n//TODO default?\nexport default class Subscription {\n private _disposeCallback: any\n private _target: any\n private _callback: any\n private _isDisposed: boolean\n private _domNodeDisposalCallback: ((node: Node) => void) | null\n private _node: Node\n\n constructor(target, observer, disposeCallback) {\n this._target = target\n this._callback = observer.next\n this._disposeCallback = disposeCallback\n this._isDisposed = false\n this._domNodeDisposalCallback = null\n }\n\n dispose(): void {\n if (this._domNodeDisposalCallback) {\n removeDisposeCallback(this._node, this._domNodeDisposalCallback)\n }\n this._isDisposed = true\n this._disposeCallback()\n }\n\n disposeWhenNodeIsRemoved(node: Node): void {\n this._node = node\n addDisposeCallback(node, (this._domNodeDisposalCallback = this.dispose.bind(this)))\n }\n\n // TC39 Observable API\n unsubscribe() {\n this.dispose()\n }\n get closed() {\n return this._isDisposed\n }\n}\n"],
|
|
5
|
+
"mappings": ";;AAAA,SAAS,uBAAuB,0BAA0B;AAG1D,qBAAqB,aAAa;AAAA,EAQhC,YAAY,QAAQ,UAAU,iBAAiB;AAC7C,SAAK,UAAU;AACf,SAAK,YAAY,SAAS;AAC1B,SAAK,mBAAmB;AACxB,SAAK,cAAc;AACnB,SAAK,2BAA2B;AAAA,EAClC;AAAA,EAEA,UAAgB;AACd,QAAI,KAAK,0BAA0B;AACjC,4BAAsB,KAAK,OAAO,KAAK,wBAAwB;AAAA,IACjE;AACA,SAAK,cAAc;AACnB,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,yBAAyB,MAAkB;AACzC,SAAK,QAAQ;AACb,uBAAmB,MAAO,KAAK,2BAA2B,KAAK,QAAQ,KAAK,IAAI,CAAE;AAAA,EACpF;AAAA;AAAA,EAGA,cAAc;AACZ,SAAK,QAAQ;AAAA,EACf;AAAA,EACA,IAAI,SAAS;AACX,WAAO,KAAK;AAAA,EACd;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/defer.js
CHANGED
package/dist/defer.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/defer.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Defer Updates\n// ===\n//\nimport { tasks } from '@tko/utils'\n\nexport function deferUpdates
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["//\n// Defer Updates\n// ===\n//\nimport { tasks } from '@tko/utils'\n\nexport function deferUpdates(target: any) {\n if (target._deferUpdates) {\n return\n }\n target._deferUpdates = true\n target.limit(function (callback) {\n let handle\n let ignoreUpdates = false\n return function () {\n if (!ignoreUpdates) {\n tasks.cancel(handle)\n handle = tasks.schedule(callback)\n try {\n ignoreUpdates = true\n target.notifySubscribers(undefined, 'dirty')\n } finally {\n ignoreUpdates = false\n }\n }\n }\n })\n}\n"],
|
|
5
|
+
"mappings": ";;AAIA,SAAS,aAAa;AAEf,gBAAS,aAAa,QAAa;AACxC,MAAI,OAAO,eAAe;AACxB;AAAA,EACF;AACA,SAAO,gBAAgB;AACvB,SAAO,MAAM,SAAU,UAAU;AAC/B,QAAI;AACJ,QAAI,gBAAgB;AACpB,WAAO,WAAY;AACjB,UAAI,CAAC,eAAe;AAClB,cAAM,OAAO,MAAM;AACnB,iBAAS,MAAM,SAAS,QAAQ;AAChC,YAAI;AACF,0BAAgB;AAChB,iBAAO,kBAAkB,QAAW,OAAO;AAAA,QAC7C,UAAE;AACA,0BAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
// @tko/observable 🥊 4.0.0
|
|
1
|
+
// @tko/observable 🥊 4.0.0 ESM
|
|
2
|
+
"use strict";
|
|
2
3
|
import { isSubscribable } from "./subscribableSymbol";
|
|
3
|
-
const outerFrames =
|
|
4
|
+
const outerFrames = new Array();
|
|
4
5
|
let currentFrame;
|
|
5
6
|
let lastId = 0;
|
|
6
7
|
function getId() {
|
|
@@ -18,7 +19,11 @@ export function registerDependency(subscribable) {
|
|
|
18
19
|
if (!isSubscribable(subscribable)) {
|
|
19
20
|
throw new Error("Only subscribable things can act as dependencies");
|
|
20
21
|
}
|
|
21
|
-
currentFrame.callback.call(
|
|
22
|
+
currentFrame.callback.call(
|
|
23
|
+
currentFrame.callbackTarget,
|
|
24
|
+
subscribable,
|
|
25
|
+
subscribable._id || (subscribable._id = getId())
|
|
26
|
+
);
|
|
22
27
|
}
|
|
23
28
|
}
|
|
24
29
|
export function ignore(callback, callbackTarget, callbackArgs) {
|
|
@@ -33,15 +38,18 @@ export function getDependenciesCount() {
|
|
|
33
38
|
if (currentFrame) {
|
|
34
39
|
return currentFrame.computed.getDependenciesCount();
|
|
35
40
|
}
|
|
41
|
+
return void 0;
|
|
36
42
|
}
|
|
37
43
|
export function getDependencies() {
|
|
38
44
|
if (currentFrame) {
|
|
39
45
|
return currentFrame.computed.getDependencies();
|
|
40
46
|
}
|
|
47
|
+
return void 0;
|
|
41
48
|
}
|
|
42
49
|
export function isInitial() {
|
|
43
50
|
if (currentFrame) {
|
|
44
51
|
return currentFrame.isInitial;
|
|
45
52
|
}
|
|
53
|
+
return void 0;
|
|
46
54
|
}
|
|
47
55
|
export { ignore as ignoreDependencies };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/dependencyDetection.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// dependencyDetection\n// ---\n//\n// In KO 3.x, dependencyDetection was also known as computedContext.\n//\nimport { isSubscribable } from './subscribableSymbol'\n\nconst outerFrames =
|
|
5
|
-
"mappings": ";
|
|
4
|
+
"sourcesContent": ["//\n// dependencyDetection\n// ---\n//\n// In KO 3.x, dependencyDetection was also known as computedContext.\n//\nimport type { Subscribable } from './subscribable'\nimport { isSubscribable } from './subscribableSymbol'\n\nconst outerFrames = new Array()\nlet currentFrame\nlet lastId = 0\n\n// Return a unique ID that can be assigned to an observable for dependency tracking.\n// Theoretically, you could eventually overflow the number storage size, resulting\n// in duplicate IDs. But in JavaScript, the largest exact integral value is 2^53\n// or 9,007,199,254,740,992. If you created 1,000,000 IDs per second, it would\n// take over 285 years to reach that number.\n// Reference http://blog.vjeux.com/2010/javascript/javascript-max_int-number-limits.html\nfunction getId() {\n return ++lastId\n}\n\nexport function begin(options?) {\n outerFrames.push(currentFrame)\n currentFrame = options\n}\n\nexport function end() {\n currentFrame = outerFrames.pop()\n}\n\nexport function registerDependency(subscribable): void {\n if (currentFrame) {\n if (!isSubscribable(subscribable)) {\n throw new Error('Only subscribable things can act as dependencies')\n }\n currentFrame.callback.call(\n currentFrame.callbackTarget,\n subscribable,\n subscribable._id || (subscribable._id = getId())\n )\n }\n}\n\nexport function ignore(callback: Function, callbackTarget?: any, callbackArgs?: any[]): any {\n try {\n begin()\n return callback.apply(callbackTarget, callbackArgs || [])\n } finally {\n end()\n }\n}\n\nexport function getDependenciesCount(): number | undefined {\n if (currentFrame) {\n return currentFrame.computed.getDependenciesCount()\n }\n return undefined\n}\n\nexport function getDependencies(): Subscribable[] | undefined {\n if (currentFrame) {\n return currentFrame.computed.getDependencies()\n }\n return undefined\n}\n\nexport function isInitial(): boolean | undefined {\n if (currentFrame) {\n return currentFrame.isInitial\n }\n return undefined\n}\n\nexport { ignore as ignoreDependencies }\n"],
|
|
5
|
+
"mappings": ";;AAOA,SAAS,sBAAsB;AAE/B,MAAM,cAAc,IAAI,MAAM;AAC9B,IAAI;AACJ,IAAI,SAAS;AAQb,SAAS,QAAQ;AACf,SAAO,EAAE;AACX;AAEO,gBAAS,MAAM,SAAU;AAC9B,cAAY,KAAK,YAAY;AAC7B,iBAAe;AACjB;AAEO,gBAAS,MAAM;AACpB,iBAAe,YAAY,IAAI;AACjC;AAEO,gBAAS,mBAAmB,cAAoB;AACrD,MAAI,cAAc;AAChB,QAAI,CAAC,eAAe,YAAY,GAAG;AACjC,YAAM,IAAI,MAAM,kDAAkD;AAAA,IACpE;AACA,iBAAa,SAAS;AAAA,MACpB,aAAa;AAAA,MACb;AAAA,MACA,aAAa,QAAQ,aAAa,MAAM,MAAM;AAAA,IAChD;AAAA,EACF;AACF;AAEO,gBAAS,OAAO,UAAoB,gBAAsB,cAA2B;AAC1F,MAAI;AACF,UAAM;AACN,WAAO,SAAS,MAAM,gBAAgB,gBAAgB,CAAC,CAAC;AAAA,EAC1D,UAAE;AACA,QAAI;AAAA,EACN;AACF;AAEO,gBAAS,uBAA2C;AACzD,MAAI,cAAc;AAChB,WAAO,aAAa,SAAS,qBAAqB;AAAA,EACpD;AACA,SAAO;AACT;AAEO,gBAAS,kBAA8C;AAC5D,MAAI,cAAc;AAChB,WAAO,aAAa,SAAS,gBAAgB;AAAA,EAC/C;AACA,SAAO;AACT;AAEO,gBAAS,YAAiC;AAC/C,MAAI,cAAc;AAChB,WAAO,aAAa;AAAA,EACtB;AACA,SAAO;AACT;AAEA,SAAS,UAAU;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/extenders.js
CHANGED
|
@@ -1,26 +1,17 @@
|
|
|
1
|
-
// @tko/observable 🥊 4.0.0
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
objectForEach,
|
|
5
|
-
throttle as throttleFn,
|
|
6
|
-
debounce as debounceFn
|
|
7
|
-
} from "@tko/utils";
|
|
1
|
+
// @tko/observable 🥊 4.0.0 ESM
|
|
2
|
+
"use strict";
|
|
3
|
+
import { options, objectForEach, throttle as throttleFn, debounce as debounceFn } from "@tko/utils";
|
|
8
4
|
import { deferUpdates } from "./defer";
|
|
9
|
-
|
|
10
|
-
"undefined": 1,
|
|
11
|
-
"boolean": 1,
|
|
12
|
-
"number": 1,
|
|
13
|
-
"string": 1
|
|
14
|
-
};
|
|
5
|
+
const primitiveTypes = { undefined: 1, boolean: 1, number: 1, string: 1 };
|
|
15
6
|
export function valuesArePrimitiveAndEqual(a, b) {
|
|
16
|
-
|
|
7
|
+
const oldValueIsPrimitive = a === null || typeof a in primitiveTypes;
|
|
17
8
|
return oldValueIsPrimitive ? a === b : false;
|
|
18
9
|
}
|
|
19
10
|
export function applyExtenders(requestedExtenders) {
|
|
20
|
-
|
|
11
|
+
let target = this;
|
|
21
12
|
if (requestedExtenders) {
|
|
22
13
|
objectForEach(requestedExtenders, function(key, value) {
|
|
23
|
-
|
|
14
|
+
const extenderHandler = extenders[key];
|
|
24
15
|
if (typeof extenderHandler === "function") {
|
|
25
16
|
target = extenderHandler(target, value) || target;
|
|
26
17
|
} else {
|
|
@@ -35,12 +26,14 @@ export function notify(target, notifyWhen) {
|
|
|
35
26
|
}
|
|
36
27
|
export function deferred(target, option) {
|
|
37
28
|
if (option !== true) {
|
|
38
|
-
throw new Error(
|
|
29
|
+
throw new Error(
|
|
30
|
+
"The 'deferred' extender only accepts the value 'true', because it is not supported to turn deferral off once enabled."
|
|
31
|
+
);
|
|
39
32
|
}
|
|
40
33
|
deferUpdates(target);
|
|
41
34
|
}
|
|
42
35
|
export function rateLimit(target, options2) {
|
|
43
|
-
|
|
36
|
+
let timeout, method, limitFunction;
|
|
44
37
|
if (typeof options2 === "number") {
|
|
45
38
|
timeout = options2;
|
|
46
39
|
} else {
|
|
@@ -53,8 +46,4 @@ export function rateLimit(target, options2) {
|
|
|
53
46
|
return limitFunction(callback, timeout);
|
|
54
47
|
});
|
|
55
48
|
}
|
|
56
|
-
export
|
|
57
|
-
notify,
|
|
58
|
-
deferred,
|
|
59
|
-
rateLimit
|
|
60
|
-
};
|
|
49
|
+
export const extenders = { notify, deferred, rateLimit };
|
package/dist/extenders.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/extenders.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Observable extenders\n// ---\n//\nimport {
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": []
|
|
4
|
+
"sourcesContent": ["//\n// Observable extenders\n// ---\n//\nimport { options, objectForEach, throttle as throttleFn, debounce as debounceFn } from '@tko/utils'\n\nimport type { CompareArraysOptions } from '@tko/utils'\nimport type { ObservableArray } from '@tko/observable'\n\nimport { deferUpdates } from './defer'\n\nconst primitiveTypes = { undefined: 1, boolean: 1, number: 1, string: 1 }\n\nexport function valuesArePrimitiveAndEqual(a, b) {\n const oldValueIsPrimitive = a === null || (typeof a) in primitiveTypes\n return oldValueIsPrimitive ? a === b : false\n}\n\nexport function applyExtenders(requestedExtenders?) {\n let target = this\n if (requestedExtenders) {\n objectForEach(requestedExtenders, function (key, value) {\n const extenderHandler = extenders[key]\n if (typeof extenderHandler === 'function') {\n target = extenderHandler(target, value) || target\n } else {\n options.onError(new Error('Extender not found: ' + key))\n }\n })\n }\n return target\n}\n\n/*\n --- DEFAULT EXTENDERS ---\n */\n\n// Change when notifications are published.\nexport function notify(target: any, notifyWhen: string) {\n target.equalityComparer =\n notifyWhen == 'always'\n ? null // null equalityComparer means to always notify\n : valuesArePrimitiveAndEqual\n}\n\nexport function deferred(target: any, option: boolean) {\n if (option !== true) {\n throw new Error(\n \"The 'deferred' extender only accepts the value 'true', because it is not supported to turn deferral off once enabled.\"\n )\n }\n deferUpdates(target)\n}\n\nexport function rateLimit(target: any, options: string | any) {\n let timeout, method, limitFunction\n\n if (typeof options === 'number') {\n timeout = options\n } else {\n timeout = options.timeout\n method = options.method\n }\n\n // rateLimit supersedes deferred updates\n target._deferUpdates = false\n\n limitFunction = method === 'notifyWhenChangesStop' ? debounceFn : throttleFn\n\n target.limit(function (callback) {\n return limitFunction(callback, timeout)\n })\n}\n\nexport interface BaseExtendersType {\n notify(target: any, notifyWhen: string): void\n deferred(target: any, option: boolean): void\n rateLimit(target: any, options: string | any): void\n trackArrayChanges?(target: ObservableArray, options?: CompareArraysOptions): void\n throttle?(target: any, timout: number): void\n}\n\nexport const extenders: BaseExtendersType = { notify: notify, deferred: deferred, rateLimit: rateLimit }\n"],
|
|
5
|
+
"mappings": ";;AAIA,SAAS,SAAS,eAAe,YAAY,YAAY,YAAY,kBAAkB;AAKvF,SAAS,oBAAoB;AAE7B,MAAM,iBAAiB,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,EAAE;AAEjE,gBAAS,2BAA2B,GAAG,GAAG;AAC/C,QAAM,sBAAsB,MAAM,QAAS,OAAO,KAAM;AACxD,SAAO,sBAAsB,MAAM,IAAI;AACzC;AAEO,gBAAS,eAAe,oBAAqB;AAClD,MAAI,SAAS;AACb,MAAI,oBAAoB;AACtB,kBAAc,oBAAoB,SAAU,KAAK,OAAO;AACtD,YAAM,kBAAkB,UAAU,GAAG;AACrC,UAAI,OAAO,oBAAoB,YAAY;AACzC,iBAAS,gBAAgB,QAAQ,KAAK,KAAK;AAAA,MAC7C,OAAO;AACL,gBAAQ,QAAQ,IAAI,MAAM,yBAAyB,GAAG,CAAC;AAAA,MACzD;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAOO,gBAAS,OAAO,QAAa,YAAoB;AACtD,SAAO,mBACL,cAAc,WACV,OACA;AACR;AAEO,gBAAS,SAAS,QAAa,QAAiB;AACrD,MAAI,WAAW,MAAM;AACnB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,eAAa,MAAM;AACrB;AAEO,gBAAS,UAAU,QAAaA,UAAuB;AAC5D,MAAI,SAAS,QAAQ;AAErB,MAAI,OAAOA,aAAY,UAAU;AAC/B,cAAUA;AAAA,EACZ,OAAO;AACL,cAAUA,SAAQ;AAClB,aAASA,SAAQ;AAAA,EACnB;AAGA,SAAO,gBAAgB;AAEvB,kBAAgB,WAAW,0BAA0B,aAAa;AAElE,SAAO,MAAM,SAAU,UAAU;AAC/B,WAAO,cAAc,UAAU,OAAO;AAAA,EACxC,CAAC;AACH;AAUO,aAAM,YAA+B,EAAE,QAAgB,UAAoB,UAAqB;",
|
|
6
|
+
"names": ["options"]
|
|
7
7
|
}
|