@rimbu/deep 0.11.2 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/main/deep.js +211 -0
  2. package/dist/main/deep.js.map +1 -0
  3. package/dist/main/index.js +7 -9
  4. package/dist/main/index.js.map +1 -1
  5. package/dist/main/internal.js +6 -4
  6. package/dist/main/internal.js.map +1 -1
  7. package/dist/main/match.js +160 -199
  8. package/dist/main/match.js.map +1 -1
  9. package/dist/main/patch.js +101 -125
  10. package/dist/main/patch.js.map +1 -1
  11. package/dist/main/path.js +109 -62
  12. package/dist/main/path.js.map +1 -1
  13. package/dist/main/protected.js +0 -19
  14. package/dist/main/protected.js.map +1 -1
  15. package/dist/main/selector.js +40 -0
  16. package/dist/main/selector.js.map +1 -0
  17. package/dist/main/tuple.js.map +1 -1
  18. package/dist/module/deep.js +192 -0
  19. package/dist/module/deep.js.map +1 -0
  20. package/dist/module/index.js +9 -1
  21. package/dist/module/index.js.map +1 -1
  22. package/dist/module/internal.js +4 -4
  23. package/dist/module/internal.js.map +1 -1
  24. package/dist/module/match.js +159 -179
  25. package/dist/module/match.js.map +1 -1
  26. package/dist/module/patch.js +91 -112
  27. package/dist/module/patch.js.map +1 -1
  28. package/dist/module/path.js +99 -44
  29. package/dist/module/path.js.map +1 -1
  30. package/dist/module/protected.js +1 -17
  31. package/dist/module/protected.js.map +1 -1
  32. package/dist/module/selector.js +36 -0
  33. package/dist/module/selector.js.map +1 -0
  34. package/dist/module/tuple.js.map +1 -1
  35. package/dist/types/deep.d.ts +284 -0
  36. package/dist/types/index.d.ts +10 -1
  37. package/dist/types/internal.d.ts +7 -4
  38. package/dist/types/match.d.ts +74 -80
  39. package/dist/types/patch.d.ts +57 -50
  40. package/dist/types/path.d.ts +177 -34
  41. package/dist/types/protected.d.ts +1 -16
  42. package/dist/types/selector.d.ts +47 -0
  43. package/dist/types/tuple.d.ts +10 -0
  44. package/package.json +4 -4
  45. package/src/deep.ts +362 -0
  46. package/src/index.ts +14 -10
  47. package/src/internal.ts +7 -4
  48. package/src/match.ts +396 -212
  49. package/src/patch.ts +173 -176
  50. package/src/path.ts +400 -74
  51. package/src/protected.ts +14 -25
  52. package/src/selector.ts +90 -0
  53. package/src/tuple.ts +12 -0
