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.
- package/dist/CozyPouchLink.js +234 -470
- package/dist/CozyPouchLink.spec.js +6 -147
- package/dist/PouchManager.js +43 -8
- package/dist/PouchManager.spec.js +21 -12
- package/dist/__mocks__/@op-engineering/op-sqlite.js +11 -0
- package/dist/db/dbInterface.js +190 -0
- package/dist/db/helpers.js +128 -0
- package/dist/db/pouchdb/getDocs.js +157 -0
- package/dist/db/pouchdb/getDocs.spec.js +63 -0
- package/dist/db/pouchdb/pouchdb.js +264 -0
- package/dist/db/pouchdb/pouchdb.spec.js +151 -0
- package/dist/db/sqlite/sql.js +422 -0
- package/dist/db/sqlite/sql.spec.js +419 -0
- package/dist/db/sqlite/sqliteDb.js +41 -0
- package/dist/db/sqlite/sqliteDb.native.js +317 -0
- package/dist/errors.js +17 -2
- package/dist/helpers.js +21 -147
- package/dist/helpers.spec.js +1 -98
- package/dist/index.js +9 -1
- package/dist/jsonapi.js +57 -21
- package/dist/jsonapi.spec.js +105 -32
- package/dist/mango.js +146 -3
- package/dist/migrations/pouchdb.js +32 -0
- package/dist/replicateOnce.js +25 -23
- package/dist/types.js +5 -0
- package/dist/utils.js +33 -3
- package/package.json +5 -3
- package/types/CozyPouchLink.d.ts +6 -63
- package/types/PouchManager.d.ts +6 -1
- package/types/__mocks__/@op-engineering/op-sqlite.d.ts +1 -0
- package/types/db/dbInterface.d.ts +117 -0
- package/types/db/helpers.d.ts +4 -0
- package/types/db/pouchdb/getDocs.d.ts +18 -0
- package/types/db/pouchdb/pouchdb.d.ts +8 -0
- package/types/db/sqlite/sql.d.ts +45 -0
- package/types/db/sqlite/sqliteDb.d.ts +4 -0
- package/types/db/sqlite/sqliteDb.native.d.ts +7 -0
- package/types/errors.d.ts +2 -0
- package/types/helpers.d.ts +1 -4
- package/types/index.d.ts +1 -0
- package/types/jsonapi.d.ts +4 -2
- package/types/mango.d.ts +19 -1
- package/types/migrations/pouchdb.d.ts +1 -0
- package/types/types.d.ts +2 -0
- 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
|
|
10
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
11
|
|
|
12
|
-
var
|
|
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
|
|
178
|
-
return _regenerator.default.wrap(function
|
|
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 (
|
|
54
|
+
switch (_context.prev = _context.next) {
|
|
181
55
|
case 0:
|
|
182
|
-
return
|
|
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
|
|
62
|
+
return _context.stop();
|
|
189
63
|
}
|
|
190
64
|
}
|
|
191
|
-
},
|
|
65
|
+
}, _callee);
|
|
192
66
|
}));
|
|
193
67
|
|
|
194
|
-
return function (
|
|
195
|
-
return
|
|
68
|
+
return function (_x, _x2) {
|
|
69
|
+
return _ref.apply(this, arguments);
|
|
196
70
|
};
|
|
197
71
|
}();
|
|
198
72
|
|
|
199
|
-
helpers.normalizeFindSelector = function (
|
|
200
|
-
var selector =
|
|
201
|
-
sort =
|
|
202
|
-
indexedFields =
|
|
203
|
-
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) {
|
package/dist/helpers.spec.js
CHANGED
|
@@ -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
|
|
23
|
+
var _sqliteDb = _interopRequireDefault(require("./db/sqlite/sqliteDb"));
|