cozy-pouch-link 57.5.0 → 57.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.
Files changed (45) hide show
  1. package/dist/CozyPouchLink.js +234 -470
  2. package/dist/CozyPouchLink.spec.js +6 -147
  3. package/dist/PouchManager.js +43 -8
  4. package/dist/PouchManager.spec.js +21 -12
  5. package/dist/__mocks__/@op-engineering/op-sqlite.js +11 -0
  6. package/dist/db/dbInterface.js +190 -0
  7. package/dist/db/helpers.js +128 -0
  8. package/dist/db/pouchdb/getDocs.js +157 -0
  9. package/dist/db/pouchdb/getDocs.spec.js +63 -0
  10. package/dist/db/pouchdb/pouchdb.js +264 -0
  11. package/dist/db/pouchdb/pouchdb.spec.js +151 -0
  12. package/dist/db/sqlite/sql.js +422 -0
  13. package/dist/db/sqlite/sql.spec.js +419 -0
  14. package/dist/db/sqlite/sqliteDb.js +41 -0
  15. package/dist/db/sqlite/sqliteDb.native.js +317 -0
  16. package/dist/errors.js +17 -2
  17. package/dist/helpers.js +21 -147
  18. package/dist/helpers.spec.js +1 -98
  19. package/dist/index.js +9 -1
  20. package/dist/jsonapi.js +57 -21
  21. package/dist/jsonapi.spec.js +105 -32
  22. package/dist/mango.js +146 -3
  23. package/dist/migrations/pouchdb.js +32 -0
  24. package/dist/replicateOnce.js +25 -23
  25. package/dist/types.js +5 -0
  26. package/dist/utils.js +33 -3
  27. package/package.json +5 -3
  28. package/types/CozyPouchLink.d.ts +6 -63
  29. package/types/PouchManager.d.ts +6 -1
  30. package/types/__mocks__/@op-engineering/op-sqlite.d.ts +1 -0
  31. package/types/db/dbInterface.d.ts +117 -0
  32. package/types/db/helpers.d.ts +4 -0
  33. package/types/db/pouchdb/getDocs.d.ts +18 -0
  34. package/types/db/pouchdb/pouchdb.d.ts +8 -0
  35. package/types/db/sqlite/sql.d.ts +45 -0
  36. package/types/db/sqlite/sqliteDb.d.ts +4 -0
  37. package/types/db/sqlite/sqliteDb.native.d.ts +7 -0
  38. package/types/errors.d.ts +2 -0
  39. package/types/helpers.d.ts +1 -4
  40. package/types/index.d.ts +1 -0
  41. package/types/jsonapi.d.ts +4 -2
  42. package/types/mango.d.ts +19 -1
  43. package/types/migrations/pouchdb.d.ts +1 -0
  44. package/types/types.d.ts +2 -0
  45. package/types/utils.d.ts +3 -0
