@webkrafters/react-observable-context 6.0.0-rc.2.1 → 6.0.0-rc.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ import type { Changes as BaseChanges, Connection, Immutable, Value } from '@webk
3
3
  import { FULL_STATE_SELECTOR } from './constants';
4
4
  export type { BaseType, ClearCommand, KeyType, MoveCommand, PushCommand, ReplaceCommand, SetCommand, SpliceCommand, TagCommand, TagType, UpdateStats, UpdatePayload, UpdatePayloadArray } from '@webkrafters/auto-immutable';
5
5
  export type State = Value;
6
- export type Listener<T extends State = {}> = (changes: Readonly<T>, hasChangedPath: (pathTokens: Array<string>) => boolean) => void;
6
+ export type Listener<T extends State = {}> = (changes: Changes<T>, changedPathsTokens: Readonly<Array<Array<string>>>, netChanges: Readonly<T>, mayHaveChangesAt: (pathTokens: Array<string>) => boolean) => void;
7
7
  export type ObservableProvider<T extends State> = ForwardRefExoticComponent<ProviderProps<T> & RefAttributes<StoreRef<T>>>;
8
8
  export interface ProviderProps<T extends State> {
9
9
  children?: ReactNode;
@@ -79,8 +79,8 @@ export interface StorePlaceholder extends IStoreInternal {
79
79
  subscribe: NonReactUsageReport;
80
80
  }
81
81
  export interface StoreRef<T extends State = State> extends StorePlaceholder {
82
- getState: () => T;
83
- resetState: (propertyPaths?: string[]) => void;
82
+ getState: (propertyPaths?: Array<string>) => T;
83
+ resetState: (propertyPaths?: Array<string>) => void;
84
84
  setState: (changes: Changes<T>) => void;
85
85
  subscribe: Subscribe;
86
86
  }
@@ -105,11 +105,13 @@ var useStore = function useStore(prehooks, value, storage) {
105
105
  }),
106
106
  _ref6 = _slicedToArray(_ref5, 1),
107
107
  _storage = _ref6[0];
108
- var onChange = (0, react_1.useCallback)(function (changes, changedPathsTokens) {
109
- var pSearch = createChangePathSearch(changedPathsTokens);
110
- listeners.forEach(function (listener) {
111
- return listener(changes, pSearch);
112
- });
108
+ var getChangHandler = (0, react_1.useCallback)(function (changes) {
109
+ return function (netChanges, changedPathsTokens) {
110
+ var mayHaveChangesAt = createChangePathSearch(changedPathsTokens);
111
+ listeners.forEach(function (listener) {
112
+ return listener(changes, changedPathsTokens, netChanges, mayHaveChangesAt);
113
+ });
114
+ };
113
115
  }, []);
114
116
  var resetState = (0, react_1.useCallback)(function (connection) {
115
117
  var propertyPaths = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
@@ -174,20 +176,21 @@ var useStore = function useStore(prehooks, value, storage) {
174
176
  runPrehook(prehooksRef.current, 'resetState', [resetData, {
175
177
  current: connection.get(constants_1.GLOBAL_SELECTOR)[constants_1.GLOBAL_SELECTOR],
176
178
  original: original
177
- }]) && connection.set(resetData, onChange);
179
+ }]) && connection.set(resetData, getChangHandler(resetData));
178
180
  }, []);
179
181
  var setState = (0, react_1.useCallback)(function (connection, changes) {
180
182
  if (!runPrehook(prehooksRef.current, 'setState', [changes])) {
181
183
  return;
182
184
  }
183
185
  if (!Array.isArray(changes)) {
184
- return connection.set(transformPayload(changes), onChange);
185
- }
186
- changes = changes.slice();
187
- for (var c = changes.length; c--;) {
188
- changes[c] = transformPayload(changes[c]);
186
+ changes = transformPayload(changes);
187
+ } else {
188
+ changes = changes.slice();
189
+ for (var c = changes.length; c--;) {
190
+ changes[c] = transformPayload(changes[c]);
191
+ }
189
192
  }
190
- connection.set(changes, onChange);
193
+ connection.set(changes, getChangHandler(changes));
191
194
  }, []);
192
195
  var subscribe = (0, react_1.useCallback)(function (listener) {
193
196
  listeners.add(listener);
@@ -224,6 +227,10 @@ var useStore = function useStore(prehooks, value, storage) {
224
227
  })[0];
225
228
  };
226
229
  exports["default"] = useStore;
