cozy-client 48.12.1 → 48.13.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.
@@ -1262,11 +1262,13 @@ var CozyClient = /*#__PURE__*/function () {
1262
1262
 
1263
1263
  var _ref5,
1264
1264
  update,
1265
+ executeFromStore,
1265
1266
  options,
1266
1267
  queryId,
1267
1268
  existingQuery,
1268
1269
  shouldFetch,
1269
1270
  backgroundFetching,
1271
+ requestFn,
1270
1272
  response,
1271
1273
  _args8 = arguments;
1272
1274
 
@@ -1275,7 +1277,7 @@ var CozyClient = /*#__PURE__*/function () {
1275
1277
  switch (_context8.prev = _context8.next) {
1276
1278
  case 0:
1277
1279
  _ref5 = _args8.length > 1 && _args8[1] !== undefined ? _args8[1] : {};
1278
- update = _ref5.update, options = (0, _objectWithoutProperties2.default)(_ref5, ["update"]);
1280
+ update = _ref5.update, executeFromStore = _ref5.executeFromStore, options = (0, _objectWithoutProperties2.default)(_ref5, ["update", "executeFromStore"]);
1279
1281
  this.ensureStore();
1280
1282
  queryId = options.as || this.queryIdGenerator.generateId(queryDefinition);
1281
1283
  existingQuery = this.getQueryFromState(queryId, options);
@@ -1337,14 +1339,17 @@ var CozyClient = /*#__PURE__*/function () {
1337
1339
  this.dispatch((0, _store.loadQuery)(queryId, {
1338
1340
  backgroundFetching: backgroundFetching
1339
1341
  }));
1340
- _context8.next = 23;
1341
- return this._promiseCache.exec(function () {
1342
+ requestFn = executeFromStore ? function () {
1343
+ return Promise.resolve((0, _store.executeQueryFromState)(_this4.store.getState(), queryDefinition));
1344
+ } : function () {
1342
1345
  return _this4.requestQuery(queryDefinition);
1343
- }, function () {
1346
+ };
1347
+ _context8.next = 24;
1348
+ return this._promiseCache.exec(requestFn, function () {
1344
1349
  return (0, _jsonStableStringify.default)(queryDefinition);
1345
1350
  });
1346
1351
 
1347
- case 23:
1352
+ case 24:
1348
1353
  response = _context8.sent;
1349
1354
  this.dispatch((0, _store.receiveQueryResult)(queryId, response, {
1350
1355
  update: update,
@@ -1352,40 +1357,40 @@ var CozyClient = /*#__PURE__*/function () {
1352
1357
  }));
1353
1358
  return _context8.abrupt("return", response);
1354
1359
 
1355
- case 28:
1356
- _context8.prev = 28;
1360
+ case 29:
1361
+ _context8.prev = 29;
1357
1362
  _context8.t0 = _context8["catch"](18);
1358
1363
  this.dispatch((0, _store.receiveQueryError)(queryId, _context8.t0)); // specific onError
1359
1364
 
1360
1365
  if (!options.onError) {
1361
- _context8.next = 35;
1366
+ _context8.next = 36;
1362
1367
  break;
1363
1368
  }
1364
1369
 
1365
1370
  options.onError(_context8.t0); // defaulted onError
1366
1371
 
1367
- _context8.next = 40;
1372
+ _context8.next = 41;
1368
1373
  break;
1369
1374
 
1370
- case 35:
1375
+ case 36:
1371
1376
  if (!this.options.onError) {
1372
- _context8.next = 39;
1377
+ _context8.next = 40;
1373
1378
  break;
1374
1379
  }
1375
1380
 
1376
1381
  this.options.onError(_context8.t0);
1377
- _context8.next = 40;
1382
+ _context8.next = 41;
1378
1383
  break;
1379
1384
 
1380
- case 39:
1385
+ case 40:
1381
1386
  throw _context8.t0;
1382
1387
 
1383
- case 40:
1388
+ case 41:
1384
1389
  case "end":
1385
1390
  return _context8.stop();
1386
1391
  }
1387
1392
  }
1388
- }, _callee8, this, [[18, 28]]);
1393
+ }, _callee8, this, [[18, 29]]);
1389
1394
  }));
1390
1395
 
