@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.
Files changed (63) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +4 -0
  3. package/helpers/pageHash.js +1 -1
  4. package/helpers/pageHash.js.map +1 -1
  5. package/helpers/pageHash.mjs +1 -1
  6. package/helpers/pageHash.mjs.map +1 -1
  7. package/helpers/pageHashParams.js +1 -1
  8. package/helpers/pageHashParams.js.map +1 -1
  9. package/helpers/pageHashParams.mjs +1 -1
  10. package/helpers/pageHashParams.mjs.map +1 -1
  11. package/history.js +3 -3
  12. package/history.js.map +1 -1
  13. package/history.mjs +4 -4
  14. package/history.mjs.map +1 -1
  15. package/index.d.ts +2 -2
  16. package/index.js +99 -67
  17. package/index.js.map +1 -1
  18. package/index.mjs +97 -64
  19. package/index.mjs.map +1 -1
  20. package/package.json +1 -1
  21. package/persist-plugins/indexeddb-preloader.js +13 -11
  22. package/persist-plugins/indexeddb-preloader.js.map +1 -1
  23. package/persist-plugins/indexeddb-preloader.mjs +13 -11
  24. package/persist-plugins/indexeddb-preloader.mjs.map +1 -1
  25. package/persist-plugins/indexeddb.d.ts +3 -2
  26. package/persist-plugins/indexeddb.js +87 -57
  27. package/persist-plugins/indexeddb.js.map +1 -1
  28. package/persist-plugins/indexeddb.mjs +88 -58
  29. package/persist-plugins/indexeddb.mjs.map +1 -1
  30. package/persist-plugins/local-storage.d.ts +4 -3
  31. package/persist-plugins/local-storage.js +18 -8
  32. package/persist-plugins/local-storage.js.map +1 -1
  33. package/persist-plugins/local-storage.mjs +18 -8
  34. package/persist-plugins/local-storage.mjs.map +1 -1
  35. package/persist-plugins/mmkv.d.ts +3 -2
  36. package/persist-plugins/mmkv.js +27 -18
  37. package/persist-plugins/mmkv.js.map +1 -1
  38. package/persist-plugins/mmkv.mjs +27 -18
  39. package/persist-plugins/mmkv.mjs.map +1 -1
  40. package/persist.d.ts +3 -2
  41. package/persist.js +274 -112
  42. package/persist.js.map +1 -1
  43. package/persist.mjs +274 -113
  44. package/persist.mjs.map +1 -1
  45. package/react-hooks/usePersistedObservable.js.map +1 -1
  46. package/react-hooks/usePersistedObservable.mjs.map +1 -1
  47. package/react.js +1 -1
  48. package/react.js.map +1 -1
  49. package/react.mjs +2 -2
  50. package/react.mjs.map +1 -1
  51. package/src/batching.d.ts +2 -9
  52. package/src/helpers.d.ts +4 -4
  53. package/src/notify.d.ts +1 -1
  54. package/src/observableInterfaces.d.ts +56 -17
  55. package/src/onChange.d.ts +4 -1
  56. package/src/persist/fieldTransformer.d.ts +8 -3
  57. package/src/persist/persistHelpers.d.ts +2 -0
  58. package/src/persist/persistObservable.d.ts +7 -3
  59. package/src/persist-plugins/indexeddb.d.ts +3 -2
  60. package/src/persist-plugins/local-storage.d.ts +4 -3
  61. package/src/persist-plugins/mmkv.d.ts +3 -2
  62. package/trace.js.map +1 -1
  63. 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
@@ -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';
@@ -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;;AAEtB,IAAA,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,KAAI;QACxB,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;;;;;"}
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;;;;;"}
@@ -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';
@@ -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;;AAEtB,IAAA,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,KAAI;QACxB,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;;;;"}
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;;AAEtB,IAAA,cAAc,CAAC,QAAQ,CAAC,CAAC,KAAK,KAAI;QAC9B,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;;;;;"}
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;;AAEtB,IAAA,cAAc,CAAC,QAAQ,CAAC,CAAC,KAAK,KAAI;QAC9B,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;;;;"}
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((_, __, changes) => {
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.constructObject(path, prevAtPath);
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","constructObject","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,CAAC,EAAE,EAAE,EAAE,OAAO,KAAI;;;AAG5B,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;gBACrC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACxC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAMC,wBAA0B;oBAAE,SAAS;gBAEpE,MAAM,GAAG,GAAGC,qBAAe,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBAC9CC,yBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3C,aAAA;AACJ,SAAA;AACL,KAAC,CAAC,CAAC;AAEH,IAAA,OAAO,OAAO,CAAC;AACnB;;;;"}
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, constructObject, mergeIntoObservable } from '@legendapp/state';
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((_, __, changes) => {
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 = constructObject(path, prevAtPath);
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,CAAC,EAAE,EAAE,EAAE,OAAO,KAAI;;;AAG5B,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;gBACrC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACxC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAM,kBAA0B;oBAAE,SAAS;gBAEpE,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBAC9C,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3C,aAAA;AACJ,SAAA;AACL,KAAC,CAAC,CAAC;AAEH,IAAA,OAAO,OAAO,CAAC;AACnB;;;;"}
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, _b;
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
- const targetValue = needsSet ? target.peek() : target;
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
- if (source[symbolDateModified]) {
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 (isObject(sourceValue)) {
218
- if (!needsSet && (!targetValue[key] || !isObject(targetValue[key]))) {
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 === symbolDelete) {
224
- needsSet && ((_a = target[key]) === null || _a === void 0 ? void 0 : _a.delete) ? target[key].delete() : delete target[key];
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 && ((_b = target[key]) === null || _b === void 0 ? void 0 : _b.set)
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 if (needsSet && !(isTargetObj && source === undefined)) {
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 constructObject(path, value) {
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 deconstructObject(path, value) {
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
- existing.value = b.value;
288
- existing.changes.push(...b.changes);
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.value, b.getPrevious, b.changes, b.node);
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, value, getPrevious: prev, changes, node } = b;
330
- cb(value, prev, changes, node);
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 ? level <= 0 : track === 'optimize' ? whenOptimizedOnlyIf && level <= 0 : 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
- value,
375
- getPrevious,
376
- changes: [
377
- {
378
- path,
379
- valueAtPath,
380
- prevAtPath,
381
- },
382
- ],
383
- node,
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, track, noArgs) {
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: track, noArgs };
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, track, noArgs) {
477
- return onChange(this._node, cb, track, noArgs);
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 (!isPrimitive(value)) {
625
- updateNodes(child, value, prev);
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 = getNodeValue(node);
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 (NotifySpecifically.has(key)) {
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.constructObject = constructObject;
1117
+ exports.constructObjectWithPath = constructObjectWithPath;
1086
1118
  exports.dateModifiedKey = dateModifiedKey;
1087
- exports.deconstructObject = deconstructObject;
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;