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.
- package/dist/CozyClient.js +21 -16
- package/dist/CozyClient.spec.js +13 -3
- package/dist/store/index.js +53 -45
- package/dist/store/queries.js +44 -8
- package/dist/store/queries.spec.js +129 -1
- package/dist/store/stateHelpers.js +52 -0
- package/dist/types.js +12 -0
- package/package.json +2 -2
- package/types/CozyClient.d.ts +1 -1
- package/types/store/index.d.ts +2 -8
- package/types/store/queries.d.ts +1 -0
- package/types/store/stateHelpers.d.ts +7 -0
- package/types/types.d.ts +11 -0
package/dist/CozyClient.js
CHANGED
|
@@ -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
|
-
|
|
1341
|
-
|
|
1342
|
+
requestFn = executeFromStore ? function () {
|
|
1343
|
+
return Promise.resolve((0, _store.executeQueryFromState)(_this4.store.getState(), queryDefinition));
|
|
1344
|
+
} : function () {
|
|
1342
1345
|
return _this4.requestQuery(queryDefinition);
|
|
1343
|
-
}
|
|
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
|
|
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
|
|
1356
|
-
_context8.prev =
|
|
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 =
|
|
1366
|
+
_context8.next = 36;
|
|
1362
1367
|
break;
|
|
1363
1368
|
}
|
|
1364
1369
|
|
|
1365
1370
|
options.onError(_context8.t0); // defaulted onError
|
|
1366
1371
|
|
|
1367
|
-
_context8.next =
|
|
1372
|
+
_context8.next = 41;
|
|
1368
1373
|
break;
|
|
1369
1374
|
|
|
1370
|
-
case
|
|
1375
|
+
case 36:
|
|
1371
1376
|
if (!this.options.onError) {
|
|
1372
|
-
_context8.next =
|
|
1377
|
+
_context8.next = 40;
|
|
1373
1378
|
break;
|
|
1374
1379
|
}
|
|
1375
1380
|
|
|
1376
1381
|
this.options.onError(_context8.t0);
|
|
1377
|
-
_context8.next =
|
|
1382
|
+
_context8.next = 41;
|
|
1378
1383
|
break;
|
|
1379
1384
|
|
|
1380
|
-
case
|
|
1385
|
+
case 40:
|
|
1381
1386
|
throw _context8.t0;
|
|
1382
1387
|
|
|
1383
|
-
case
|
|
1388
|
+
case 41:
|
|
1384
1389
|
case "end":
|
|
1385
1390
|
return _context8.stop();
|
|
1386
1391
|
}
|
|
1387
1392
|
}
|
|
1388
|
-
}, _callee8, this, [[18,
|
|
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.
|
|
2847
|
+
CozyClient.version = "48.13.1";
|
|
2843
2848
|
|
|
2844
2849
|
_microee.default.mixin(CozyClient);
|
|
2845
2850
|
|
package/dist/CozyClient.spec.js
CHANGED
|
@@ -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(() => {
|
package/dist/store/index.js
CHANGED
|
@@ -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
|
-
|
|
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 =
|
|
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;
|
package/dist/store/queries.js
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
371
|
-
|
|
372
|
-
|
|
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
|
-
|
|
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 =
|
|
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.
|
|
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": "
|
|
78
|
+
"gitHead": "594fe6381a442bd4e96a9cbba55ffc7eed6f078a"
|
|
79
79
|
}
|
package/types/CozyClient.d.ts
CHANGED
|
@@ -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
|
package/types/store/index.d.ts
CHANGED
|
@@ -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 {
|
|
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";
|
package/types/store/queries.d.ts
CHANGED
|
@@ -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;
|