@@ -0,0 +1,317 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+
12
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
+
14
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
15
+
16
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
17
+
18
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
19
+
20
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
21
+
22
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
23
+
24
+ var _dbInterface = _interopRequireDefault(require("../dbInterface"));
25
+
26
+ var _opSqlite = require("@op-engineering/op-sqlite");
27
+
28
+ var _sql = require("./sql");
29
+
30
+ var _mango = require("../../mango");
31
+
32
+ var _errors = require("../../errors");
33
+
34
+ var _logger = _interopRequireDefault(require("../../logger"));
35
+
36
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
37
+
38
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
39
+
40
+ var SQLiteQueryEngine = /*#__PURE__*/function (_DatabaseQueryEngine) {
41
+ (0, _inherits2.default)(SQLiteQueryEngine, _DatabaseQueryEngine);
42
+
43
+ var _super = _createSuper(SQLiteQueryEngine);
44
+
45
+ function SQLiteQueryEngine(pouchManager, doctype) {
46
+ var _this;
47
+
48
+ (0, _classCallCheck2.default)(this, SQLiteQueryEngine);
49
+ _this = _super.call(this);
50
+ _this.db = null;
51
+ _this.client = pouchManager === null || pouchManager === void 0 ? void 0 : pouchManager.client;
52
+ _this.doctype = doctype;
53
+ return _this;
54
+ }
55
+
56
+ (0, _createClass2.default)(SQLiteQueryEngine, [{
57
+ key: "openDB",
58
+ value: function openDB(dbName) {
59
+ var fileDbName = "".concat(dbName, ".sqlite");
60
+
61
+ try {
62
+ this.db = (0, _opSqlite.open)({
63
+ name: fileDbName
64
+ }); // Create index at db opening if needed
65
+
66
+ var docIdIndexSql = (0, _sql.makeSQLCreateDocIDIndex)();
67
+ var deletedIndexSql = (0, _sql.makeSQLCreateDeletedIndex)();
68
+ (0, _sql.executeSQL)(this.db, docIdIndexSql);
69
+ (0, _sql.executeSQL)(this.db, deletedIndexSql);
70
+ } catch (err) {
71
+ _logger.default.error(err);
72
+ }
73
+ }
74
+ }, {
75
+ key: "allDocs",
76
+ value: function () {
77
+ var _allDocs = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
78
+ var _ref,
79
+ _ref$limit,
80
+ limit,
81
+ _ref$skip,
82
+ skip,
83
+ sql,
84
+ result,
85
+ docs,
86
+ _args = arguments;
87
+
88
+ return _regenerator.default.wrap(function _callee$(_context) {
89
+ while (1) {
90
+ switch (_context.prev = _context.next) {
91
+ case 0:
92
+ _ref = _args.length > 0 && _args[0] !== undefined ? _args[0] : {}, _ref$limit = _ref.limit, limit = _ref$limit === void 0 ? -1 : _ref$limit, _ref$skip = _ref.skip, skip = _ref$skip === void 0 ? 0 : _ref$skip;
93
+ _context.prev = 1;
94
+ sql = (0, _sql.makeSQLQueryAll)({
95
+ limit: limit,
96
+ skip: skip
97
+ });
98
+ _context.next = 5;
99
+ return (0, _sql.executeSQL)(this.db, sql);
100
+
101
+ case 5:
102
+ result = _context.sent;
103
+ docs = (0, _sql.parseResults)(this.client, result, this.doctype, {
104
+ limit: limit,
105
+ skip: skip
106
+ });
107
+ return _context.abrupt("return", docs);
108
+
109
+ case 10:
110
+ _context.prev = 10;
111
+ _context.t0 = _context["catch"](1);
112
+
113
+ _logger.default.error(_context.t0);
114
+
115
+ return _context.abrupt("return", null);
116
+
117
+ case 14:
118
+ case "end":
119
+ return _context.stop();
120
+ }
121
+ }
122
+ }, _callee, this, [[1, 10]]);
123
+ }));
124
+
125
+ function allDocs() {
126
+ return _allDocs.apply(this, arguments);
127
+ }
128
+
129
+ return allDocs;
130
+ }()
131
+ }, {
132
+ key: "getById",
133
+ value: function () {
134
+ var _getById = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(id) {
135
+ var sql, result, doc;
136
+ return _regenerator.default.wrap(function _callee2$(_context2) {
137
+ while (1) {
138
+ switch (_context2.prev = _context2.next) {
139
+ case 0:
140
+ _context2.prev = 0;
141
+ sql = (0, _sql.makeSQLQueryForId)(id);
142
+ _context2.next = 4;
143
+ return (0, _sql.executeSQL)(this.db, sql);
144
+
145
+ case 4:
146
+ result = _context2.sent;
147
+ doc = (0, _sql.parseResults)(this.client, result, this.doctype, {
148
+ isSingleDoc: true
149
+ });
150
+ return _context2.abrupt("return", doc);
151
+
152
+ case 9:
153
+ _context2.prev = 9;
154
+ _context2.t0 = _context2["catch"](0);
155
+
156
+ _logger.default.error(_context2.t0);
157
+
158
+ return _context2.abrupt("return", null);
159
+
160
+ case 13:
161
+ case "end":
162
+ return _context2.stop();
163
+ }
164
+ }
165
+ }, _callee2, this, [[0, 9]]);
166
+ }));
167
+
168
+ function getById(_x) {
169
+ return _getById.apply(this, arguments);
170
+ }
171
+
172
+ return getById;
173
+ }()
174
+ }, {
175
+ key: "getByIds",
176
+ value: function () {
177
+ var _getByIds = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(ids) {
178
+ var sql, result, docs;
179
+ return _regenerator.default.wrap(function _callee3$(_context3) {
180
+ while (1) {
181
+ switch (_context3.prev = _context3.next) {
182
+ case 0:
183
+ _context3.prev = 0;
184
+ sql = (0, _sql.makeSQLQueryForIds)(ids);
185
+ _context3.next = 4;
186
+ return (0, _sql.executeSQL)(this.db, sql);
187
+
188
+ case 4:
189
+ result = _context3.sent;
190
+ docs = (0, _sql.parseResults)(this.client, result, this.doctype);
191
+ return _context3.abrupt("return", docs);
192
+
193
+ case 9:
194
+ _context3.prev = 9;
195
+ _context3.t0 = _context3["catch"](0);
196
+
197
+ _logger.default.error(_context3.t0);
198
+
199
+ return _context3.abrupt("return", null);
200
+
201
+ case 13:
202
+ case "end":
203
+ return _context3.stop();
204
+ }
205
+ }
206
+ }, _callee3, this, [[0, 9]]);
207
+ }));
208
+
209
+ function getByIds(_x2) {
210
+ return _getByIds.apply(this, arguments);
211
+ }
212
+
213
+ return getByIds;
214
+ }()
215
+ }, {
216
+ key: "find",
217
+ value: function () {
218
+ var _find = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(options) {
219
+ var selector, sort, partialFilter, limit, recreateIndex, skip, indexedFields, indexName, sql, result, docs;
220
+ return _regenerator.default.wrap(function _callee4$(_context4) {
221
+ while (1) {
222
+ switch (_context4.prev = _context4.next) {
223
+ case 0:
224
+ selector = options.selector, sort = options.sort, partialFilter = options.partialFilter, limit = options.limit, recreateIndex = options.recreateIndex, skip = options.skip;
225
+ indexedFields = options.indexedFields;
226
+ indexedFields = (0, _mango.getIndexFields)({
227
+ indexedFields: indexedFields,
228
+ selector: selector,
229
+ sort: sort,
230
+ partialFilter: partialFilter
231
+ });
232
+ indexName = (0, _mango.getIndexName)({
233
+ selector: selector,
234
+ sort: sort,
235
+ partialFilter: partialFilter,
236
+ indexedFields: indexedFields
237
+ });
238
+ sql = (0, _sql.makeSQLQueryFromMango)({
239
+ selector: selector,
240
+ sort: sort,
241
+ indexName: indexName,
242
+ limit: limit,
243
+ skip: skip
244
+ });
245
+
246
+ if (!recreateIndex) {
247
+ _context4.next = 8;
248
+ break;
249
+ }
250
+
251
+ _context4.next = 8;
252
+ return (0, _sql.deleteIndex)(this.db, indexName);
253
+
254
+ case 8:
255
+ _context4.prev = 8;
256
+ _context4.next = 11;
257
+ return (0, _sql.executeSQL)(this.db, sql);
258
+
259
+ case 11:
260
+ result = _context4.sent;
261
+ _context4.next = 26;
262
+ break;
263
+
264
+ case 14:
265
+ _context4.prev = 14;
266
+ _context4.t0 = _context4["catch"](8);
267
+
268
+ if (!(0, _errors.isMissingSQLiteIndexError)(_context4.t0)) {
269
+ _context4.next = 24;
270
+ break;
271
+ }
272
+
273
+ _context4.next = 19;
274
+ return (0, _sql.createMangoIndex)(this.db, indexName, indexedFields, {
275
+ partialFilter: partialFilter
276
+ });
277
+
278
+ case 19:
279
+ _context4.next = 21;
280
+ return (0, _sql.executeSQL)(this.db, sql);
281
+
282
+ case 21:
283
+ result = _context4.sent;
284
+ _context4.next = 26;
285
+ break;
286
+
287
+ case 24:
288
+ _logger.default.error(_context4.t0);
289
+
290
+ return _context4.abrupt("return", null);
291
+
292
+ case 26:
293
+ docs = (0, _sql.parseResults)(this.client, result, this.doctype, {
294
+ skip: skip,
295
+ limit: limit
296
+ });
297
+ return _context4.abrupt("return", docs);
298
+
299
+ case 28:
300
+ case "end":
301
+ return _context4.stop();
302
+ }
303
+ }
304
+ }, _callee4, this, [[8, 14]]);
305
+ }));
306
+
307
+ function find(_x3) {
308
+ return _find.apply(this, arguments);
309
+ }
310
+
311
+ return find;
312
+ }()
313
+ }]);
314
+ return SQLiteQueryEngine;
315
+ }(_dbInterface.default);
316
+
317
+ exports.default = SQLiteQueryEngine;
package/dist/errors.js CHANGED
@@ -3,10 +3,13 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.isExpiredTokenError = void 0;
6
+ exports.isMissingPouchDBIndexError = exports.isMissingSQLiteIndexError = exports.isExpiredTokenError = void 0;
7
7
  var EXPIRED_TOKEN_ERROR = /Expired token/;