@@ -1 +1 @@
1
- {"version":3,"file":"match.js","sourceRoot":"","sources":["../../src/match.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAGV,UAAU,EACV,UAAU,GACX,MAAM,aAAa,CAAC;AAUrB,MAAM,KAAW,KAAK,CAoHrB;AApHD,WAAiB,KAAK;IAuCpB;;;;;;;;;;;;OAYG;IACH,SAAgB,KAAK,CACnB,GAAG,UAAiC;QAEpC,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAJe,WAAK,QAIpB,CAAA;IACD;;;;;;;;;;;;OAYG;IACH,SAAgB,IAAI,CAClB,GAAG,UAAiC;QAEpC,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAJe,UAAI,OAInB,CAAA;IACD;;;;;;;;;;;;OAYG;IACH,SAAgB,IAAI,CAClB,GAAG,UAAiC;QAEpC,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAJe,UAAI,OAInB,CAAA;IACD;;;;;;;;;;;;OAYG;IACH,SAAgB,MAAM,CACpB,GAAG,UAAiC;QAEpC,OAAO,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;IAJe,YAAM,SAIrB,CAAA;AAMH,CAAC,EApHgB,KAAK,KAAL,KAAK,QAoHrB;AAED,MAAM,KAAK;IACT,YAAqB,UAAiC;QAAjC,eAAU,GAAV,UAAU,CAAuB;IAAG,CAAC;CAC3D;AAED,MAAM,IAAI;IACR,YAAqB,UAAiC;QAAjC,eAAU,GAAV,UAAU,CAAuB;IAAG,CAAC;CAC3D;AAED,MAAM,IAAI;IACR,YAAqB,UAAiC;QAAjC,eAAU,GAAV,UAAU,CAAuB;IAAG,CAAC;CAC3D;AAED,MAAM,MAAM;IACV,YAAqB,UAAiC;QAAjC,eAAU,GAAV,UAAU,CAAuB;IAAG,CAAC;CAC3D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,KAAK,CACnB,KAAsB,EACtB,OAAuD;IAEvD,IAAI,OAAO,YAAY,QAAQ,EAAE;QAC/B,OAAO,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;KACnD;IAED,OAAO,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,YAAY,CACnB,KAAQ,EACR,IAAO,EACP,OAA4B;IAE5B,IAAI,OAAO,YAAY,KAAK,EAAE;QAC5B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACX,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAC/B,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC;QAE9B,OAAO,EAAE,CAAC,GAAG,GAAG,EAAE;YAChB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE;gBAC7C,OAAO,KAAK,CAAC;aACd;SACF;QAED,OAAO,IAAI,CAAC;KACb;IACD,IAAI,OAAO,YAAY,IAAI,EAAE;QAC3B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACX,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAC/B,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC;QAC9B,OAAO,EAAE,CAAC,GAAG,GAAG,EAAE;YAChB,IAAI,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE;gBAC5C,OAAO,IAAI,CAAC;aACb;SACF;QAED,OAAO,KAAK,CAAC;KACd;IACD,IAAI,OAAO,YAAY,IAAI,EAAE;QAC3B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACX,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAC/B,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC;QAC9B,OAAO,EAAE,CAAC,GAAG,GAAG,EAAE;YAChB,IAAI,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE;gBAC5C,OAAO,KAAK,CAAC;aACd;SACF;QAED,OAAO,IAAI,CAAC;KACb;IACD,IAAI,OAAO,YAAY,MAAM,EAAE;QAC7B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACX,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAC/B,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC;QAC9B,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,OAAO,EAAE,CAAC,GAAG,GAAG,EAAE;YAChB,IAAI,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE;gBAC5C,IAAI,OAAO,EAAE;oBACX,OAAO,KAAK,CAAC;iBACd;gBAED,OAAO,GAAG,IAAI,CAAC;aAChB;SACF;QAED,OAAO,OAAO,CAAC;KAChB;IAED,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE;QACvB,OAAO,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;KAC1C;IAED,OAAO,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,WAAW,CAClB,KAAQ,EACR,IAAO,EACP,OAAwB;IAExB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;QACxB,UAAU,CAAC,sBAAsB,CAC/B,kFAAkF,CACnF,CAAC;KACH;IAED,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;QACzB,IAAI,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAElC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAE1B,IAAI,UAAU,YAAY,QAAQ,EAAE;YAClC,IAAI,MAAM,YAAY,QAAQ,IAAI,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE;gBAC/D,OAAO,IAAI,CAAC;aACb;YAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAE/C,IAAI,OAAO,MAAM,KAAK,SAAS,EAAE;gBAC/B,IAAI,MAAM,EAAE;oBACV,SAAS;iBACV;gBAED,OAAO,KAAK,CAAC;aACd;YAED,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE;gBAC1C,OAAO,KAAK,CAAC;aACd;SACF;aAAM;YACL,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,UAAiB,CAAC,EAAE;gBACrD,OAAO,KAAK,CAAC;aACd;SACF;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CACtB,KAAQ,EACR,IAAO,EACP,OAA4B;IAE5B,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE;QAC5C,MAAM,GAAG,GAAI,KAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAuB,CAAC;QACnE,MAAM,GAAG,GAAI,OAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAuB,CAAC;QAErE,OAAO,IAAI,EAAE;YACX,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;YACtB,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;YAEtB,IAAI,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK,EAAE;gBAChD,OAAO,KAAK,CAAC;aACd;YACD,IAAI,EAAE,CAAC,IAAI,EAAE;gBACX,OAAO,IAAI,CAAC;aACb;SACF;KACF;IACD,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE;QACrB,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,OAAc,CAAC,CAAC;KAClD;IAED,OAAO,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"match.js","sourceRoot":"","sources":["../../src/match.ts"],"names":[],"mappings":"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"}
@@ -1,136 +1,115 @@
1
- import { RimbuError, isPlainObj, } from '@rimbu/base';
2
- export var Patch;
3
- (function (Patch) {
4
- /**
5
- * Returns a function that patches a given `value` with the given `patchItems`.
6
- * @typeparam T - the patch value type
7
- * @typeparam Q - the input value type
8
- * @param patchItems - a number of `Patch` objects that patch a given value of type T.
9
- * @example
10
- * ```ts
11
- * const items = [{ a: 1, b: 'a' }, { a: 2, b: 'b' }]
12
- * items.map(Patch.create({ a: v => v + 1 }))
13
- * // => [{ a: 2, b: 'a' }, { a: 3, b: 'b' }]
14
- * ```
15
- */
16
- function create(...patchItems) {
17
- return (value) => patch(value, ...patchItems);
18
- }
19
- Patch.create = create;
20
- })(Patch || (Patch = {}));
21
- class NestedObj {
22
- constructor(patchDataItems) {
23
- this.patchDataItems = patchDataItems;
24
- }
25
- }
26
- /**
27
- * Returns a nested patch object based on the given `patchDataItems` that work on a subpart
28
- * of a larger object to be patched.
29
- * @typeparam T - the input value type
30
- * @typeparam R - the root object type
31
- * @typeparam Q - the patch type
32
- * @param patchDataItems - a number of `Patch` objects to be applied to the subpart of the object
33
- * @example
34
- * ```ts
35
- * patch({ a: 1, b: { c: true, d: 'a' } }, { b: patchNested({ d: 'b' }) })
36
- * // => { a: 1, b: { c: true, d: 'b' } }
37
- * ```
38
- */
39
- export function patchNested(...patchDataItems) {
40
- return new NestedObj(patchDataItems);
41
- }
1
+ import { isPlainObj } from '@rimbu/base';
42
2
  /**
43
3
  * Returns an immutably updated version of the given `value` where the given `patchItems` have been
44
4
  * applied to the result.
5
+ * The Rimbu patch notation is as follows:
6
+ * - if the target is a simple value or array, the patch can be the same type or a function returning the same type
7
+ * - if the target is a tuple (array of fixed length), the patch be the same type or an object containing numeric keys with patches indicating the tuple index to patch
8
+ * - if the target is an object, the patch can be the same type, or an array containing partial keys with their patches for the object
9
+ * @typeparam T - the type of the value to patch
10
+ * @typeparam TE - a utility type
11
+ * @typeparam TT - a utility type
45
12
  * @param value - the input value to patch
46
- * @param patchItems - the `Patch` objects to apply to the input value
13
+ * @param patchItem - the `Patch` value to apply to the input value
47
14
  * @example
48
15
  * ```ts
49
16
  * const input = { a: 1, b: { c: true, d: 'a' } }
50
- * patch(input, { a: 2 }) // => { a: 2, b: { c: true, d: 'a' } }
51
- * patch(input: ($) => ({ b: $({ c: v => !v }) }) )
17
+ * patch(input, [{ a: 2 }]) // => { a: 2, b: { c: true, d: 'a' } }
18
+ * patch(input, [{ b: [{ c: (v) => !v }] }] )
52
19
  * // => { a: 1, b: { c: false, d: 'a' } }
53
- * patch(input: ($) => ({ a: v => v + 1, b: $({ d: 'q' }) }) )
20
+ * patch(input: [{ a: (v) => v + 1, b: [{ d: 'q' }] }] )
54
21
  * // => { a: 2, b: { c: true, d: 'q' } }
55
22
  * ```
56
23
  */
57
- export function patch(value, ...patchItems) {
58
- const newValue = isPlainObj(value) ? Object.assign({}, value) : value;
59
- const changedRef = { changed: false };
60
- const result = processPatch(newValue, newValue, patchItems, changedRef);
61
- if (changedRef.changed)
62
- return result;
63
- return value;
64
- }
65
- function processPatch(value, root, patchDataItems, changedRef) {
66
- let i = -1;
67
- const len = patchDataItems.length;
68
- while (++i < len) {
69
- const patchItem = patchDataItems[i];
70
- if (patchItem instanceof Function) {
71
- const item = patchItem(patchNested);
72
- if (item instanceof NestedObj) {
73
- processPatch(value, root, item.patchDataItems, changedRef);
74
- }
75
- else {
76
- processPatchObj(value, root, item, changedRef);
77
- }
78
- }
79
- else {
80
- processPatchObj(value, root, patchItem, changedRef);
81
- }
82
- }
83
- return value;
24
+ export function patch(value, patchItem) {
25
+ return patchEntry(value, value, value, patchItem);
84
26
  }
85
- function processPatchObj(value, root, patchData, changedRef) {
86
- if (undefined === value || null === value) {
27
+ function patchEntry(value, parent, root, patchItem) {
28
+ if (Object.is(value, patchItem)) {
29
+ // patching a value with itself never changes the value
87
30
  return value;
88
31
  }
89
- if (!isPlainObj(patchData)) {
90
- RimbuError.throwInvalidUsageError('patch: received patch object should be a plain object');
32
+ if (typeof value === 'function') {
33
+ // function input, directly return patch
34
+ return patchItem;
91
35
  }
92
- if (!isPlainObj(value)) {
93
- RimbuError.throwInvalidUsageError('patch: received source object should be a plain object');
36
+ if (typeof patchItem === 'function') {
37
+ // function patch always needs to be resolved first
38
+ const item = patchItem(value, parent, root);
39
+ return patchEntry(value, parent, root, item);
94
40
  }
95
- for (const key in patchData) {
96
- const target = value[key];
97
- // prevent prototype pollution
98
- if (key === '__proto__' ||
99
- (key === 'constructor' && target instanceof Function)) {
100
- RimbuError.throwInvalidUsageError(`patch: received patch object key '${key}' which is not allowed to prevent prototype pollution`);
101
- }
102
- const update = patchData[key];
103
- if (!(key in value) && update instanceof Function) {
104
- RimbuError.throwInvalidUsageError(`patch: received update function object key ${key} but the key was not present in the source object. Either explicitely set the value in the source to undefined or use a direct value.`);
105
- }
106
- if (undefined === update) {
107
- RimbuError.throwInvalidUsageError("patch: received 'undefined' as patch value. Due to type system issues we cannot prevent this through typing, but please use '() => undefined' or '() => yourVar' instead. This value will be ignored for safety.");
108
- }
109
- let newValue;
110
- if (update instanceof Function) {
111
- newValue = processPatchObjItem(target, root, update(target, value, root), changedRef);
112
- }
113
- else {
114
- newValue = processPatchObjItem(target, root, update, changedRef);
115
- }
116
- if (!Object.is(newValue, target)) {
117
- value[key] = newValue;
118
- changedRef.changed = true;
41
+ if (isPlainObj(value)) {
42
+ // value is plain object
43
+ return patchPlainObj(value, root, patchItem);
44
+ }
45
+ if (Array.isArray(value)) {
46
+ // value is tuple or array
47
+ return patchArr(value, root, patchItem);
48
+ }
49
+ // value is primitive type or complex object
50
+ return patchItem;
51
+ }
52
+ function patchPlainObj(value, root, patchItem) {
53
+ if (!Array.isArray(patchItem)) {
54
+ // the patch is a complete replacement of the current value
55
+ return patchItem;
56
+ }
57
+ // patch is an array of partial updates
58
+ // copy the input value
59
+ const result = Object.assign({}, value);
60
+ let anyChange = false;
61
+ // loop over patches in array
62
+ for (const entry of patchItem) {
63
+ // update root if needed
64
+ const currentRoot = value === root ? Object.assign({}, result) : root;
65
+ // loop over all the patch keys
66
+ for (const key in entry) {
67
+ // patch the value at the given key with the patch at that key
68
+ const currentValue = result[key];
69
+ const newValue = patchEntry(currentValue, value, currentRoot, entry[key]);
70
+ if (!Object.is(currentValue, newValue)) {
71
+ // if value changed, set it in result and mark change
72
+ anyChange = true;
73
+ result[key] = newValue;
74
+ }
119
75
  }
120
76
  }
77
+ if (anyChange) {
78
+ // something changed, return new value
79
+ return result;
80
+ }
81
+ // nothing changed, return old value
121
82
  return value;
122
83
  }
123
- function processPatchObjItem(value, root, patchResult, superChangedRef) {
124
- if (patchResult instanceof NestedObj) {
125
- const newValue = isPlainObj(value) ? Object.assign({}, value) : value;
126
- const changedRef = { changed: false };
127
- const result = processPatch(newValue, root, patchResult.patchDataItems, changedRef);
128
- if (changedRef.changed) {
129
- superChangedRef.changed = true;
130
- return result;
84
+ function patchArr(value, root, patchItem) {
85
+ if (Array.isArray(patchItem)) {
86
+ // value is a normal array
87
+ // patch is a complete replacement of current array
88
+ return patchItem;
89
+ }
90
+ // value is a tuple
91
+ // patch is an object containing numeric keys with function values
92
+ // that update the tuple at the given indices
93
+ // copy the tuple
94
+ const result = [...value];
95
+ let anyChange = false;
96
+ // loop over all index keys in object
97
+ for (const index in patchItem) {
98
+ const numIndex = index;
99
+ // patch the tuple at the given index
100
+ const currentValue = result[numIndex];
101
+ const newValue = patchEntry(currentValue, value, root, patchItem[index]);
102
+ if (!Object.is(newValue, currentValue)) {
103
+ // if value changed, set it in result and mark change
104
+ anyChange = true;
105
+ result[numIndex] = newValue;
131
106
  }
132
- return value;
133
107
  }
134
- return patchResult;
108
+ if (anyChange) {
109
+ // something changed, return new value
110
+ return result;
111
+ }
112
+ // nothing changed, return old value
113
+ return value;
135
114
  }
136
115
  //# sourceMappingURL=patch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/patch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/patch.ts"],"names":[],"mappings":"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"}
@@ -1,53 +1,108 @@
1
- import { patch, patchNested } from './internal';
1
+ import { Deep } from './internal';
2
2
  export var Path;
3
3
  (function (Path) {
4
4
  /**
5
- * Returns the value resulting from selecting the given `path` in the given `source` object.
6
- * @typeparam T - the object type to select in
7
- * @typeparam P - a Path in object type T
8
- * @param source - the object to select in
9
- * @param path - the path into the object
10
- * @example
11
- * ```ts
12
- * console.log(Path.get({ a: { b: { c: 5 } } }), 'a.b')
13
- * // => { c: 5 }
14
- * console.log(Path.get({ a: { b: { c: 5 } } }), 'a.b.c')
15
- * // => 5
16
- * ```
5
+ * Regular expression used to split a path string into tokens.
17
6
  */
18
- function get(source, path) {
19
- const items = path.split('.');
20
- let result = source;
21
- for (const item of items) {
22
- result = result[item];
23
- }
24
- return result;
25
- }
26
- Path.get = get;
7
+ Path.stringSplitRegex = /\?\.|\.|\[|\]/g;
27
8
  /**
28
- * Sets the value at the given path in the source to the given value.
29
- * @param source - the object to update
30
- * @param path - the path in the object to update
31
- * @param value - the new value to set at the given position
32
- * @example
33
- * ```ts
34
- * console.log(Path.update({ a: { b: { c: 5 } } }, 'a.b.c', v => v + 5)
35
- * // => { a: { b: { c: 6 } } }
36
- * ```
9
+ * Return the given `path` string split into an array of subpaths.
10
+ * @param path - the input string path
37
11
  */
38
- function update(source, path, value) {
39
- const items = path.split('.');
40
- const last = items.pop();
41
- const root = {};
42
- let current = root;
43
- for (const item of items) {
44
- const next = {};
45
- current[item] = patchNested(next);
46
- current = next;
47
- }
48
- current[last] = value;
49
- return patch(source, root);
12
+ function stringSplit(path) {
13
+ return path.split(Path.stringSplitRegex);
50
14
  }
51
- Path.update = update;
15
+ Path.stringSplit = stringSplit;
52
16
  })(Path || (Path = {}));
17
+ /**
18
+ * Returns the value resulting from selecting the given `path` in the given `source` object.
19
+ * It supports optional chaining for nullable values or values that may be undefined, and also
20
+ * for accessing objects inside an array.
21
+ * There is currently no support for forcing non-null (the `!` operator).
22
+ * @typeparam T - the object type to select in
23
+ * @typeparam P - a Path in object type T
24
+ * @param source - the object to select in
25
+ * @param path - the path into the object
26
+ * @example
27
+ * ```ts
28
+ * const value = { a: { b: { c: [{ d: 5 }, { d: 6 }] } } }
29
+ * Deep.getAt(value, 'a.b');
30
+ * // => { c: 5 }
31
+ * Deep.getAt(value, 'a.b.c');
32
+ * // => [{ d: 5 }, { d: 5 }]
33
+ * Deep.getAt(value, 'a.b.c[1]');
34
+ * // => { d: 6 }
35
+ * Deep.getAt(value, 'a.b.c[1]?.d');
36
+ * // => 6
37
+ * ```
38
+ */
39
+ export function getAt(source, path) {
40
+ if (path === '') {
41
+ // empty path always directly returns source value
42
+ return source;
43
+ }
44
+ const items = Path.stringSplit(path);
45
+ // start with `source` as result value
46
+ let result = source;
47
+ for (const item of items) {
48
+ if (undefined === item || item === '' || item === '[') {
49
+ // ignore irrelevant items
50
+ continue;
51
+ }
52
+ if (undefined === result || null === result) {
53
+ // optional chaining assumed and no value available, skip rest of path and return undefined
54
+ return undefined;
55
+ }
56
+ // set current result to subpath value
57
+ result = result[item];
58
+ }
59
+ return result;
60
+ }
61
+ /**
62
+ * Patches the value at the given path in the source to the given value.
63
+ * Because the path to update must exist in the `source` object, optional
64
+ * chaining and array indexing is not allowed.
65
+ * @param source - the object to update
66
+ * @param path - the path in the object to update
67
+ * @param patchItem - the patch for the value at the given path
68
+ * @example
69
+ * ```ts
70
+ * const value = { a: { b: { c: 5 } } };
71
+ * Deep.patchAt(value, 'a.b.c', v => v + 5);
72
+ * // => { a: { b: { c: 6 } } }
73
+ * ```
74
+ */
75
+ export function patchAt(source, path, patchItem) {
76
+ if (path === '') {
77
+ return Deep.patch(source, patchItem);
78
+ }
79
+ const items = Path.stringSplit(path);
80
+ // creates a patch object based on the current path
81
+ function createPatchPart(index, target) {
82
+ if (index === items.length) {
83
+ // processed all items, return the input `patchItem`
84
+ return patchItem;
85
+ }
86
+ const item = items[index];
87
+ if (undefined === item || item === '') {
88
+ // empty items can be ignored
89
+ return createPatchPart(index + 1, target);
90
+ }
91
+ if (item === '[') {
92
+ // next item is array index, set arrayMode to true
93
+ return createPatchPart(index + 1, target);
94
+ }
95
+ // create object with subPart as property key, and the restuls of processing next parts as value
96
+ const result = {
97
+ [item]: createPatchPart(index + 1, target[item]),
98
+ };
99
+ if (Array.isArray(target)) {
100
+ // target in source object is array/tuple, so the patch should be object
101
+ return result;
102
+ }
103
+ // target in source is not an array, so it patch should be an array
104
+ return [result];
105
+ }
106
+ return Deep.patch(source, createPatchPart(0, source));
107
+ }
53
108
  //# sourceMappingURL=path.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/path.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAchD,MAAM,KAAW,IAAI,CAsFpB;AAtFD,WAAiB,IAAI;IAwBnB;;;;;;;;;;;;;OAaG;IACH,SAAgB,GAAG,CACjB,MAAuB,EACvB,IAAO;QAEP,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE9B,IAAI,MAAM,GAAQ,MAAM,CAAC;QAEzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;SACvB;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAbe,QAAG,MAalB,CAAA;IAED;;;;;;;;;;OAUG;IACH,SAAgB,MAAM,CACpB,MAAuB,EACvB,IAAO,EACP,KAAgC;QAEhC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QAE1B,MAAM,IAAI,GAAwB,EAAE,CAAC;QAErC,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,MAAM,IAAI,GAAG,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YAClC,OAAO,GAAG,IAAI,CAAC;SAChB;QAED,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAEtB,OAAO,KAAK,CAAI,MAAM,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IArBe,WAAM,SAqBrB,CAAA;AACH,CAAC,EAtFgB,IAAI,KAAJ,IAAI,QAsFpB"}
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/path.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAS,MAAM,YAAY,CAAC;AAGzC,MAAM,KAAW,IAAI,CAsTpB;AAtTD,WAAiB,IAAI;IAqSnB;;OAEG;IACU,qBAAgB,GAAG,gBAAgB,CAAC;IAOjD;;;OAGG;IACH,SAAgB,WAAW,CAAC,IAAY;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC3C,CAAC;IAFe,gBAAW,cAE1B,CAAA;AACH,CAAC,EAtTgB,IAAI,KAAJ,IAAI,QAsTpB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,KAAK,CACnB,MAAS,EACT,IAAO;IAEP,IAAI,IAAI,KAAK,EAAE,EAAE;QACf,kDAAkD;QAClD,OAAO,MAAa,CAAC;KACtB;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAErC,sCAAsC;IACtC,IAAI,MAAM,GAAG,MAAa,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,IAAI,SAAS,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,GAAG,EAAE;YACrD,0BAA0B;YAC1B,SAAS;SACV;QAED,IAAI,SAAS,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,EAAE;YAC3C,2FAA2F;YAC3F,OAAO,SAAgB,CAAC;SACzB;QAED,sCAAsC;QACtC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;KACvB;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,OAAO,CACrB,MAAS,EACT,IAAO,EACP,SAAsC;IAEtC,IAAI,IAAI,KAAK,EAAE,EAAE;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,SAAgB,CAAC,CAAC;KAC7C;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAErC,mDAAmD;IACnD,SAAS,eAAe,CAAC,KAAa,EAAE,MAAW;QACjD,IAAI,KAAK,KAAK,KAAK,CAAC,MAAM,EAAE;YAC1B,oDAAoD;YACpD,OAAO,SAAS,CAAC;SAClB;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAE1B,IAAI,SAAS,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE,EAAE;YACrC,6BAA6B;YAC7B,OAAO,eAAe,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;SAC3C;QAED,IAAI,IAAI,KAAK,GAAG,EAAE;YAChB,kDAAkD;YAClD,OAAO,eAAe,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;SAC3C;QAED,gGAAgG;QAChG,MAAM,MAAM,GAAG;YACb,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;SACjD,CAAC;QAEF,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACzB,wEAAwE;YACxE,OAAO,MAAM,CAAC;SACf;QAED,mEAAmE;QACnE,OAAO,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AACxD,CAAC"}
@@ -1,18 +1,2 @@
1
- /**
2
- * Returns the same value wrapped in the `Protected` type.
3
- * @param value - the value to wrap
4
- * @note does not perform any runtime protection, it is only a utility to easily add the `Protected`
5
- * type to a value
6
- * @example
7
- * ```ts
8
- * const obj = Protected({ a: 1, b: { c: true, d: [1] } })
9
- * obj.a = 2 // compiler error: a is readonly
10
- * obj.b.c = false // compiler error: c is readonly
11
- * obj.b.d.push(2) // compiler error: d is a readonly array
12
- * (obj as any).b.d.push(2) // will actually mutate the object
13
- * ```
14
- */
15
- export function Protected(value) {
16
- return value;
17
- }
1
+ export {};
18
2
  //# sourceMappingURL=protected.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"protected.js","sourceRoot":"","sources":["../../src/protected.ts"],"names":[],"mappings":"AA2BA;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,SAAS,CAAI,KAAQ;IACnC,OAAO,KAAY,CAAC;AACtB,CAAC"}
1
+ {"version":3,"file":"protected.js","sourceRoot":"","sources":["../../src/protected.ts"],"names":[],"mappings":""}
@@ -0,0 +1,36 @@
1
+ import { Deep } from './internal';
2
+ /**
3
+ * Returns the result of applying the given `selector` shape to the given `source` value.
4
+ * @typeparam T - the patch value type
5
+ * @typeparam SL - the selector shape type
6
+ * @param source - the source value to select from
7
+ * @param selector - a shape indicating the selection from the source values
8
+ * @example
9
+ * ```ts
10
+ * const item = { a: { b: 1, c: 'a' } };
11
+ * Deep.select(item, { q: 'a.c', y: ['a.b', 'a.c'], z: (v) => v.a.b + 1 });
12
+ * // => { q: 'a', y: [1, 'a'], z: 2 }
13
+ * ```
14
+ */
15
+ export function select(source, selector) {
16
+ if (typeof selector === 'function') {
17
+ // selector is function, resolve selector function
18
+ return selector(source);
19
+ }
20
+ else if (typeof selector === 'string') {
21
+ // selector is string path, get the value at the given path
22
+ return Deep.getAt(source, selector);
23
+ }
24
+ else if (Array.isArray(selector)) {
25
+ // selector is tuple, get each tuple item value
26
+ return selector.map((s) => select(source, s));
27
+ }
28
+ // selector is object
29
+ const result = {};
30
+ for (const key in selector) {
31
+ // set each selected object key to the selector value
32
+ result[key] = select(source, selector[key]);
33
+ }
34
+ return result;
35
+ }
36
+ //# sourceMappingURL=selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selector.js","sourceRoot":"","sources":["../../src/selector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAwB,MAAM,YAAY,CAAC;AAkDxD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,MAAM,CACpB,MAAS,EACT,QAA4B;IAE5B,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;QAClC,kDAAkD;QAClD,OAAQ,QAAgB,CAAC,MAAsB,CAAC,CAAC;KAClD;SAAM,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;QACvC,2DAA2D;QAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,QAAuB,CAAQ,CAAC;KAC3D;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QAClC,+CAA+C;QAC/C,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAQ,CAAC;KACtD;IAED,qBAAqB;IAErB,MAAM,MAAM,GAAQ,EAAE,CAAC;IAEvB,KAAK,MAAM,GAAG,IAAI,QAAe,EAAE;QACjC,qDAAqD;QACrD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAG,QAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;KACtD;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"tuple.js","sourceRoot":"","sources":["../../src/tuple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAQlC,MAAM,KAAW,KAAK,CAgLrB;AAhLD,WAAiB,KAAK;IAWpB;;;;;;;;OAQG;IACH,SAAgB,EAAE,CAAiC,GAAG,MAAS;QAC7D,OAAO,MAAa,CAAC;IACvB,CAAC;IAFe,QAAE,KAEjB,CAAA;IAED;;;;;;;;;;OAUG;IACH,SAAgB,QAAQ,CACtB,KAAQ,EACR,KAAQ;QAER,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IALe,cAAQ,WAKvB,CAAA;IAED;;;;;;;;;OASG;IACH,SAAgB,KAAK,CAAyB,KAAQ;QACpD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAFe,WAAK,QAEpB,CAAA;IAED;;;;;;;;;OASG;IACH,SAAgB,MAAM,CAAyB,KAAQ;QACrD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAFe,YAAM,SAErB,CAAA;IAED;;;;;;;;;OASG;IACH,SAAgB,IAAI,CAClB,KAAyB;QAEzB,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAQ,CAAC;IACxC,CAAC;IAJe,UAAI,OAInB,CAAA;IAED;;;;;;;;;;;;OAYG;IACH,SAAgB,QAAQ,CACtB,KAAQ,EACR,KAAQ,EACR,OAAqB;QAErB,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,KAAe,EAAE,OAAO,CAAM,CAAC;IAC1D,CAAC;IANe,cAAQ,WAMvB,CAAA;IAED;;;;;;;;;;OAUG;IACH,SAAgB,MAAM,CAGpB,KAAQ,EAAE,GAAG,MAAS;QACtB,OAAO,CAAC,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC;IAC/B,CAAC;IALe,YAAM,SAKrB,CAAA;IAED;;;;;;;;;;;;OAYG;IACH,SAAgB,MAAM,CACpB,MAAU,EACV,MAAU;QAEV,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAQ,CAAC;IACtC,CAAC;IALe,YAAM,SAKrB,CAAA;IAED;;;;;;;;;OASG;IACH,SAAgB,IAAI,CAClB,KAA+B;QAE/B,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAQ,CAAC;IAChC,CAAC;IAJe,UAAI,OAInB,CAAA;IAED;;;;;;;;;OASG;IACH,SAAgB,IAAI,CAClB,KAA+B;QAE/B,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAQ,CAAC;IAChC,CAAC;IAJe,UAAI,OAInB,CAAA;AACH,CAAC,EAhLgB,KAAK,KAAL,KAAK,QAgLrB"}
1
+ {"version":3,"file":"tuple.js","sourceRoot":"","sources":["../../src/tuple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAQlC,MAAM,KAAW,KAAK,CA4LrB;AA5LD,WAAiB,KAAK;IAuBpB;;;;;;;;OAQG;IACH,SAAgB,EAAE,CAAiC,GAAG,MAAS;QAC7D,OAAO,MAAa,CAAC;IACvB,CAAC;IAFe,QAAE,KAEjB,CAAA;IAED;;;;;;;;;;OAUG;IACH,SAAgB,QAAQ,CACtB,KAAQ,EACR,KAAQ;QAER,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IALe,cAAQ,WAKvB,CAAA;IAED;;;;;;;;;OASG;IACH,SAAgB,KAAK,CAAyB,KAAQ;QACpD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAFe,WAAK,QAEpB,CAAA;IAED;;;;;;;;;OASG;IACH,SAAgB,MAAM,CAAyB,KAAQ;QACrD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAFe,YAAM,SAErB,CAAA;IAED;;;;;;;;;OASG;IACH,SAAgB,IAAI,CAClB,KAAyB;QAEzB,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAQ,CAAC;IACxC,CAAC;IAJe,UAAI,OAInB,CAAA;IAED;;;;;;;;;;;;OAYG;IACH,SAAgB,QAAQ,CACtB,KAAQ,EACR,KAAQ,EACR,OAAqB;QAErB,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,KAAe,EAAE,OAAO,CAAM,CAAC;IAC1D,CAAC;IANe,cAAQ,WAMvB,CAAA;IAED;;;;;;;;;;OAUG;IACH,SAAgB,MAAM,CAGpB,KAAQ,EAAE,GAAG,MAAS;QACtB,OAAO,CAAC,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC;IAC/B,CAAC;IALe,YAAM,SAKrB,CAAA;IAED;;;;;;;;;;;;OAYG;IACH,SAAgB,MAAM,CACpB,MAAU,EACV,MAAU;QAEV,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAQ,CAAC;IACtC,CAAC;IALe,YAAM,SAKrB,CAAA;IAED;;;;;;;;;OASG;IACH,SAAgB,IAAI,CAClB,KAA+B;QAE/B,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAQ,CAAC;IAChC,CAAC;IAJe,UAAI,OAInB,CAAA;IAED;;;;;;;;;OASG;IACH,SAAgB,IAAI,CAClB,KAA+B;QAE/B,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAQ,CAAC;IAChC,CAAC;IAJe,UAAI,OAInB,CAAA;AACH,CAAC,EA5LgB,KAAK,KAAL,KAAK,QA4LrB"}