1391
1396
  function query(_x9) {
@@ -2839,7 +2844,7 @@ var CozyClient = /*#__PURE__*/function () {
2839
2844
  CozyClient.hooks = CozyClient.hooks || {};
2840
2845
  CozyClient.fetchPolicies = _policies.default; //COZY_CLIENT_VERSION_PACKAGE in replaced by babel. See babel config
2841
2846
 
2842
- CozyClient.version = "48.12.1";
2847
+ CozyClient.version = "48.13.1";
2843
2848
 
2844
2849
  _microee.default.mixin(CozyClient);
2845
2850
 
@@ -1,5 +1,4 @@
1
1
  import MockDate from 'mockdate'
2
-
3
2
  import {
4
3
  SCHEMA,
5
4
  TODO_1,
@@ -32,12 +31,14 @@ import {
32
31
  getRawQueryFromState,
33
32
  isQueryExisting,
34
33
  loadQuery,
35
- resetQuery
34
+ resetQuery,
35
+ executeQueryFromState
36
36
  } from './store'
37
37
  import { HasManyFiles, Association, HasMany } from './associations'
38
38
  import mapValues from 'lodash/mapValues'
39
39
  import FileCollection from 'cozy-stack-client/dist/FileCollection'
40
40
  import logger from './logger'
41
+
41
42
  const normalizeData = data =>
42
43
  mapValues(data, (docs, doctype) => {
43
44
  return docs.map(doc => ({
@@ -54,7 +55,8 @@ jest.mock('./store', () => ({
54
55
  ...jest.requireActual('./store'),
55
56
  isQueryExisting: jest.fn().mockReturnValue(false),
56
57
  getQueryFromState: jest.fn().mockReturnValue({}),
57
- getRawQueryFromState: jest.fn().mockReturnValue({})
58
+ getRawQueryFromState: jest.fn().mockReturnValue({}),
59
+ executeQueryFromState: jest.fn().mockReturnValue([])
58
60
  }))
59
61
 
60
62
  describe('CozyClient initialization', () => {
@@ -1228,6 +1230,7 @@ describe('CozyClient', () => {
1228
1230
  beforeEach(() => {
1229
1231
  query = Q('io.cozy.todos')
1230
1232
  fakeResponse = { data: 'FAKE!!!' }
1233
+ jest.clearAllMocks()
1231
1234
  })
1232
1235
  it('should throw an error if the option.enabled is not a boolean', async () => {
1233
1236
  await expect(
@@ -1390,6 +1393,13 @@ describe('CozyClient', () => {
1390
1393
  expect(client.requestQuery).toHaveBeenCalledTimes(1)
1391
1394
  })
1392
1395
 
1396
+ it('should handle the executeFromStore option', async () => {
1397
+ executeQueryFromState.mockReturnValueOnce([])
1398
+ await client.query(query, { executeFromStore: true })
1399
+ expect(requestHandler).toHaveBeenCalledTimes(0)
1400
+ expect(executeQueryFromState).toHaveBeenCalledTimes(1)
1401
+ })
1402
+
1393
1403
  describe('relationship with query failure', () => {
1394
1404
  beforeEach(() => {
1395
1405
  jest.spyOn(HasManyFiles, 'query').mockImplementation(() => {
@@ -37,6 +37,12 @@ Object.defineProperty(exports, "receiveQueryError", {
37
37
  return _queries.receiveQueryError;
38
38
  }
39
39
  });
40
+ Object.defineProperty(exports, "executeQueryFromState", {
41
+ enumerable: true,
42
+ get: function get() {
43
+ return _queries.executeQueryFromState;
44
+ }
45
+ });
40
46
  Object.defineProperty(exports, "initMutation", {
41
47
  enumerable: true,
42
48
  get: function get() {
@@ -55,7 +61,49 @@ Object.defineProperty(exports, "receiveMutationError", {
55
61
  return _mutations.receiveMutationError;
56
62
  }
57
63
  });
58
- exports.resetState = exports.isQueryExisting = exports.getRawQueryFromState = exports.getQueryFromState = exports.getQueryFromStore = exports.getDocumentFromState = exports.getCollectionFromState = exports.getStateRoot = exports.createStore = exports.default = exports.StoreProxy = void 0;
64
+ Object.defineProperty(exports, "getStateRoot", {
65
+ enumerable: true,
66
+ get: function get() {
67
+ return _stateHelpers.getStateRoot;
68
+ }
69
+ });
70
+ Object.defineProperty(exports, "getCollectionFromState", {
71
+ enumerable: true,
72
+ get: function get() {
73
+ return _stateHelpers.getCollectionFromState;
74
+ }
75
+ });
76
+ Object.defineProperty(exports, "getDocumentFromState", {
77
+ enumerable: true,
78
+ get: function get() {
79
+ return _stateHelpers.getDocumentFromState;
80
+ }
81
+ });
82
+ Object.defineProperty(exports, "getQueryFromStore", {
83
+ enumerable: true,
84
+ get: function get() {
85
+ return _stateHelpers.getQueryFromStore;
86
+ }
87
+ });
88
+ Object.defineProperty(exports, "getQueryFromState", {
89
+ enumerable: true,
90
+ get: function get() {
91
+ return _stateHelpers.getQueryFromState;
92
+ }
93
+ });
94
+ Object.defineProperty(exports, "getRawQueryFromState", {
95
+ enumerable: true,
96
+ get: function get() {
97
+ return _stateHelpers.getRawQueryFromState;
98
+ }
99
+ });
100
+ Object.defineProperty(exports, "isQueryExisting", {
101
+ enumerable: true,
102
+ get: function get() {
103
+ return _stateHelpers.isQueryExisting;
104
+ }
105
+ });
106
+ exports.resetState = exports.createStore = exports.default = exports.StoreProxy = void 0;
59
107
 
60
108
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
61
109
 
@@ -69,12 +117,14 @@ var _redux = require("redux");
69
117
 
70
118
  var _reduxThunk = _interopRequireDefault(require("redux-thunk"));
71
119
 
72
- var _documents = _interopRequireWildcard(require("./documents"));
120
+ var _documents = _interopRequireDefault(require("./documents"));
73
121
 
74
122
  var _queries = _interopRequireWildcard(require("./queries"));
75
123
 
76
124
  var _mutations = require("./mutations");
77
125
 
126
+ var _stateHelpers = require("./stateHelpers");
127
+
78
128
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
79
129
 
80
130
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
@@ -172,46 +222,4 @@ var createStore = function createStore() {
172
222
  }), composedEnhancer((0, _redux.applyMiddleware)(_reduxThunk.default)));
173
223
  };
174
224
 
175
- exports.createStore = createStore;
176
-
177
- var getStateRoot = function getStateRoot(state) {
178
- return state.cozy || {};
179
- };
180
-
181
- exports.getStateRoot = getStateRoot;
182
-
183
- var getCollectionFromState = function getCollectionFromState(state, doctype) {
184
- return (0, _documents.getCollectionFromSlice)(getStateRoot(state).documents, doctype);
185
- };
186
-
187
- exports.getCollectionFromState = getCollectionFromState;
188
-
189
- var getDocumentFromState = function getDocumentFromState(state, doctype, id) {
190
- return (0, _documents.getDocumentFromSlice)(getStateRoot(state).documents, doctype, id);
191
- };
192
-
193
- exports.getDocumentFromState = getDocumentFromState;
194
-
195
- var getQueryFromStore = function getQueryFromStore(store, queryId) {
196
- return getQueryFromState(store.getState(), queryId);
197
- };
198
-
199
- exports.getQueryFromStore = getQueryFromStore;
200
-
201
- var getQueryFromState = function getQueryFromState(state, queryId) {
202
- return (0, _queries.getQueryFromSlice)(getStateRoot(state).queries, queryId, getStateRoot(state).documents);
203
- };
204
-
205
- exports.getQueryFromState = getQueryFromState;
206
-
207
- var getRawQueryFromState = function getRawQueryFromState(state, queryId) {
208
- return (0, _queries.getQueryFromSlice)(getStateRoot(state).queries, queryId);
209
- };
210
-
211
- exports.getRawQueryFromState = getRawQueryFromState;
212
-
213
- var isQueryExisting = function isQueryExisting(state, queryId) {
214
- return getStateRoot(state).queries[queryId] !== undefined;
215
- };
216
-
217
- exports.isQueryExisting = isQueryExisting;
225
+ exports.createStore = createStore;
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.QueryIDGenerator = exports.getQueryFromSlice = exports.resetQuery = exports.receiveQueryError = exports.receiveQueryResult = exports.loadQuery = exports.initQuery = exports.default = exports.updateData = exports.makeSorterFromDefinition = exports.mergeSelectorAndPartialIndex = exports.convert$gtNullSelectors = exports.sortAndLimitDocsIds = exports.isReceivingData = exports.isQueryAction = void 0;
8
+ exports.QueryIDGenerator = exports.getQueryFromSlice = exports.resetQuery = exports.receiveQueryError = exports.receiveQueryResult = exports.loadQuery = exports.initQuery = exports.default = exports.updateData = exports.makeSorterFromDefinition = exports.executeQueryFromState = exports.mergeSelectorAndPartialIndex = exports.convert$gtNullSelectors = exports.sortAndLimitDocsIds = exports.isReceivingData = exports.isQueryAction = void 0;
9
9
 
10
10
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
11
 
@@ -51,6 +51,8 @@ var _dsl = require("../queries/dsl");
51
51
 
52
52
  var _logger = _interopRequireDefault(require("../logger"));
53
53
 
54
+ var _stateHelpers = require("./stateHelpers");
55
+
54
56
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
55
57
 
56
58
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
@@ -357,25 +359,59 @@ var getSelectorFilterFn = function getSelectorFilterFn(queryDefinition) {
357
359
  return null;
358
360
  }
359
361
  };
362
+ /**
363
+ * Execute the given query against the document state.
364
+ *
365
+ * @param {import('../types').CozyStore} state - The cozy state
366
+ * @param {QueryDefinition} queryDefinition - The query definition to execute
367
+ * @returns {import("../types").QueryStateData} - The returned documents from the query
368
+ */
369
+
370
+
371
+ var executeQueryFromState = function executeQueryFromState(state, queryDefinition) {
372
+ var documents = (0, _stateHelpers.getCollectionFromState)(state, queryDefinition.doctype);
373
+ var isSingleObjectResponse = !!queryDefinition.id;
374
+
375
+ if (!documents) {
376
+ return {
377
+ data: isSingleObjectResponse ? null : []
378
+ };
379
+ }
380
+
381
+ var res = documents.filter(makeFilterDocumentFn(queryDefinition));
382
+
383
+ if (isSingleObjectResponse) {
384
+ return {
385
+ data: res.length > 0 ? res[0] : null
386
+ };
387
+ }
388
+
389
+ return {
390
+ data: res
391
+ };
392
+ };
360
393
  /**
361
394
  *
362
395
  * Returns a predicate function that checks if a document should be
363
396
  * included in the result of the query.
364
397
  *
365
- * @param {import("../types").QueryState} query - Definition of the query
398
+ * @param {QueryDefinition} queryDefinition - Definition of the query
366
399
  * @returns {function(import("../types").CozyClientDocument): boolean} Predicate function
367
400
  */
368
401
 
369
402
 
370
- var getQueryDocumentsChecker = function getQueryDocumentsChecker(query) {
371
- var qdoctype = query.definition.doctype;
372
- var selectorFilterFn = getSelectorFilterFn(query.definition);
403
+ exports.executeQueryFromState = executeQueryFromState;
404
+
405
+ var makeFilterDocumentFn = function makeFilterDocumentFn(queryDefinition) {
406
+ var qdoctype = queryDefinition.doctype;
407
+ var selectorFilterFn = getSelectorFilterFn(queryDefinition);
373
408
  return function (datum) {
374
409
  var ddoctype = datum._type;
375
410
  if (ddoctype !== qdoctype) return false;
376
411
  if (datum._deleted) return false;
377
- if (!selectorFilterFn) return true;
378
- return !!selectorFilterFn(datum);
412
+ if (!selectorFilterFn) return true; // no selector: query all the docs
413
+
414
+ return !!selectorFilterFn(datum); // evaluate the sift function
379
415
  };
380
416
  };
381
417
 
@@ -439,7 +475,7 @@ var makeSorterFromDefinition = function makeSorterFromDefinition(definition) {
439
475
  exports.makeSorterFromDefinition = makeSorterFromDefinition;
440
476
 
441
477
  var updateData = function updateData(query, newData, documents) {
442
- var belongsToQuery = getQueryDocumentsChecker(query);
478
+ var belongsToQuery = makeFilterDocumentFn(query.definition);
443
479
  var res = (0, _mapValues.default)((0, _groupBy.default)(newData, belongsToQuery), function (docs) {
444
480
  return docs.map(_helpers.properId);
445
481
  });
@@ -7,7 +7,8 @@ import queries, {
7
7
  sortAndLimitDocsIds,
8
8
  loadQuery,
9
9
  receiveQueryError,
10
- updateData
10
+ updateData,
11
+ executeQueryFromState
11
12
  } from './queries'
12
13
  import { Q } from '../queries/dsl'
13
14
  import { TODO_1, TODO_2, TODO_3 } from '../__tests__/fixtures'
@@ -671,3 +672,130 @@ describe('updateData', () => {
671
672
  expect(updatedDataToCheck.count).toEqual(1)
672
673
  })
673
674
  })
675
+
676
+ describe('execute query from state', () => {
677
+ const docState = {
678
+ 'io.cozy.files': {
679
+ '123': {
680
+ _id: '123',
681
+ _type: 'io.cozy.files',
682
+ name: 'well',
683
+ created_at: '2024-01-01'
684
+ },
685
+ '456': {
686
+ _id: '456',
687
+ _type: 'io.cozy.files',
688
+ name: 'hello',
689
+ created_at: '2024-02-01'
690
+ },
691
+ '789': {
692
+ _id: '789',
693
+ _type: 'io.cozy.files',
694
+ name: 'there',
695
+ created_at: '2024-03-01'
696
+ }
697
+ }
698
+ }
699
+ const state = {
700
+ cozy: {
701
+ documents: {
702
+ ...docState
703
+ },
704
+ queries: {}
705
+ }
706
+ }
707
+
708
+ it('should get the correct filtered results from state thanks to selector', () => {
709
+ const query1 = {
710
+ doctype: 'io.cozy.files',
711
+ selector: {
712
+ created_at: {
713
+ $gt: '2024-01-31'
714
+ }
715
+ }
716
+ }
717
+ const res1 = executeQueryFromState(state, query1)
718
+ expect(res1.data.length).toEqual(2)
719
+ expect(res1.data[0]).toEqual(docState['io.cozy.files']['456'])
720
+ expect(res1.data[1]).toEqual(docState['io.cozy.files']['789'])
721
+
722
+ const query2 = {
723
+ doctype: 'io.cozy.files',
724
+ selector: {
725
+ name: 'well'
726
+ }
727
+ }
728
+ const res2 = executeQueryFromState(state, query2)
729
+ expect(res2.data.length).toEqual(1)
730
+ expect(res2.data[0]).toEqual(docState['io.cozy.files']['123'])
731
+
732
+ const query3 = {
733
+ doctype: 'io.cozy.files',
734
+ selector: {
735
+ created_at: {
736
+ $gt: '2024-01-31'
737
+ },
738
+ name: 'hello'
739
+ }
740
+ }
741
+ const res3 = executeQueryFromState(state, query3)
742
+ expect(res3.data.length).toEqual(1)
743
+ expect(res3.data[0]).toEqual(docState['io.cozy.files']['456'])
744
+
745
+ const query4 = {
746
+ doctype: 'io.cozy.files',
747
+ selector: {
748
+ created_at: {
749
+ $gt: '2024-01-30',
750
+ $lt: '2024-01-31'
751
+ }
752
+ }
753
+ }
754
+ const res4 = executeQueryFromState(state, query4)
755
+ expect(res4.data.length).toEqual(0)
756
+ })
757
+
758
+ it('should get the correct filtered results from state thanks to id', () => {
759
+ const query1 = {
760
+ doctype: 'io.cozy.files',
761
+ id: '123'
762
+ }
763
+ const res1 = executeQueryFromState(state, query1)
764
+ expect(res1.data).toEqual(docState['io.cozy.files']['123'])
765
+
766
+ const query2 = {
767
+ doctype: 'io.cozy.files',
768
+ ids: ['123', '789']
769
+ }
770
+ const res2 = executeQueryFromState(state, query2)
771
+ expect(res2.data.length).toEqual(2)
772
+ expect(res2.data[0]).toEqual(docState['io.cozy.files']['123'])
773
+ expect(res2.data[1]).toEqual(docState['io.cozy.files']['789'])
774
+
775
+ const query3 = {
776
+ doctype: 'io.cozy.files',
777
+ id: '-1'
778
+ }
779
+ const res3 = executeQueryFromState(state, query3)
780
+ expect(res3.data).toEqual(null)
781
+ })
782
+
783
+ it('should get all the docs from state for the doctype when no filter', () => {
784
+ const query1 = {
785
+ doctype: 'io.cozy.files'
786
+ }
787
+ const res1 = executeQueryFromState(state, query1)
788
+ expect(res1.data.length).toEqual(3)
789
+ })
790
+
791
+ it('should correctly return when no doc is available', () => {
792
+ const res1 = executeQueryFromState({}, { doctype: 'io.cozy.files' })
793
+ expect(res1.data).toEqual([])
794
+
795
+ const res2 = executeQueryFromState(
796
+ {},
797
+ { doctype: 'io.cozy.files', id: '123' }
798
+ )
799
+ expect(res2.data).toEqual(null)
800
+ })
801
+ })
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isQueryExisting = exports.getRawQueryFromState = exports.getQueryFromState = exports.getQueryFromStore = exports.getDocumentFromState = exports.getCollectionFromState = exports.getStateRoot = void 0;
7
+
8
+ var _documents = require("./documents");
9
+
10
+ var _queries = require("./queries");
11
+
12
+ var getStateRoot = function getStateRoot(state) {
13
+ return state.cozy || {};
14
+ };
15
+
16
+ exports.getStateRoot = getStateRoot;
17
+
18
+ var getCollectionFromState = function getCollectionFromState(state, doctype) {
19
+ return (0, _documents.getCollectionFromSlice)(getStateRoot(state).documents, doctype);
20
+ };
21
+
22
+ exports.getCollectionFromState = getCollectionFromState;
23
+
24
+ var getDocumentFromState = function getDocumentFromState(state, doctype, id) {
25
+ return (0, _documents.getDocumentFromSlice)(getStateRoot(state).documents, doctype, id);
26
+ };
27
+
28
+ exports.getDocumentFromState = getDocumentFromState;
29
+
30
+ var getQueryFromStore = function getQueryFromStore(store, queryId) {
31
+ return getQueryFromState(store.getState(), queryId);
32
+ };
33
+
34
+ exports.getQueryFromStore = getQueryFromStore;
35
+
36
+ var getQueryFromState = function getQueryFromState(state, queryId) {
37
+ return (0, _queries.getQueryFromSlice)(getStateRoot(state).queries, queryId, getStateRoot(state).documents);
38
+ };
39
+
40
+ exports.getQueryFromState = getQueryFromState;
41
+
42
+ var getRawQueryFromState = function getRawQueryFromState(state, queryId) {
43
+ return (0, _queries.getQueryFromSlice)(getStateRoot(state).queries, queryId);
44
+ };
45
+
46
+ exports.getRawQueryFromState = getRawQueryFromState;
47
+
48
+ var isQueryExisting = function isQueryExisting(state, queryId) {
49
+ return getStateRoot(state).queries[queryId] !== undefined;
50
+ };
51
+
52
+ exports.isQueryExisting = isQueryExisting;
package/dist/types.js CHANGED
@@ -220,6 +220,17 @@ var _dsl = require("./queries/dsl");
220
220
  * @property {Boolean} [encrypted] - encrypted value of the field (legacy)
221
221
  */
222
222
 
223
+ /**
224
+ * @typedef {object} CozyState
225
+ * @property {DocumentsStateSlice} documents
226
+ * @property {QueriesStateSlice} queries
227
+ */
228
+
229
+ /**
230
+ * @typedef {object} CozyStore
231
+ * @property {CozyState} cozy
232
+ */
233
+
223
234
  /**
224
235
  * @typedef {{
225
236
  * [key: string]: ManifestField;
@@ -297,6 +308,7 @@ var _dsl = require("./queries/dsl");
297
308
  * @property {boolean} [singleDocData] - If true, the "data" returned will be
298
309
  * a single doc instead of an array for single doc queries. Defaults to false for backward
299
310
  * compatibility but will be set to true in the future.
311
+ * @property {boolean} [executeFromStore=false] - If set to true, the query will be run directly on the current store's state
300
312
  */
301
313
 
302
314
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cozy-client",
3
- "version": "48.12.1",
3
+ "version": "48.13.1",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.node.js",
6
6
  "browser": "dist/index.js",
@@ -75,5 +75,5 @@
75
75
  "react-native-ios11-devicecheck": "https://github.com/cozy/react-native-devicecheck#app-attest-v0.1"
76
76
  },
77
77
  "sideEffects": false,
78
- "gitHead": "fd65271404d88a5851357225f1b5a3f48cec9f50"
78
+ "gitHead": "594fe6381a442bd4e96a9cbba55ffc7eed6f078a"
79
79
  }
@@ -422,7 +422,7 @@ declare class CozyClient {
422
422
  * @param {import("./types").QueryOptions} [options] - Options
423
423
  * @returns {Promise<import("./types").QueryResult>}
424
424
  */
425
- query(queryDefinition: QueryDefinition, { update, ...options }?: import("./types").QueryOptions): Promise<import("./types").QueryResult>;
425
+ query(queryDefinition: QueryDefinition, { update, executeFromStore, ...options }?: import("./types").QueryOptions): Promise<import("./types").QueryResult>;
426
426
  /**
427
427
  * Will fetch all documents for a `queryDefinition`, automatically fetching more
428
428
  * documents if the total of documents is superior to the pagination limit. Can
@@ -8,13 +8,6 @@ export class StoreProxy {
8
8
  }
9
9
  export default combinedReducer;
10
10
  export function createStore(): any;
11
- export function getStateRoot(state: any): any;
12
- export function getCollectionFromState(state: any, doctype: any): any[];
13
- export function getDocumentFromState(state: any, doctype: any, id: any): any;
14
- export function getQueryFromStore(store: any, queryId: any): any;
15
- export function getQueryFromState(state: any, queryId: any): any;
16
- export function getRawQueryFromState(state: any, queryId: any): any;
17
- export function isQueryExisting(state: any, queryId: any): boolean;
18
11
  declare function combinedReducer(state: {
19
12
  documents: {};
20
13
  queries: {};
@@ -25,5 +18,6 @@ declare function combinedReducer(state: {
25
18
  export function resetState(): {
26
19
  type: string;
27
20
  };
28
- export { initQuery, loadQuery, resetQuery, receiveQueryResult, receiveQueryError } from "./queries";
21
+ export { getStateRoot, getCollectionFromState, getDocumentFromState, getQueryFromStore, getQueryFromState, getRawQueryFromState, isQueryExisting } from "./stateHelpers";
22
+ export { initQuery, loadQuery, resetQuery, receiveQueryResult, receiveQueryError, executeQueryFromState } from "./queries";
29
23
  export { initMutation, receiveMutationResult, receiveMutationError } from "./mutations";
@@ -6,6 +6,7 @@ export function sortAndLimitDocsIds(queryState: import("../types").QueryState, d
6
6
  }): Array<string>;
7
7
  export function convert$gtNullSelectors(selector: any): object;
8
8
  export function mergeSelectorAndPartialIndex(queryDefinition: object): object;
9
+ export function executeQueryFromState(state: import('../types').CozyStore, queryDefinition: QueryDefinition): import("../types").QueryStateData;
9
10
  export function makeSorterFromDefinition(definition: QueryDefinition): (arg0: Array<import("../types").CozyClientDocument>) => Array<import("../types").CozyClientDocument>;
10
11
  export function updateData(query: import("../types").QueryState, newData: Array<import("../types").CozyClientDocument>, documents: import("../types").DocumentsStateSlice): import("../types").QueryState;
11
12
  export default queries;
@@ -0,0 +1,7 @@
1
+ export function getStateRoot(state: any): any;
2
+ export function getCollectionFromState(state: any, doctype: any): any[];
3
+ export function getDocumentFromState(state: any, doctype: any, id: any): any;
4
+ export function getQueryFromStore(store: any, queryId: any): any;
5
+ export function getQueryFromState(state: any, queryId: any): any;
6
+ export function getRawQueryFromState(state: any, queryId: any): any;
7
+ export function isQueryExisting(state: any, queryId: any): boolean;
package/types/types.d.ts CHANGED
@@ -467,6 +467,13 @@ export type ManifestField = {
467
467
  */
468
468
  encrypted?: boolean;
469
469
  };
470
+ export type CozyState = {
471
+ documents: DocumentsStateSlice;
472
+ queries: QueriesStateSlice;
473
+ };
474
+ export type CozyStore = {
475
+ cozy: CozyState;
476
+ };
470
477
  export type ManifestFields = {
471
478
  [key: string]: ManifestField;
472
479
  };
@@ -542,6 +549,10 @@ export type QueryOptions = {
542
549
  * compatibility but will be set to true in the future.
543
550
  */
544
551
  singleDocData?: boolean;
552
+ /**
553
+ * - If set to true, the query will be run directly on the current store's state
554
+ */
555
+ executeFromStore?: boolean;
545
556
  };
546
557
  export type Query = {
547
558
  definition: QueryDefinition;