8
8
  var INVALID_TOKEN_ERROR = /Invalid JWT token/;
9
9
  var INVALID_TOKEN_ALT_ERROR = /Invalid token/;
10
+ var SQLITE_MISSING_INDEX_ERROR = /no such index/;
11
+ var POUCHDB_MISSING_INDEX_ERROR = /Could not find that index/;
12
+ var POUCHDB_MISSING_INDEX_ERROR_ALT = /no index/;
10
13
 
11
14
  var expiredTokenError = function expiredTokenError(error) {
12
15
  var errorMsg = error.message;
@@ -26,4 +29,16 @@ var isExpiredTokenError = function isExpiredTokenError(error) {
26
29
  return expiredTokenError(error);
27
30
  };
28
31
 
29
- exports.isExpiredTokenError = isExpiredTokenError;
32
+ exports.isExpiredTokenError = isExpiredTokenError;
33
+
34
+ var isMissingSQLiteIndexError = function isMissingSQLiteIndexError(error) {
35
+ return SQLITE_MISSING_INDEX_ERROR.test(error.message);
36
+ };
37
+
38
+ exports.isMissingSQLiteIndexError = isMissingSQLiteIndexError;
39
+
40
+ var isMissingPouchDBIndexError = function isMissingPouchDBIndexError(error) {
41
+ return POUCHDB_MISSING_INDEX_ERROR.test(error.message) || POUCHDB_MISSING_INDEX_ERROR_ALT.test(error.message);
42
+ };
43
+
44
+ exports.isMissingPouchDBIndexError = isMissingPouchDBIndexError;
package/dist/helpers.js CHANGED
@@ -5,166 +5,40 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.default = void 0;
8
+ exports.default = exports.LIMIT_BUG = void 0;
9
9
 
10
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
11
 
12
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
12
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
13
13
 
14
14
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
15
15
 
16
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
17
-
18
16
  var _merge = _interopRequireDefault(require("lodash/merge"));
19
17
 
20
18
  var _startsWith = _interopRequireDefault(require("lodash/startsWith"));
21
19
 
22
20
  var _logger = _interopRequireDefault(require("./logger"));
23
21
 
22
+ 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; }
23
+
24
+ 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; }
25
+
24
26
  function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { 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(_e) { throw _e; }, 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 = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
25
27
 
26
28
  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); }
