@legendapp/state 0.23.2 → 1.0.0-rc.1
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/CHANGELOG.md +12 -0
- package/README.md +4 -0
- package/helpers/pageHash.js +1 -1
- package/helpers/pageHash.js.map +1 -1
- package/helpers/pageHash.mjs +1 -1
- package/helpers/pageHash.mjs.map +1 -1
- package/helpers/pageHashParams.js +1 -1
- package/helpers/pageHashParams.js.map +1 -1
- package/helpers/pageHashParams.mjs +1 -1
- package/helpers/pageHashParams.mjs.map +1 -1
- package/history.js +3 -3
- package/history.js.map +1 -1
- package/history.mjs +4 -4
- package/history.mjs.map +1 -1
- package/index.d.ts +2 -2
- package/index.js +99 -67
- package/index.js.map +1 -1
- package/index.mjs +97 -64
- package/index.mjs.map +1 -1
- package/package.json +1 -1
- package/persist-plugins/indexeddb-preloader.js +13 -11
- package/persist-plugins/indexeddb-preloader.js.map +1 -1
- package/persist-plugins/indexeddb-preloader.mjs +13 -11
- package/persist-plugins/indexeddb-preloader.mjs.map +1 -1
- package/persist-plugins/indexeddb.d.ts +3 -2
- package/persist-plugins/indexeddb.js +87 -57
- package/persist-plugins/indexeddb.js.map +1 -1
- package/persist-plugins/indexeddb.mjs +88 -58
- package/persist-plugins/indexeddb.mjs.map +1 -1
- package/persist-plugins/local-storage.d.ts +4 -3
- package/persist-plugins/local-storage.js +18 -8
- package/persist-plugins/local-storage.js.map +1 -1
- package/persist-plugins/local-storage.mjs +18 -8
- package/persist-plugins/local-storage.mjs.map +1 -1
- package/persist-plugins/mmkv.d.ts +3 -2
- package/persist-plugins/mmkv.js +27 -18
- package/persist-plugins/mmkv.js.map +1 -1
- package/persist-plugins/mmkv.mjs +27 -18
- package/persist-plugins/mmkv.mjs.map +1 -1
- package/persist.d.ts +3 -2
- package/persist.js +274 -112
- package/persist.js.map +1 -1
- package/persist.mjs +274 -113
- package/persist.mjs.map +1 -1
- package/react-hooks/usePersistedObservable.js.map +1 -1
- package/react-hooks/usePersistedObservable.mjs.map +1 -1
- package/react.js +1 -1
- package/react.js.map +1 -1
- package/react.mjs +2 -2
- package/react.mjs.map +1 -1
- package/src/batching.d.ts +2 -9
- package/src/helpers.d.ts +4 -4
- package/src/notify.d.ts +1 -1
- package/src/observableInterfaces.d.ts +56 -17
- package/src/onChange.d.ts +4 -1
- package/src/persist/fieldTransformer.d.ts +8 -3
- package/src/persist/persistHelpers.d.ts +2 -0
- package/src/persist/persistObservable.d.ts +7 -3
- package/src/persist-plugins/indexeddb.d.ts +3 -2
- package/src/persist-plugins/local-storage.d.ts +4 -3
- package/src/persist-plugins/mmkv.d.ts +3 -2
- package/trace.js.map +1 -1
- package/trace.mjs.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
## 1.0 RC.0
|
|
2
|
+
|
|
3
|
+
- Breaking: `onChange` function changed to take an options object as a second parameter with a new `initial` option that makes it fire immediately with the current value.
|
|
4
|
+
- Breaking: `onChange` callback receives an object parameter instead of many arguments. This adds more flexibility for callers who care about different values in the change object.
|
|
5
|
+
- Fix: `mergeIntoObservable` was not working correctly in some edge cases.
|
|
6
|
+
- Fix: IndexedDB persistence improved for many edge cases, with some fixes and performance improvements
|
|
7
|
+
- Fix: Persistence layers overall improved with more stability and better performance
|
|
8
|
+
|
|
9
|
+
## 0.23.1
|
|
10
|
+
|
|
11
|
+
- Fix: Not notifying on change of dates
|
|
12
|
+
|
|
1
13
|
## 0.23.0
|
|
2
14
|
|
|
3
15
|
- Breaking: Improved the criteria of when to notify up parents for changes on objects to run only when something inside it has changed, so setting/assigning the same object onto itself will not notify. It's unlikely but possible that may be a breaking change for you if you depended on things re-computing/re-rendering even if nothing changed.
|
package/README.md
CHANGED
|
@@ -106,6 +106,10 @@ const Component = observer(function Component() {
|
|
|
106
106
|
|
|
107
107
|
See [the documentation site](https://www.legendapp.com/open-source/state/).
|
|
108
108
|
|
|
109
|
+
## Community
|
|
110
|
+
|
|
111
|
+
Join us on [Slack](https://join.slack.com/t/legendappcommunity/shared_invite/zt-1mfjknpna-vUL2s1qOuNeZL12~t2RruQ) to get involved with the Legend community.
|
|
112
|
+
|
|
109
113
|
## Road to 1.0
|
|
110
114
|
|
|
111
115
|
- [ ] Improve documentation
|
package/helpers/pageHash.js
CHANGED
|
@@ -11,7 +11,7 @@ const pageHash = state.observable(hasWindow ? window.location.hash.slice(1) : ''
|
|
|
11
11
|
if (hasWindow) {
|
|
12
12
|
let isSetting = false;
|
|
13
13
|
// Set the page hash when the observable changes
|
|
14
|
-
pageHash.onChange((value) => {
|
|
14
|
+
pageHash.onChange(({ value }) => {
|
|
15
15
|
if (!isSetting) {
|
|
16
16
|
const hash = '#' + value;
|
|
17
17
|
const setter = (_options === null || _options === void 0 ? void 0 : _options.setter) || 'hash';
|
package/helpers/pageHash.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pageHash.js","sources":["../../../../src/helpers/pageHash.ts"],"sourcesContent":[null],"names":["observable"],"mappings":";;;;AAKA,IAAI,QAAQ,GAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAE3C,SAAS,iBAAiB,CAAC,OAAgB,EAAA;IACvC,QAAQ,GAAG,OAAO,CAAC;AACvB,CAAC;AAED,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC;AAC1C,MAAA,QAAQ,GAAuBA,gBAAU,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE;AAEhG,IAAI,SAAS,EAAE;IACX,IAAI,SAAS,GAAG,KAAK,CAAC;;
|
|
1
|
+
{"version":3,"file":"pageHash.js","sources":["../../../../src/helpers/pageHash.ts"],"sourcesContent":[null],"names":["observable"],"mappings":";;;;AAKA,IAAI,QAAQ,GAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAE3C,SAAS,iBAAiB,CAAC,OAAgB,EAAA;IACvC,QAAQ,GAAG,OAAO,CAAC;AACvB,CAAC;AAED,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC;AAC1C,MAAA,QAAQ,GAAuBA,gBAAU,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE;AAEhG,IAAI,SAAS,EAAE;IACX,IAAI,SAAS,GAAG,KAAK,CAAC;;IAEtB,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,KAAI;QAC5B,IAAI,CAAC,SAAS,EAAE;AACZ,YAAA,MAAM,IAAI,GAAG,GAAG,GAAG,KAAK,CAAC;AACzB,YAAA,MAAM,MAAM,GAAG,CAAA,QAAQ,KAAR,IAAA,IAAA,QAAQ,KAAR,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,QAAQ,CAAE,MAAM,KAAI,MAAM,CAAC;YAC1C,IAAI,MAAM,KAAK,WAAW,EAAE;gBACxB,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACvC,aAAA;iBAAM,IAAI,MAAM,KAAK,cAAc,EAAE;gBAClC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC1C,aAAA;AAAM,iBAAA;AACH,gBAAA,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;AACxB,aAAA;AACJ,SAAA;AACL,KAAC,CAAC,CAAC;;IAEH,MAAM,EAAE,GAAG,MAAK;QACZ,SAAS,GAAG,IAAI,CAAC;AACjB,QAAA,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,SAAS,GAAG,KAAK,CAAC;AACtB,KAAC,CAAC;;AAEF,IAAA,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AAC7C;;;;;"}
|
package/helpers/pageHash.mjs
CHANGED
|
@@ -9,7 +9,7 @@ const pageHash = observable(hasWindow ? window.location.hash.slice(1) : '');
|
|
|
9
9
|
if (hasWindow) {
|
|
10
10
|
let isSetting = false;
|
|
11
11
|
// Set the page hash when the observable changes
|
|
12
|
-
pageHash.onChange((value) => {
|
|
12
|
+
pageHash.onChange(({ value }) => {
|
|
13
13
|
if (!isSetting) {
|
|
14
14
|
const hash = '#' + value;
|
|
15
15
|
const setter = (_options === null || _options === void 0 ? void 0 : _options.setter) || 'hash';
|
package/helpers/pageHash.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pageHash.mjs","sources":["../../../../src/helpers/pageHash.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAKA,IAAI,QAAQ,GAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAE3C,SAAS,iBAAiB,CAAC,OAAgB,EAAA;IACvC,QAAQ,GAAG,OAAO,CAAC;AACvB,CAAC;AAED,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC;AAC1C,MAAA,QAAQ,GAAuB,UAAU,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE;AAEhG,IAAI,SAAS,EAAE;IACX,IAAI,SAAS,GAAG,KAAK,CAAC;;
|
|
1
|
+
{"version":3,"file":"pageHash.mjs","sources":["../../../../src/helpers/pageHash.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAKA,IAAI,QAAQ,GAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAE3C,SAAS,iBAAiB,CAAC,OAAgB,EAAA;IACvC,QAAQ,GAAG,OAAO,CAAC;AACvB,CAAC;AAED,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC;AAC1C,MAAA,QAAQ,GAAuB,UAAU,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE;AAEhG,IAAI,SAAS,EAAE;IACX,IAAI,SAAS,GAAG,KAAK,CAAC;;IAEtB,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,KAAI;QAC5B,IAAI,CAAC,SAAS,EAAE;AACZ,YAAA,MAAM,IAAI,GAAG,GAAG,GAAG,KAAK,CAAC;AACzB,YAAA,MAAM,MAAM,GAAG,CAAA,QAAQ,KAAR,IAAA,IAAA,QAAQ,KAAR,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,QAAQ,CAAE,MAAM,KAAI,MAAM,CAAC;YAC1C,IAAI,MAAM,KAAK,WAAW,EAAE;gBACxB,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACvC,aAAA;iBAAM,IAAI,MAAM,KAAK,cAAc,EAAE;gBAClC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC1C,aAAA;AAAM,iBAAA;AACH,gBAAA,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;AACxB,aAAA;AACJ,SAAA;AACL,KAAC,CAAC,CAAC;;IAEH,MAAM,EAAE,GAAG,MAAK;QACZ,SAAS,GAAG,IAAI,CAAC;AACjB,QAAA,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,SAAS,GAAG,KAAK,CAAC;AACtB,KAAC,CAAC;;AAEF,IAAA,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AAC7C;;;;"}
|
|
@@ -22,7 +22,7 @@ const pageHashParams = state.observable(hasWindow ? toParams(window.location.has
|
|
|
22
22
|
if (hasWindow) {
|
|
23
23
|
let isSetting = false;
|
|
24
24
|
// Set the page hash when the observable changes
|
|
25
|
-
pageHashParams.onChange((value) => {
|
|
25
|
+
pageHashParams.onChange(({ value }) => {
|
|
26
26
|
if (!isSetting) {
|
|
27
27
|
const hash = '#' + toString(value);
|
|
28
28
|
const setter = (_options === null || _options === void 0 ? void 0 : _options.setter) || 'hash';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pageHashParams.js","sources":["../../../../src/helpers/pageHashParams.ts"],"sourcesContent":[null],"names":["observable"],"mappings":";;;;AAKA,IAAI,QAAQ,GAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAE3C,SAAS,uBAAuB,CAAC,OAAgB,EAAA;IAC7C,QAAQ,GAAG,OAAO,CAAC;AACvB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAA;IACzB,MAAM,GAAG,GAA2B,EAAE,CAAC;AACvC,IAAA,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,YAAY,EAAE;AACrC,QAAA,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AACpB,KAAA;AACD,IAAA,OAAO,GAAG,CAAC;AACf,CAAC;AACD,SAAS,QAAQ,CAAC,MAA8B,EAAA;IAC5C,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC;AAC1C,MAAA,cAAc,GAAuCA,gBAAU,CACjE,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAC1D;AAEF,IAAI,SAAS,EAAE;IACX,IAAI,SAAS,GAAG,KAAK,CAAC;;
|
|
1
|
+
{"version":3,"file":"pageHashParams.js","sources":["../../../../src/helpers/pageHashParams.ts"],"sourcesContent":[null],"names":["observable"],"mappings":";;;;AAKA,IAAI,QAAQ,GAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAE3C,SAAS,uBAAuB,CAAC,OAAgB,EAAA;IAC7C,QAAQ,GAAG,OAAO,CAAC;AACvB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAA;IACzB,MAAM,GAAG,GAA2B,EAAE,CAAC;AACvC,IAAA,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,YAAY,EAAE;AACrC,QAAA,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AACpB,KAAA;AACD,IAAA,OAAO,GAAG,CAAC;AACf,CAAC;AACD,SAAS,QAAQ,CAAC,MAA8B,EAAA;IAC5C,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC;AAC1C,MAAA,cAAc,GAAuCA,gBAAU,CACjE,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAC1D;AAEF,IAAI,SAAS,EAAE;IACX,IAAI,SAAS,GAAG,KAAK,CAAC;;IAEtB,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,KAAI;QAClC,IAAI,CAAC,SAAS,EAAE;YACZ,MAAM,IAAI,GAAG,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AACnC,YAAA,MAAM,MAAM,GAAG,CAAA,QAAQ,KAAR,IAAA,IAAA,QAAQ,KAAR,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,QAAQ,CAAE,MAAM,KAAI,MAAM,CAAC;YAC1C,IAAI,MAAM,KAAK,WAAW,EAAE;gBACxB,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACvC,aAAA;iBAAM,IAAI,MAAM,KAAK,cAAc,EAAE;gBAClC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC1C,aAAA;AAAM,iBAAA;AACH,gBAAA,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;AACxB,aAAA;AACJ,SAAA;AACL,KAAC,CAAC,CAAC;;IAEH,MAAM,EAAE,GAAG,MAAK;QACZ,SAAS,GAAG,IAAI,CAAC;AACjB,QAAA,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,SAAS,GAAG,KAAK,CAAC;AACtB,KAAC,CAAC;;AAEF,IAAA,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AAC7C;;;;;"}
|
|
@@ -20,7 +20,7 @@ const pageHashParams = observable(hasWindow ? toParams(window.location.hash.slic
|
|
|
20
20
|
if (hasWindow) {
|
|
21
21
|
let isSetting = false;
|
|
22
22
|
// Set the page hash when the observable changes
|
|
23
|
-
pageHashParams.onChange((value) => {
|
|
23
|
+
pageHashParams.onChange(({ value }) => {
|
|
24
24
|
if (!isSetting) {
|
|
25
25
|
const hash = '#' + toString(value);
|
|
26
26
|
const setter = (_options === null || _options === void 0 ? void 0 : _options.setter) || 'hash';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pageHashParams.mjs","sources":["../../../../src/helpers/pageHashParams.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAKA,IAAI,QAAQ,GAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAE3C,SAAS,uBAAuB,CAAC,OAAgB,EAAA;IAC7C,QAAQ,GAAG,OAAO,CAAC;AACvB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAA;IACzB,MAAM,GAAG,GAA2B,EAAE,CAAC;AACvC,IAAA,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,YAAY,EAAE;AACrC,QAAA,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AACpB,KAAA;AACD,IAAA,OAAO,GAAG,CAAC;AACf,CAAC;AACD,SAAS,QAAQ,CAAC,MAA8B,EAAA;IAC5C,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC;AAC1C,MAAA,cAAc,GAAuC,UAAU,CACjE,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAC1D;AAEF,IAAI,SAAS,EAAE;IACX,IAAI,SAAS,GAAG,KAAK,CAAC;;
|
|
1
|
+
{"version":3,"file":"pageHashParams.mjs","sources":["../../../../src/helpers/pageHashParams.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAKA,IAAI,QAAQ,GAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAE3C,SAAS,uBAAuB,CAAC,OAAgB,EAAA;IAC7C,QAAQ,GAAG,OAAO,CAAC;AACvB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAA;IACzB,MAAM,GAAG,GAA2B,EAAE,CAAC;AACvC,IAAA,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,YAAY,EAAE;AACrC,QAAA,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AACpB,KAAA;AACD,IAAA,OAAO,GAAG,CAAC;AACf,CAAC;AACD,SAAS,QAAQ,CAAC,MAA8B,EAAA;IAC5C,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC;AAC1C,MAAA,cAAc,GAAuC,UAAU,CACjE,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAC1D;AAEF,IAAI,SAAS,EAAE;IACX,IAAI,SAAS,GAAG,KAAK,CAAC;;IAEtB,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,KAAI;QAClC,IAAI,CAAC,SAAS,EAAE;YACZ,MAAM,IAAI,GAAG,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AACnC,YAAA,MAAM,MAAM,GAAG,CAAA,QAAQ,KAAR,IAAA,IAAA,QAAQ,KAAR,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,QAAQ,CAAE,MAAM,KAAI,MAAM,CAAC;YAC1C,IAAI,MAAM,KAAK,WAAW,EAAE;gBACxB,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACvC,aAAA;iBAAM,IAAI,MAAM,KAAK,cAAc,EAAE;gBAClC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC1C,aAAA;AAAM,iBAAA;AACH,gBAAA,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;AACxB,aAAA;AACJ,SAAA;AACL,KAAC,CAAC,CAAC;;IAEH,MAAM,EAAE,GAAG,MAAK;QACZ,SAAS,GAAG,IAAI,CAAC;AACjB,QAAA,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,SAAS,GAAG,KAAK,CAAC;AACtB,KAAC,CAAC;;AAEF,IAAA,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AAC7C;;;;"}
|
package/history.js
CHANGED
|
@@ -4,17 +4,17 @@ var state = require('@legendapp/state');
|
|
|
4
4
|
|
|
5
5
|
function trackHistory(obs, targetObservable) {
|
|
6
6
|
const history = targetObservable !== null && targetObservable !== void 0 ? targetObservable : state.observable();
|
|
7
|
-
obs.onChange((
|
|
7
|
+
obs.onChange(({ changes }) => {
|
|
8
8
|
// Don't save history if this is a remote change.
|
|
9
9
|
// History will be saved remotely by the client making the local change.
|
|
10
10
|
if (!state.tracking.inRemoteChange) {
|
|
11
11
|
const time = Date.now().toString();
|
|
12
12
|
// Save to history observable by date, with the previous value
|
|
13
13
|
for (let i = 0; i < changes.length; i++) {
|
|
14
|
-
const { path, prevAtPath } = changes[i];
|
|
14
|
+
const { path, prevAtPath, pathTypes } = changes[i];
|
|
15
15
|
if (path[path.length - 1] === state.symbolDateModified)
|
|
16
16
|
continue;
|
|
17
|
-
const obj = state.
|
|
17
|
+
const obj = state.constructObjectWithPath(path, prevAtPath, pathTypes);
|
|
18
18
|
state.mergeIntoObservable(history[time], obj);
|
|
19
19
|
}
|
|
20
20
|
}
|
package/history.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.js","sources":["../../src/history/trackHistory.ts"],"sourcesContent":[null],"names":["observable","tracking","symbolDateModified","
|
|
1
|
+
{"version":3,"file":"history.js","sources":["../../src/history/trackHistory.ts"],"sourcesContent":[null],"names":["observable","tracking","symbolDateModified","constructObjectWithPath","mergeIntoObservable"],"mappings":";;;;AAagB,SAAA,YAAY,CACxB,GAA0B,EAC1B,gBAA6E,EAAA;IAE7E,MAAM,OAAO,GAAG,gBAAgB,KAAhB,IAAA,IAAA,gBAAgB,cAAhB,gBAAgB,GAAIA,gBAAU,EAAyC,CAAC;IAExF,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,KAAI;;;AAGzB,QAAA,IAAI,CAACC,cAAQ,CAAC,cAAc,EAAE;YAC1B,MAAM,IAAI,GAAsB,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;;AAGtD,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,gBAAA,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACnD,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAMC,wBAA0B;oBAAE,SAAS;gBAEpE,MAAM,GAAG,GAAGC,6BAAuB,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;gBACjEC,yBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3C,aAAA;AACJ,SAAA;AACL,KAAC,CAAC,CAAC;AAEH,IAAA,OAAO,OAAO,CAAC;AACnB;;;;"}
|
package/history.mjs
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { observable, tracking, symbolDateModified,
|
|
1
|
+
import { observable, tracking, symbolDateModified, constructObjectWithPath, mergeIntoObservable } from '@legendapp/state';
|
|
2
2
|
|
|
3
3
|
function trackHistory(obs, targetObservable) {
|
|
4
4
|
const history = targetObservable !== null && targetObservable !== void 0 ? targetObservable : observable();
|
|
5
|
-
obs.onChange((
|
|
5
|
+
obs.onChange(({ changes }) => {
|
|
6
6
|
// Don't save history if this is a remote change.
|
|
7
7
|
// History will be saved remotely by the client making the local change.
|
|
8
8
|
if (!tracking.inRemoteChange) {
|
|
9
9
|
const time = Date.now().toString();
|
|
10
10
|
// Save to history observable by date, with the previous value
|
|
11
11
|
for (let i = 0; i < changes.length; i++) {
|
|
12
|
-
const { path, prevAtPath } = changes[i];
|
|
12
|
+
const { path, prevAtPath, pathTypes } = changes[i];
|
|
13
13
|
if (path[path.length - 1] === symbolDateModified)
|
|
14
14
|
continue;
|
|
15
|
-
const obj =
|
|
15
|
+
const obj = constructObjectWithPath(path, prevAtPath, pathTypes);
|
|
16
16
|
mergeIntoObservable(history[time], obj);
|
|
17
17
|
}
|
|
18
18
|
}
|
package/history.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.mjs","sources":["../../src/history/trackHistory.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAagB,SAAA,YAAY,CACxB,GAA0B,EAC1B,gBAA6E,EAAA;IAE7E,MAAM,OAAO,GAAG,gBAAgB,KAAhB,IAAA,IAAA,gBAAgB,cAAhB,gBAAgB,GAAI,UAAU,EAAyC,CAAC;IAExF,GAAG,CAAC,QAAQ,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"history.mjs","sources":["../../src/history/trackHistory.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAagB,SAAA,YAAY,CACxB,GAA0B,EAC1B,gBAA6E,EAAA;IAE7E,MAAM,OAAO,GAAG,gBAAgB,KAAhB,IAAA,IAAA,gBAAgB,cAAhB,gBAAgB,GAAI,UAAU,EAAyC,CAAC;IAExF,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,KAAI;;;AAGzB,QAAA,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE;YAC1B,MAAM,IAAI,GAAsB,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;;AAGtD,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,gBAAA,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACnD,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAM,kBAA0B;oBAAE,SAAS;gBAEpE,MAAM,GAAG,GAAG,uBAAuB,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;gBACjE,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3C,aAAA;AACJ,SAAA;AACL,KAAC,CAAC,CAAC;AAEH,IAAA,OAAO,OAAO,CAAC;AACnB;;;;"}
|
package/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { opaqueObject, isObservable, mergeIntoObservable, getObservableIndex, computeSelector } from './src/helpers';
|
|
1
|
+
export { opaqueObject, isObservable, mergeIntoObservable, getObservableIndex, computeSelector, constructObjectWithPath, deconstructObjectWithPath, setAtPath } from './src/helpers';
|
|
2
2
|
export { observable, observablePrimitive } from './src/observable';
|
|
3
3
|
export { batch, beginBatch, endBatch } from './src/batching';
|
|
4
4
|
export { computed } from './src/computed';
|
|
@@ -6,5 +6,5 @@ export { event } from './src/event';
|
|
|
6
6
|
export { observe } from './src/observe';
|
|
7
7
|
export { when } from './src/when';
|
|
8
8
|
export * from './src/observableInterfaces';
|
|
9
|
-
export { isEmpty, isArray, isBoolean, isFunction, isObject, isPrimitive, isPromise, isString, isSymbol } from './src/is';
|
|
9
|
+
export { isEmpty, isArray, isBoolean, isFunction, isObject, isPrimitive, isPromise, isString, isSymbol, } from './src/is';
|
|
10
10
|
export { lockObservable } from './src/helpers';
|
package/index.js
CHANGED
|
@@ -130,6 +130,7 @@ function getChildNode(node, key) {
|
|
|
130
130
|
if (isString(key)) {
|
|
131
131
|
const n = +key;
|
|
132
132
|
// Convert to number if it's a string representing a valid number
|
|
133
|
+
// This is faster than isNaN
|
|
133
134
|
if (n - n < 1)
|
|
134
135
|
key = n;
|
|
135
136
|
}
|
|
@@ -197,51 +198,78 @@ function lockObservable(obs, value) {
|
|
|
197
198
|
root.locked = value;
|
|
198
199
|
}
|
|
199
200
|
}
|
|
201
|
+
function setAtPath(obs, path, value, mode) {
|
|
202
|
+
let o = obs;
|
|
203
|
+
let v = value;
|
|
204
|
+
for (let i = 0; i < path.length; i++) {
|
|
205
|
+
const p = path[i];
|
|
206
|
+
o = obs[p];
|
|
207
|
+
v = value[p];
|
|
208
|
+
}
|
|
209
|
+
if (v === symbolDelete) {
|
|
210
|
+
o.delete();
|
|
211
|
+
}
|
|
212
|
+
// Assign if possible, or set otherwise
|
|
213
|
+
else if (mode === 'assign' && o.assign) {
|
|
214
|
+
o.assign(v);
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
o.set(v);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
200
220
|
function mergeIntoObservable(target, ...sources) {
|
|
201
|
-
var _a
|
|
221
|
+
var _a;
|
|
202
222
|
if (!sources.length)
|
|
203
223
|
return target;
|
|
204
224
|
const source = sources.shift();
|
|
205
225
|
const needsSet = isObservable(target);
|
|
206
|
-
|
|
207
|
-
const isTargetObj = isObject(targetValue);
|
|
226
|
+
let targetValue = needsSet ? target.peek() : target;
|
|
208
227
|
const isTargetArr = isArray(targetValue);
|
|
228
|
+
const isTargetObj = !isTargetArr && isObject(targetValue);
|
|
209
229
|
if ((isTargetObj && isObject(source)) || (isTargetArr && isArray(source))) {
|
|
210
230
|
const keys = isTargetArr ? source : Object.keys(source);
|
|
211
|
-
|
|
212
|
-
keys.push(symbolDateModified);
|
|
213
|
-
}
|
|
231
|
+
let dateModified = source[symbolDateModified];
|
|
214
232
|
for (let i = 0; i < keys.length; i++) {
|
|
215
233
|
const key = isTargetArr ? i : keys[i];
|
|
216
234
|
const sourceValue = source[key];
|
|
217
|
-
if (
|
|
218
|
-
|
|
235
|
+
if (sourceValue === symbolDelete) {
|
|
236
|
+
needsSet && ((_a = target[key]) === null || _a === void 0 ? void 0 : _a.delete) ? target[key].delete() : delete target[key];
|
|
237
|
+
}
|
|
238
|
+
else if (isObject(sourceValue)) {
|
|
239
|
+
if (!needsSet && (!target[key] || !isObject(target[key]))) {
|
|
219
240
|
target[key] = {};
|
|
220
241
|
}
|
|
221
242
|
mergeIntoObservable(target[key], sourceValue);
|
|
243
|
+
dateModified = Math.max(dateModified || 0, sourceValue[symbolDateModified] || 0);
|
|
222
244
|
}
|
|
223
|
-
else if (sourceValue
|
|
224
|
-
needsSet && (
|
|
245
|
+
else if (isArray(sourceValue)) {
|
|
246
|
+
if (!needsSet && (!target[key] || !isArray(target[key]))) {
|
|
247
|
+
target[key] = [];
|
|
248
|
+
}
|
|
249
|
+
mergeIntoObservable(target[key], sourceValue);
|
|
225
250
|
}
|
|
226
251
|
else {
|
|
227
|
-
needsSet
|
|
228
|
-
? target[key].set(sourceValue)
|
|
229
|
-
: (target[key] = sourceValue);
|
|
252
|
+
needsSet ? target[key].set(sourceValue) : (target[key] = sourceValue);
|
|
230
253
|
}
|
|
231
254
|
}
|
|
255
|
+
if (dateModified) {
|
|
256
|
+
needsSet
|
|
257
|
+
? target[symbolDateModified].set(dateModified)
|
|
258
|
+
: (target[symbolDateModified] = dateModified);
|
|
259
|
+
}
|
|
232
260
|
}
|
|
233
|
-
else
|
|
234
|
-
target.set(source);
|
|
261
|
+
else {
|
|
262
|
+
needsSet ? target.set(source) : (target = source);
|
|
235
263
|
}
|
|
236
|
-
return mergeIntoObservable(target, ...sources);
|
|
264
|
+
return sources.length ? mergeIntoObservable(target, ...sources) : target;
|
|
237
265
|
}
|
|
238
|
-
function
|
|
266
|
+
function constructObjectWithPath(path, value, pathTypes) {
|
|
239
267
|
let out;
|
|
240
268
|
if (path.length > 0) {
|
|
241
269
|
let o = (out = {});
|
|
242
270
|
for (let i = 0; i < path.length; i++) {
|
|
243
271
|
const p = path[i];
|
|
244
|
-
o[p] = i === path.length - 1 ? value : {};
|
|
272
|
+
o[p] = i === path.length - 1 ? value : pathTypes[i] === 'array' ? [] : {};
|
|
245
273
|
o = o[p];
|
|
246
274
|
}
|
|
247
275
|
}
|
|
@@ -250,7 +278,7 @@ function constructObject(path, value) {
|
|
|
250
278
|
}
|
|
251
279
|
return out;
|
|
252
280
|
}
|
|
253
|
-
function
|
|
281
|
+
function deconstructObjectWithPath(path, value) {
|
|
254
282
|
let o = value;
|
|
255
283
|
for (let i = 0; i < path.length; i++) {
|
|
256
284
|
const p = path[i];
|
|
@@ -258,9 +286,6 @@ function deconstructObject(path, value) {
|
|
|
258
286
|
}
|
|
259
287
|
return o;
|
|
260
288
|
}
|
|
261
|
-
function clone(obj) {
|
|
262
|
-
return JSON.parse(JSON.stringify(obj));
|
|
263
|
-
}
|
|
264
289
|
|
|
265
290
|
let timeout;
|
|
266
291
|
let numInBatch = 0;
|
|
@@ -284,8 +309,9 @@ function batchNotify(b) {
|
|
|
284
309
|
// If this callback already exists, make sure it has the latest value but do not add it
|
|
285
310
|
if (existing) {
|
|
286
311
|
if (!isFunc) {
|
|
287
|
-
|
|
288
|
-
|
|
312
|
+
const params = existing.params;
|
|
313
|
+
params.value = b.params.value;
|
|
314
|
+
params.changes.push(...b.params.changes);
|
|
289
315
|
}
|
|
290
316
|
}
|
|
291
317
|
else {
|
|
@@ -294,7 +320,7 @@ function batchNotify(b) {
|
|
|
294
320
|
}
|
|
295
321
|
}
|
|
296
322
|
else {
|
|
297
|
-
isFunc ? b() : b.cb(b.
|
|
323
|
+
isFunc ? b() : b.cb(b.params);
|
|
298
324
|
}
|
|
299
325
|
}
|
|
300
326
|
function batch(fn) {
|
|
@@ -326,8 +352,8 @@ function endBatch(force) {
|
|
|
326
352
|
b();
|
|
327
353
|
}
|
|
328
354
|
else {
|
|
329
|
-
const { cb
|
|
330
|
-
cb(
|
|
355
|
+
const { cb } = b;
|
|
356
|
+
cb(b.params);
|
|
331
357
|
}
|
|
332
358
|
}
|
|
333
359
|
}
|
|
@@ -351,7 +377,7 @@ function createPreviousHandler(value, path, prevAtPath) {
|
|
|
351
377
|
return clone;
|
|
352
378
|
};
|
|
353
379
|
}
|
|
354
|
-
function doNotify(node, value, path, valueAtPath, prevAtPath, level, whenOptimizedOnlyIf) {
|
|
380
|
+
function doNotify(node, value, path, pathTypes, valueAtPath, prevAtPath, level, whenOptimizedOnlyIf) {
|
|
355
381
|
const listeners = node.listeners;
|
|
356
382
|
if (listeners) {
|
|
357
383
|
let getPrevious;
|
|
@@ -359,7 +385,11 @@ function doNotify(node, value, path, valueAtPath, prevAtPath, level, whenOptimiz
|
|
|
359
385
|
for (let i = 0; i < arr.length; i++) {
|
|
360
386
|
const listenerFn = arr[i];
|
|
361
387
|
const { track, noArgs } = listenerFn;
|
|
362
|
-
const ok = track === true
|
|
388
|
+
const ok = track === true || track === 'shallow'
|
|
389
|
+
? level <= 0
|
|
390
|
+
: track === 'optimize'
|
|
391
|
+
? whenOptimizedOnlyIf && level <= 0
|
|
392
|
+
: true;
|
|
363
393
|
// Notify if listener is not shallow or if this is the first level
|
|
364
394
|
if (ok) {
|
|
365
395
|
// Create a function to get the previous data. Computing a clone of previous data can be expensive if doing
|
|
@@ -371,45 +401,51 @@ function doNotify(node, value, path, valueAtPath, prevAtPath, level, whenOptimiz
|
|
|
371
401
|
? listenerFn.listener
|
|
372
402
|
: {
|
|
373
403
|
cb: listenerFn.listener,
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
404
|
+
params: {
|
|
405
|
+
value,
|
|
406
|
+
getPrevious,
|
|
407
|
+
changes: [
|
|
408
|
+
{
|
|
409
|
+
path,
|
|
410
|
+
pathTypes,
|
|
411
|
+
valueAtPath,
|
|
412
|
+
prevAtPath,
|
|
413
|
+
},
|
|
414
|
+
],
|
|
415
|
+
},
|
|
384
416
|
});
|
|
385
417
|
}
|
|
386
418
|
}
|
|
387
419
|
}
|
|
388
420
|
}
|
|
389
|
-
function _notifyParents(node, value, path, valueAtPath, prevAtPath, level, whenOptimizedOnlyIf) {
|
|
421
|
+
function _notifyParents(node, value, path, pathTypes, valueAtPath, prevAtPath, level, whenOptimizedOnlyIf) {
|
|
390
422
|
// Do the notify
|
|
391
|
-
doNotify(node, value, path, valueAtPath, prevAtPath, level, whenOptimizedOnlyIf);
|
|
423
|
+
doNotify(node, value, path, pathTypes, valueAtPath, prevAtPath, level, whenOptimizedOnlyIf);
|
|
392
424
|
// If not root notify up through parents
|
|
393
425
|
if (node.parent) {
|
|
394
426
|
const parent = node.parent;
|
|
395
427
|
if (parent) {
|
|
396
428
|
const parentValue = getNodeValue(parent);
|
|
397
|
-
_notifyParents(parent, parentValue, [node.key].concat(path), valueAtPath, prevAtPath, level + 1, whenOptimizedOnlyIf);
|
|
429
|
+
_notifyParents(parent, parentValue, [node.key].concat(path), [(isArray(value) ? 'array' : 'object')].concat(pathTypes), valueAtPath, prevAtPath, level + 1, whenOptimizedOnlyIf);
|
|
398
430
|
}
|
|
399
431
|
}
|
|
400
432
|
}
|
|
401
433
|
function notify(node, value, prev, level, whenOptimizedOnlyIf) {
|
|
402
434
|
// Notify self and up through parents
|
|
403
|
-
_notifyParents(node, value, [], value, prev, level, whenOptimizedOnlyIf);
|
|
435
|
+
_notifyParents(node, value, [], [], value, prev, level, whenOptimizedOnlyIf);
|
|
404
436
|
}
|
|
405
437
|
|
|
406
|
-
function onChange(node, callback,
|
|
438
|
+
function onChange(node, callback, options, noArgs) {
|
|
407
439
|
let listeners = node.listeners;
|
|
408
440
|
if (!listeners) {
|
|
409
441
|
node.listeners = listeners = new Set();
|
|
410
442
|
}
|
|
411
|
-
const listener = { listener: callback, track:
|
|
443
|
+
const listener = { listener: callback, track: options === null || options === void 0 ? void 0 : options.trackingType, noArgs };
|
|
412
444
|
listeners.add(listener);
|
|
445
|
+
if (options === null || options === void 0 ? void 0 : options.initial) {
|
|
446
|
+
const value = getNodeValue(node);
|
|
447
|
+
doNotify(node, value, [], [], value, value, 0);
|
|
448
|
+
}
|
|
413
449
|
return () => listeners.delete(listener);
|
|
414
450
|
}
|
|
415
451
|
|
|
@@ -459,7 +495,7 @@ ObservablePrimitiveClass.prototype.set = function (value) {
|
|
|
459
495
|
const root = this._node.root;
|
|
460
496
|
const prev = root._;
|
|
461
497
|
root._ = value;
|
|
462
|
-
doNotify(this._node, value, [], value, prev, 0);
|
|
498
|
+
doNotify(this._node, value, [], [], value, prev, 0);
|
|
463
499
|
return this;
|
|
464
500
|
};
|
|
465
501
|
ObservablePrimitiveClass.prototype.toggle = function () {
|
|
@@ -473,8 +509,8 @@ ObservablePrimitiveClass.prototype.toggle = function () {
|
|
|
473
509
|
return !value;
|
|
474
510
|
};
|
|
475
511
|
// Listener
|
|
476
|
-
ObservablePrimitiveClass.prototype.onChange = function (cb,
|
|
477
|
-
return onChange(this._node, cb,
|
|
512
|
+
ObservablePrimitiveClass.prototype.onChange = function (cb, options, noArgs) {
|
|
513
|
+
return onChange(this._node, cb, options, noArgs);
|
|
478
514
|
};
|
|
479
515
|
|
|
480
516
|
let inSet = false;
|
|
@@ -492,7 +528,6 @@ const ArrayModifiers = new Set([
|
|
|
492
528
|
'unshift',
|
|
493
529
|
]);
|
|
494
530
|
const ArrayLoopers = new Set(['every', 'some', 'filter', 'forEach', 'map', 'join']);
|
|
495
|
-
const NotifySpecifically = new Set([symbolDateModified]);
|
|
496
531
|
const objectFns = new Map([
|
|
497
532
|
['get', get],
|
|
498
533
|
['set', set],
|
|
@@ -519,11 +554,11 @@ function collectionSetter(node, target, prop, ...args) {
|
|
|
519
554
|
return ret;
|
|
520
555
|
}
|
|
521
556
|
function updateNodes(parent, obj, prevValue) {
|
|
522
|
-
if (isObject(obj) && obj[symbolOpaque]) {
|
|
557
|
+
if ((isObject(obj) && obj[symbolOpaque]) || (isObject(prevValue) && prevValue[symbolOpaque])) {
|
|
523
558
|
const isDiff = obj !== prevValue;
|
|
524
559
|
if (isDiff) {
|
|
525
560
|
if (parent.listeners) {
|
|
526
|
-
doNotify(parent, obj, [], obj, prevValue, 0);
|
|
561
|
+
doNotify(parent, obj, [], [], obj, prevValue, 0);
|
|
527
562
|
}
|
|
528
563
|
}
|
|
529
564
|
return isDiff;
|
|
@@ -573,7 +608,7 @@ function updateNodes(parent, obj, prevValue) {
|
|
|
573
608
|
updateNodes(child, undefined, prev);
|
|
574
609
|
}
|
|
575
610
|
if (child.listeners) {
|
|
576
|
-
doNotify(child, undefined, [], undefined, prev, 0);
|
|
611
|
+
doNotify(child, undefined, [], [], undefined, prev, 0);
|
|
577
612
|
}
|
|
578
613
|
}
|
|
579
614
|
}
|
|
@@ -619,10 +654,12 @@ function updateNodes(parent, obj, prevValue) {
|
|
|
619
654
|
}
|
|
620
655
|
if (isDiff) {
|
|
621
656
|
// Array has a new / modified element
|
|
622
|
-
hasADiff = true;
|
|
623
657
|
// If object iterate through its children
|
|
624
|
-
if (
|
|
625
|
-
|
|
658
|
+
if (isPrimitive(value)) {
|
|
659
|
+
hasADiff = true;
|
|
660
|
+
}
|
|
661
|
+
else {
|
|
662
|
+
hasADiff = hasADiff || updateNodes(child, value, prev);
|
|
626
663
|
}
|
|
627
664
|
}
|
|
628
665
|
if (isDiff || !isArrDiff) {
|
|
@@ -631,7 +668,7 @@ function updateNodes(parent, obj, prevValue) {
|
|
|
631
668
|
// But do not notify child if the parent is an array with changing length -
|
|
632
669
|
// the array's listener will cover it
|
|
633
670
|
if (child.listeners) {
|
|
634
|
-
doNotify(child, value, [], value, prev, 0, !isArrDiff);
|
|
671
|
+
doNotify(child, value, [], [], value, prev, 0, !isArrDiff);
|
|
635
672
|
}
|
|
636
673
|
}
|
|
637
674
|
}
|
|
@@ -683,7 +720,7 @@ const proxyHandler = {
|
|
|
683
720
|
return l > 2 ? fn(node, a, b, c) : l > 1 ? fn(node, a, b) : fn(node, a);
|
|
684
721
|
};
|
|
685
722
|
}
|
|
686
|
-
let value =
|
|
723
|
+
let value = peek(node);
|
|
687
724
|
const isValuePrimitive = isPrimitive(value);
|
|
688
725
|
if (value === undefined || value === null || isValuePrimitive) {
|
|
689
726
|
if (extraPrimitiveProps.size && (node.isActivatedPrimitive || extraPrimitiveActivators.has(p))) {
|
|
@@ -852,11 +889,7 @@ function setKey(node, key, newValue, level) {
|
|
|
852
889
|
whenOptimizedOnlyIf = (newValue === null || newValue === void 0 ? void 0 : newValue.length) !== (prevValue === null || prevValue === void 0 ? void 0 : prevValue.length);
|
|
853
890
|
}
|
|
854
891
|
}
|
|
855
|
-
if (
|
|
856
|
-
// Notify specifically at the child, not through children or parents
|
|
857
|
-
doNotify(childNode, newValue, [], newValue, prevValue, 0);
|
|
858
|
-
}
|
|
859
|
-
else if (isPrim ? newValue !== prevValue : hasADiff) {
|
|
892
|
+
if (isPrim ? newValue !== prevValue : hasADiff) {
|
|
860
893
|
// Notify for this element if something inside it has changed
|
|
861
894
|
notify(isPrim && isRoot ? node : childNode, newValue, prevValue, (level !== null && level !== void 0 ? level : prevValue === undefined) ? -1 : hasADiff ? 0 : 1, whenOptimizedOnlyIf);
|
|
862
895
|
}
|
|
@@ -924,7 +957,7 @@ function setupTracking(nodes, update, noArgs) {
|
|
|
924
957
|
if (nodes) {
|
|
925
958
|
for (let tracked of nodes.values()) {
|
|
926
959
|
const { node, track } = tracked;
|
|
927
|
-
listeners.push(onChange(node, update, track, noArgs));
|
|
960
|
+
listeners.push(onChange(node, update, { trackingType: track }, noArgs));
|
|
928
961
|
}
|
|
929
962
|
}
|
|
930
963
|
return () => {
|
|
@@ -1079,12 +1112,11 @@ exports.ObservablePrimitiveClass = ObservablePrimitiveClass;
|
|
|
1079
1112
|
exports.batch = batch;
|
|
1080
1113
|
exports.beginBatch = beginBatch;
|
|
1081
1114
|
exports.beginTracking = beginTracking;
|
|
1082
|
-
exports.clone = clone;
|
|
1083
1115
|
exports.computeSelector = computeSelector;
|
|
1084
1116
|
exports.computed = computed;
|
|
1085
|
-
exports.
|
|
1117
|
+
exports.constructObjectWithPath = constructObjectWithPath;
|
|
1086
1118
|
exports.dateModifiedKey = dateModifiedKey;
|
|
1087
|
-
exports.
|
|
1119
|
+
exports.deconstructObjectWithPath = deconstructObjectWithPath;
|
|
1088
1120
|
exports.endBatch = endBatch;
|
|
1089
1121
|
exports.endTracking = endTracking;
|
|
1090
1122
|
exports.event = event;
|
|
@@ -1109,11 +1141,11 @@ exports.observablePrimitive = observablePrimitive;
|
|
|
1109
1141
|
exports.observe = observe;
|
|
1110
1142
|
exports.onChange = onChange;
|
|
1111
1143
|
exports.opaqueObject = opaqueObject;
|
|
1144
|
+
exports.setAtPath = setAtPath;
|
|
1112
1145
|
exports.symbolDateModified = symbolDateModified;
|
|
1113
1146
|
exports.symbolDelete = symbolDelete;
|
|
1114
1147
|
exports.symbolIsEvent = symbolIsEvent;
|
|
1115
1148
|
exports.symbolIsObservable = symbolIsObservable;
|
|
1116
|
-
exports.symbolUndef = symbolUndef;
|
|
1117
1149
|
exports.tracking = tracking;
|
|
1118
1150
|
exports.updateTracking = updateTracking;
|
|
1119
1151
|
exports.when = when;
|