230
+ /**
231
+ * @param {string[][]} changedPathsTokens - list containing tokenized changed object paths.
232
+ * @returns {Function} - function verifying that a random tokenized object path falls within the changed paths domain.
233
+ */
227
234
  function createChangePathSearch(_ref0) {
228
235
  var length = _ref0.length,
229
236
  pathTokenGroups = _objectWithoutProperties(_ref0, _excluded);
@@ -87,6 +87,7 @@ var react_1 = __importStar(require("react"));
87
87
  var lodash_isequal_1 = __importDefault(require("lodash.isequal"));
88
88
  var lodash_isplainobject_1 = __importDefault(require("lodash.isplainobject"));
89
89
  var lodash_omit_1 = __importDefault(require("lodash.omit"));
90
+ var lodash_set_1 = __importDefault(require("lodash.set"));
90
91
  var path_dotize_1 = __importDefault(require("@webkrafters/path-dotize"));
91
92
  var constants = __importStar(require("../constants"));
92
93
  var use_render_key_provider_1 = __importDefault(require("./hooks/use-render-key-provider"));
@@ -227,9 +228,9 @@ function useContext(context, selectorMap) {
227
228
  _react_1$default$useS4 = _slicedToArray(_react_1$default$useS3, 2),
228
229
  data = _react_1$default$useS4[0],
229
230
  setData = _react_1$default$useS4[1];
230
- var dataSourceListener = function dataSourceListener(changes, hasChangedPath) {
231
+ var dataSourceListener = function dataSourceListener(changes, changePathsTokens, netChanges, mayHaveChangesAt) {
231
232
  for (var _Len = _renderKeys.length, _ = 0; _ < _Len; _++) {
232
- if (_renderKeys[_] !== constants.FULL_STATE_SELECTOR && !hasChangedPath((0, path_dotize_1["default"])(_renderKeys[_]).split('.'))) {
233
+ if (_renderKeys[_] !== constants.FULL_STATE_SELECTOR && !mayHaveChangesAt((0, path_dotize_1["default"])(_renderKeys[_]).split('.'))) {
233
234
  continue;
234
235
  }
235
236
  return updateData();
@@ -382,12 +383,22 @@ function makeObservable(Provider) {
382
383
  }),
383
384
  _ref7 = _slicedToArray(_ref6, 1),
384
385
  connection = _ref7[0];
386
+ var getState = (0, react_1.useCallback)(function () {
387
+ var propertyPaths = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
388
+ if (!propertyPaths.length || propertyPaths.indexOf(constants.FULL_STATE_SELECTOR) !== -1) {
389
+ return connection.get(constants.GLOBAL_SELECTOR)[constants.GLOBAL_SELECTOR];
390
+ }
391
+ var data = connection.get.apply(connection, _toConsumableArray(propertyPaths));
392
+ var state = {};
393
+ for (var d in data) {
394
+ (0, lodash_set_1["default"])(state, d, data[d]);
395
+ }
396
+ return state;
397
+ }, []);
385
398
  (0, react_1.useImperativeHandle)(storeRef, function () {
386
399
  var _storeRef$current;
387
400
  return _objectSpread(_objectSpread({}, (_storeRef$current = storeRef === null || storeRef === void 0 ? void 0 : storeRef.current) !== null && _storeRef$current !== void 0 ? _storeRef$current : {}), {}, {
388
- getState: function getState() {
389
- return connection.get(constants.GLOBAL_SELECTOR)[constants.GLOBAL_SELECTOR];
390
- },
401
+ getState: getState,
391
402
  resetState: function resetState(propertyPaths) {
392
403
  return store.resetState(connection, propertyPaths);
393
404
  },
package/package.json CHANGED
@@ -45,6 +45,7 @@
45
45
  "lodash.isequal": "^4.5.0",
46
46
  "lodash.isplainobject": "^4.0.6",
47
47
  "lodash.omit": "^4.5.0",
48
+ "lodash.set": "^4.3.2",
48
49
  "react": "^18.3.1",
49
50
  "react-dom": "^18.3.1",
50
51
  "react-performance-testing": "^2.0.0",
@@ -54,8 +55,8 @@
54
55
  "typescript": "^5.4.5"
55
56
  },
56
57
  "files": [
57
- "dist",
58
- "logo.png"
58
+ "logo.png",
59
+ "dist"
59
60
  ],
60
61
  "homepage": "https://eagleeye.js.org",
61
62
  "keywords": [
@@ -89,6 +90,7 @@
89
90
  "lodash.isequal": ">= 0.1.0",
90
91
  "lodash.isplainobject": ">= 0.8.0",
91
92
  "lodash.omit": ">= 0.1.0",
93
+ "lodash.set": ">= 0.1.0",
92
94
  "react": ">= 16.8.0 <19"
93
95
  },
94
96
  "publishConfig": {
@@ -100,14 +102,13 @@
100
102
  },
101
103
  "scripts": {
102
104
  "build": "eslint --fix && rm -rf dist && tsc && babel dist -d dist",
103
- "postbuild": "node ./post-build",
104
105
  "test": "eslint --fix && jest --coverage --updateSnapshot",
105
106
  "test:clean": "jest --clearCache",
106
107
  "test:core": "jest --updateSnapshot",
107
108
  "test:watch": "eslint --fix && jest --updateSnapshot --watchAll"
108
109
  },
109
110
  "types": "dist/index.d.ts",
110
- "version": "6.0.0-rc.2.1",
111
+ "version": "6.0.0-rc.3",
111
112
  "dependencies": {
112
113
  "@webkrafters/auto-immutable": "^2.0.0-rc.10"
113
114
  }