27
29
 
28
30
  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; }
29
31
 
30
- 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; }
31
-
32
- 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; }
33
-
34
32
  var helpers = {}; // https://github.com/pouchdb/pouchdb/issues/7011
35
33
 
36
34
  var LIMIT_BUG = 999;
35
+ exports.LIMIT_BUG = LIMIT_BUG;
37
36
  var ADAPTERS_WITH_LIMIT_BUG = ['websql'];
38
37
 
39
38
  helpers.isAdapterBugged = function (adapterName) {
40
39
  return ADAPTERS_WITH_LIMIT_BUG.includes(adapterName);
41
40
  };
42
41
 
43
- helpers.withoutDesignDocuments = function (res) {
44
- var rows = res.rows.filter(function (doc) {
45
- return !(0, _startsWith.default)(doc.id, '_design/');
46
- });
47
- return _objectSpread(_objectSpread({}, res), {}, {
48
- rows: rows,
49
- total_rows: rows.length
50
- });
51
- };
52
-
53
- helpers.getDocs = /*#__PURE__*/function () {
54
- var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(db, fct) {
55
- var options,
56
- limit,
57
- field,
58
- data,
59
- next,
60
- _args = arguments;
61
- return _regenerator.default.wrap(function _callee$(_context) {
62
- while (1) {
63
- switch (_context.prev = _context.next) {
64
- case 0:
65
- options = _args.length > 2 && _args[2] !== undefined ? _args[2] : {};
66
- // allDocs return an error when limit is null
67
- if (options.limit === null) delete options.limit;
68
- limit = options.limit;
69
- field = fct === 'allDocs' ? 'rows' : 'docs';
70
-
71
- if (helpers.isAdapterBugged(db.adapter)) {
72
- if (limit === undefined || limit > LIMIT_BUG) {
73
- options.limit = LIMIT_BUG;
74
- options.skip = options.skip || 0;
75
- }
76
- }
77
-
78
- _context.next = 7;
79
- return db[fct](options);
80
-
81
- case 7:
82
- data = _context.sent;
83
-
84
- if (!(data[field].length === options.limit)) {
85
- _context.next = 16;
86
- break;
87
- }
88
-
89
- options.skip = (options.skip ? options.skip : 0) + options.limit;
90
- options.limit = limit ? limit - options.limit : undefined;
91
-
92
- if (!(options.limit > 0 || options.limit === undefined)) {
93
- _context.next = 16;
94
- break;
95
- }
96
-
97
- _context.next = 14;
98
- return helpers.getDocs(db, fct, options);
99
-
100
- case 14:
101
- next = _context.sent;
102
- return _context.abrupt("return", _objectSpread(_objectSpread({}, data), {}, (0, _defineProperty2.default)({}, field, [].concat((0, _toConsumableArray2.default)(data[field]), (0, _toConsumableArray2.default)(next[field])))));
103
-
104
- case 16:
105
- return _context.abrupt("return", data);
106
-
107
- case 17:
108
- case "end":
109
- return _context.stop();
110
- }
111
- }
112
- }, _callee);
113
- }));
114
-
115
- return function (_x, _x2) {
116
- return _ref.apply(this, arguments);
117
- };
118
- }();
119
-
120
- helpers.allDocs = /*#__PURE__*/function () {
121
- var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(db) {
122
- var options,
123
- _args2 = arguments;
124
- return _regenerator.default.wrap(function _callee2$(_context2) {
125
- while (1) {
126
- switch (_context2.prev = _context2.next) {
127
- case 0:
128
- options = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : {};
129
- return _context2.abrupt("return", helpers.getDocs(db, 'allDocs', options));
130
-
131
- case 2:
132
- case "end":
133
- return _context2.stop();
134
- }
135
- }
136
- }, _callee2);
137
- }));
138
-
139
- return function (_x3) {
140
- return _ref2.apply(this, arguments);
141
- };
142
- }();
143
-
144
- helpers.find = /*#__PURE__*/function () {
145
- var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(db) {
146
- var options,
147
- _args3 = arguments;
148
- return _regenerator.default.wrap(function _callee3$(_context3) {
149
- while (1) {
150
- switch (_context3.prev = _context3.next) {
151
- case 0:
152
- options = _args3.length > 1 && _args3[1] !== undefined ? _args3[1] : {};
153
- return _context3.abrupt("return", helpers.getDocs(db, 'find', options));
154
-
155
- case 2:
156
- case "end":
157
- return _context3.stop();
158
- }
159
- }
160
- }, _callee3);
161
- }));
162
-
163
- return function (_x4) {
164
- return _ref3.apply(this, arguments);
165
- };
166
- }();
167
-
168
42
  helpers.isDesignDocument = function (doc) {
169
43
  return (0, _startsWith.default)(doc._id, '_design');
170
44
  };
