@webkrafters/react-observable-context 4.5.5 → 4.6.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/README.md CHANGED
@@ -683,6 +683,10 @@ store.setState({
683
683
  <h1 id="changes">What's Changed?</h1>
684
684
 
685
685
  <table>
686
+ <thead><tr><th>v4.6.0</th></tr></thead>
687
+ <tbody>
688
+ <tr><td><b>1.</b></td><td><a href="#store-resetstate"><code>store.resetState</code></a> can now update reset current state even when initial state does not exist. Formerly, a resetState call on a non-existent initial state had no effect.</td></tr>
689
+ </tbody>
686
690
  <thead><tr><th>v4.5.0</th></tr></thead>
687
691
  <tbody>
688
692
  <tr><td><b>1.</b></td><td><a href="#setstate-tags">Tags</a> to update non-existent state slices are now recognized. <b>Previously,</b> they had resulted in no-ops. <b>From now on,</b> they will result in new default slices matching the result of the given tag operation.</td></tr>
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.deps = exports["default"] = void 0;
7
7
  var _react = require("react");
8
8
  var _lodash = _interopRequireDefault(require("lodash.isboolean"));
9
+ var _lodash2 = _interopRequireDefault(require("lodash.isempty"));
9
10
  var _uuid = require("uuid");
10
11
  var _constants = require("../../../constants");
11
12
  var _utils = require("../../../utils");
@@ -13,8 +14,8 @@ var _storage2 = _interopRequireDefault(require("../../../model/storage"));
13
14
  var _usePrehooksRef = _interopRequireDefault(require("../use-prehooks-ref"));
14
15
  var _useStateManager2 = _interopRequireDefault(require("../use-state-manager"));
15
16
  var _setState2 = _interopRequireDefault(require("../../set-state"));
16
- var _ = require("../..");
17
17
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
18
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
18
19
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
19
20
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
20
21
  function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
@@ -77,10 +78,62 @@ var useStore = function useStore(prehooks, value, storage) {
77
78
  var resetState = (0, _react.useCallback)(function () {
78
79
  var propertyPaths = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
79
80
  var original = _storage.clone(_storage.getItem(storageKey.current));
80
- var resetData = !propertyPaths.length ? {} : propertyPaths.includes(_constants.FULL_STATE_SELECTOR) ? _defineProperty({}, _.REPLACE_TAG, original) : (0, _utils.mapPathsToObject)(original, propertyPaths, function (_ref2) {
81
- var value = _ref2.value;
82
- return _defineProperty({}, _.REPLACE_TAG, value);
83
- });
81
+ var resetData;
82
+ if (!propertyPaths.length) {
83
+ resetData = {};
84
+ } else if (propertyPaths.includes(_constants.FULL_STATE_SELECTOR)) {
85
+ resetData = (0, _lodash2["default"])(original) ? _constants.CLEAR_TAG : _defineProperty({}, _constants.REPLACE_TAG, original);
86
+ } else {
87
+ var visitedPathMap = {};
88
+ resetData = (0, _utils.mapPathsToObject)(original, propertyPaths, function (_ref2) {
89
+ var trail = _ref2.trail,
90
+ value = _ref2.value;
91
+ visitedPathMap[trail] = null;
92
+ return _defineProperty({}, _constants.REPLACE_TAG, value);
93
+ });
94
+ if (Object.keys(visitedPathMap).length < propertyPaths.length) {
95
+ var _iterator = _createForOfIteratorHelper(propertyPaths),
96
+ _step;
97
+ try {
98
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
99
+ var path = _step.value;
100
+ path = (0, _utils.stringToDotPath)(path);
101
+ if (path in visitedPathMap) {
102
+ continue;
103
+ }
104
+ var trail = path.split('.');
105
+ var keyTuple = trail.slice(-1);
106
+ trail = trail.slice(0, -1);
107
+ var node = resetData;
108
+ var _iterator2 = _createForOfIteratorHelper(trail),
109
+ _step2;
110
+ try {
111
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
112
+ var t = _step2.value;
113
+ if ((0, _lodash2["default"])(node[t])) {
114
+ node[t] = {};
115
+ }
116
+ node = node[t];
117
+ }
118
+ } catch (err) {
119
+ _iterator2.e(err);
120
+ } finally {
121
+ _iterator2.f();
122
+ }
123
+ if (_constants.DELETE_TAG in node) {
124
+ var _node$DELETE_TAG;
125
+ (_node$DELETE_TAG = node[_constants.DELETE_TAG]).push.apply(_node$DELETE_TAG, _toConsumableArray(keyTuple));
126
+ } else {
127
+ node[_constants.DELETE_TAG] = keyTuple;
128
+ }
129
+ }
130
+ } catch (err) {
131
+ _iterator.e(err);
132
+ } finally {
133
+ _iterator.f();
134
+ }
135
+ }
136
+ }
84
137
  runPrehook(prehooksRef.current, 'resetState', [resetData, {
85
138
  current: (0, _utils.clonedeep)(state),
86
139
  original: original
@@ -11,6 +11,14 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
11
11
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
12
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
13
13
  function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
14
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
15
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
16
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
17
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
18
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
19
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
20
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
21
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
14
22
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
15
23
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
16
24
  function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
@@ -118,7 +126,14 @@ function resolveTags(state, changes, stateKey, stats) {
118
126
  changes[stateKey][k] = _defineProperty({}, changes[stateKey][k], null);
119
127
  }
120
128
  if (k in _tagFunctions["default"]) {
121
- _tagFunctions["default"][k](state, stateKey, stats, changes);
129
+ var s = state;
130
+ if (Array.isArray(state)) {
131
+ s = _toConsumableArray(state);
132
+ } else if ((0, _lodash2["default"])(state)) {
133
+ s = _objectSpread({}, state);
134
+ }
135
+ _tagFunctions["default"][k](s, stateKey, stats, changes);
136
+ state[stateKey] = s[stateKey];
122
137
  resolvedTags.push(k);
123
138
  }
124
139
  }
@@ -317,7 +317,8 @@ function applyReplaceCommand(tag, state, changes, stateKey, stats) {
317
317
  if ((0, _lodash2["default"])(state[stateKey], replacement)) {
318
318
  return finishTagRequest(changes, stateKey, tag);
319
319
  }
320
- if (Array.isArray(replacement) && Array.isArray(state[stateKey])) {
320
+ if (Array.isArray(replacement) && Array.isArray(state[stateKey]) && state[stateKey].length !== replacement.length) {
321
+ state[stateKey] = _toConsumableArray(state[stateKey]);
321
322
  state[stateKey].length = replacement.length;
322
323
  }
323
324
  for (var k in state[stateKey]) {
@@ -6,4 +6,5 @@ export function mapPathsToObject<T extends {
6
6
  }>(source: T, propertyPaths: Array<string>, transform?: Tranform): { [K in keyof T]?: any; };
7
7
  export function clonedeep<T, R>(value: T): R;
8
8
  export const getProperty: any;
9
+ export const stringToDotPath: (path: string) => string;
9
10
  export type Tranform = (property: any) => T;
@@ -7,6 +7,7 @@ exports.getProperty = exports.clonedeep = void 0;
7
7
  exports.isDataContainer = isDataContainer;
8
8
  exports.makeReadonly = makeReadonly;
9
9
  exports.mapPathsToObject = mapPathsToObject;
10
+ exports.stringToDotPath = void 0;
10
11
  var _lodash = _interopRequireDefault(require("lodash.clonedeepwith"));
11
12
  var _lodash2 = _interopRequireDefault(require("lodash.isplainobject"));
12
13
  var _clonedeepEligibilityCheck = _interopRequireDefault(require("./clonedeep-eligibility-check"));
@@ -116,6 +117,14 @@ var defaultFormatValue = function defaultFormatValue(_ref) {
116
117
  var value = _ref.value;
117
118
  return value;
118
119
  };
120
+ var stringToDotPath = function () {
121
+ var BRACKET_OPEN = /\.?\[/g;
122
+ var BRACKET_CLOSE = /^\.|\]/g;
123
+ return function (path) {
124
+ return path.replace(BRACKET_OPEN, '.').replace(BRACKET_CLOSE, '');
125
+ };
126
+ }();
127
+ exports.stringToDotPath = stringToDotPath;
119
128
  function mapPathsToObject(source, propertyPaths) {
120
129
  var transform = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultFormatValue;
121
130
  var paths = [];
@@ -124,7 +133,7 @@ function mapPathsToObject(source, propertyPaths) {
124
133
  try {
125
134
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
126
135
  var path = _step2.value;
127
- paths.push(path.replace(/\.?\[/g, '.').replace(/^\.|\]/g, ''));
136
+ paths.push(stringToDotPath(path));
128
137
  }
129
138
  } catch (err) {
130
139
  _iterator2.e(err);
package/package.json CHANGED
@@ -133,5 +133,5 @@
133
133
  "test:watch": "eslint --fix && jest --updateSnapshot --watchAll"
134
134
  },
135
135
  "types": "dist/main/index.d.ts",
136
- "version": "4.5.5"
136
+ "version": "4.6.1"
137
137
  }