@@ -174,33 +48,33 @@ helpers.isDeletedDocument = function (doc) {
174
48
  };
175
49
 
176
50
  helpers.insertBulkDocs = /*#__PURE__*/function () {
177
- var _ref4 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(db, docs) {
178
- return _regenerator.default.wrap(function _callee4$(_context4) {
51
+ var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(db, docs) {
52
+ return _regenerator.default.wrap(function _callee$(_context) {
179
53
  while (1) {
180
- switch (_context4.prev = _context4.next) {
54
+ switch (_context.prev = _context.next) {
181
55
  case 0:
182
- return _context4.abrupt("return", db.bulkDocs(docs, {
56
+ return _context.abrupt("return", db.bulkDocs(docs, {
183
57
  new_edits: false
184
58
  }));
185
59
 
186
60
  case 1:
187
61
  case "end":
188
- return _context4.stop();
62
+ return _context.stop();
189
63
  }
190
64
  }
191
- }, _callee4);
65
+ }, _callee);
192
66
  }));
193
67
 
194
- return function (_x5, _x6) {
195
- return _ref4.apply(this, arguments);
68
+ return function (_x, _x2) {
69
+ return _ref.apply(this, arguments);
196
70
  };
197
71
  }();
198
72
 
199
- helpers.normalizeFindSelector = function (_ref5) {
200
- var selector = _ref5.selector,
201
- sort = _ref5.sort,
202
- indexedFields = _ref5.indexedFields,
203
- partialFilter = _ref5.partialFilter;
73
+ helpers.normalizeFindSelector = function (_ref2) {
74
+ var selector = _ref2.selector,
75
+ sort = _ref2.sort,
76
+ indexedFields = _ref2.indexedFields,
77
+ partialFilter = _ref2.partialFilter;
204
78
  var findSelector = selector || {};
205
79
 
206
80
  if (indexedFields) {
@@ -1,104 +1,7 @@
1
1
  import helpers from './helpers'
2
- const {
3
- withoutDesignDocuments,
4
- isDeletedDocument,
5
- isDesignDocument,
6
- normalizeFindSelector
7
- } = helpers
8
-
9
- import PouchDB from 'pouchdb-browser'
10
- import PouchDBFind from 'pouchdb-find'
11
- import adapter from 'pouchdb-adapter-memory'
12
- PouchDB.plugin(PouchDBFind)
13
- PouchDB.plugin(adapter)
14
-
15
- const insertData = async (db, number) => {
16
- const docs = []
17
- for (let i = 0; i < number; i++) {
18
- docs.push({ _id: `doc${i}`, status: true })
19
- }
20
- await db.bulkDocs(docs)
21
- }
2
+ const { isDeletedDocument, isDesignDocument, normalizeFindSelector } = helpers
22
3
 
23
4
  describe('Helpers', () => {
24
- describe('withoutDesignDocuments', () => {
25
- let response
26
- beforeEach(() => {
27
- response = {
28
- offset: 0,
29
- rows: [{ id: 'goodId' }, { id: '_design/wrongId' }],
30
- total_rows: 2
31
- }
32
- jest.setTimeout(10000)
33
- })
34
- it('should remove design document', () => {
35
- const filteredResponse = withoutDesignDocuments(response)
36
- expect(filteredResponse.rows.length).toEqual(1)
37
- expect(filteredResponse.rows[0].id).toEqual('goodId')
38
- })
39
- it('should update total rows number', () => {
40
- const filteredResponse = withoutDesignDocuments(response)
41
- expect(filteredResponse.total_rows).toEqual(1)
42
- })
43
- it('should not mutate response', () => {
44
- const responseCopy = { ...response }
45
- withoutDesignDocuments(response)
46
- expect(response).toEqual(responseCopy)
47
- })
48
- })
49
-
50
- for (const getDocs of ['find', 'allDocs']) {
51
- describe(getDocs, () => {
52
- let db, options, field
53
-
54
- beforeEach(async () => {
55
- db = new PouchDB('test', { adapter: 'memory' })
56
- if (getDocs === 'find') {
57
- options = { selector: { status: { $eq: true } } }
58
- await db.createIndex({ index: { fields: ['status'] } })
59
- field = 'docs'
60
- } else {
61
- options = {}
62
- field = 'rows'
63
- }
64
- })
65
-
66
- afterEach(async () => {
67
- await db.destroy()
68
- })
69
-
70
- it('should find 200 docs', async () => {
71
- await insertData(db, 200)
72
- const data = await helpers[getDocs](db, options)
73
- expect(data[field]).toHaveLength(200)
74
- })
75
-
76
- it('should find 20 docs with limit', async () => {
77
- await insertData(db, 200)
78
- const data = await helpers[getDocs](db, { ...options, limit: 20 })
79
- expect(data[field]).toHaveLength(20)
80
- })
81
-
82
- it('should find 2000 docs', async () => {
83
- jest.spyOn(helpers, 'isAdapterBugged').mockReturnValue(true)
84
- jest.spyOn(db, getDocs)
85
- await insertData(db, 2000)
86
- const data = await helpers[getDocs](db, options)
87
- expect(data[field]).toHaveLength(2000)
88
- expect(db[getDocs]).toHaveBeenCalledTimes(3)
89
- })
90
-
91
- it('should find 1000 docs', async () => {
92
- jest.spyOn(helpers, 'isAdapterBugged').mockReturnValue(true)
93
- jest.spyOn(db, getDocs)
94
- await insertData(db, 2000)
95
- const data = await helpers[getDocs](db, { ...options, limit: 1000 })
96
- expect(data[field]).toHaveLength(1000)
97
- expect(db[getDocs]).toHaveBeenCalledTimes(2)
98
- })
99
- })
100
- }
101
-
102
5
  describe('isDesignDocument', () => {
103
6
  it('should return true when given a design document', () => {
104
7
  expect(isDesignDocument({ _id: '_design/something' })).toBe(true)
package/dist/index.js CHANGED
@@ -11,5 +11,13 @@ Object.defineProperty(exports, "default", {
11
11
  return _CozyPouchLink.default;
12
12
  }
13
13
  });
14
+ Object.defineProperty(exports, "SQLiteQuery", {
15
+ enumerable: true,
16
+ get: function get() {
17
+ return _sqliteDb.default;
18
+ }
19
+ });
20
+
21
+ var _CozyPouchLink = _interopRequireDefault(require("./CozyPouchLink"));
14
22
 
15
- var _CozyPouchLink = _interopRequireDefault(require("./CozyPouchLink"));
23
+ var _sqliteDb = _interopRequireDefault(require("./db/sqlite/sqliteDb"));