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,151 @@
1
+ import PouchDBQuery from './pouchdb'
2
+ import { createIndex } from '../../mango'
3
+ import { getDocsAndNormalize } from './getDocs'
4
+ import { Q } from 'cozy-client'
5
+
6
+ jest.mock('../../mango', () => ({
7
+ ...jest.requireActual('../../mango'),
8
+ createIndex: jest.fn()
9
+ }))
10
+
11
+ jest.mock('./getDocs', () => ({
12
+ getDocsAndNormalize: jest.fn()
13
+ }))
14
+
15
+ describe('PouchDBQuery find()', () => {
16
+ let pouchQE
17
+
18
+ beforeEach(() => {
19
+ pouchQE = new PouchDBQuery()
20
+ pouchQE.client = {}
21
+ pouchQE.db = {}
22
+ pouchQE.doctype = 'io.cozy.test'
23
+
24
+ jest.clearAllMocks()
25
+ })
26
+
27
+ it('should use provided indexedFields', async () => {
28
+ const options = {
29
+ selector: { name: 'John' },
30
+ sort: [{ name: 'asc' }],
31
+ indexedFields: ['name'],
32
+ doctype: 'io.cozy.test'
33
+ }
34
+
35
+ getDocsAndNormalize.mockResolvedValue([{ _id: '1', name: 'John' }])
36
+
37
+ const result = await pouchQE.find(options)
38
+
39
+ expect(getDocsAndNormalize).toHaveBeenCalledWith({
40
+ client: pouchQE.client,
41
+ db: pouchQE.db,
42
+ doctype: pouchQE.doctype,
43
+ queryFunc: 'find',
44
+ queryParams: expect.objectContaining({
45
+ selector: options.selector,
46
+ sort: options.sort,
47
+ partialFilter: options.partialFilter,
48
+ indexedFields: ['name'],
49
+ use_index: 'by_name'
50
+ })
51
+ })
52
+ expect(result).toEqual([{ _id: '1', name: 'John' }])
53
+ })
54
+
55
+ it('should use the index attribute from the sort', async () => {
56
+ const query = Q('io.cozy.todos')
57
+ .where({})
58
+ .sortBy([{ name: 'asc' }])
59
+ await pouchQE.find(query)
60
+ expect(getDocsAndNormalize).toHaveBeenCalledWith({
61
+ client: pouchQE.client,
62
+ db: pouchQE.db,
63
+ doctype: pouchQE.doctype,
64
+ queryFunc: 'find',
65
+ queryParams: expect.objectContaining({
66
+ sort: query.sort,
67
+ indexedFields: ['name'],
68
+ use_index: 'by_name'
69
+ })
70
+ })
71
+ })
72
+
73
+ it('should handle partialIndex', async () => {
74
+ const query = Q('io.cozy.todos')
75
+ .indexFields(['name'])
76
+ .partialIndex({ name: { $exists: true } })
77
+ await pouchQE.find(query)
78
+ expect(getDocsAndNormalize).toHaveBeenCalledWith({
79
+ client: pouchQE.client,
80
+ db: pouchQE.db,
81
+ doctype: pouchQE.doctype,
82
+ queryFunc: 'find',
83
+ queryParams: expect.objectContaining({
84
+ partialFilter: { name: { $exists: true } },
85
+ indexedFields: ['name'],
86
+ use_index: 'by_name_filter_(name_$exists_true)'
87
+ })
88
+ })
89
+ })
90
+
91
+ it('should handle complex index name for partial filters ', async () => {
92
+ const query = Q('io.cozy.todos')
93
+ .indexFields(['name'])
94
+ .partialIndex({
95
+ $and: [{ name: { $exists: true } }, { date: { $gt: null } }],
96
+ $or: [{ count: { $eq: '1' } }, { count: { $eq: '2' } }]
97
+ })
98
+ await pouchQE.find(query)
99
+ expect(getDocsAndNormalize).toHaveBeenCalledWith({
100
+ client: pouchQE.client,
101
+ db: pouchQE.db,
102
+ doctype: pouchQE.doctype,
103
+ queryFunc: 'find',
104
+ queryParams: expect.objectContaining({
105
+ partialFilter: {
106
+ $and: [{ name: { $exists: true } }, { date: { $gt: null } }],
107
+ $or: [{ count: { $eq: '1' } }, { count: { $eq: '2' } }]
108
+ },
109
+ indexedFields: ['name'],
110
+ use_index:
111
+ 'by_name_filter_((name_$exists_true)_$and_(date_$gt_null))_and_((count_$eq_1)_$or_(count_$eq_2))'
112
+ })
113
+ })
114
+ })
115
+
116
+ it('should create index and retry query if missing index error occurs', async () => {
117
+ const options = {
118
+ selector: { age: { $gt: 18 } },
119
+ sort: [{ age: 'desc' }],
120
+ indexedFields: ['age'],
121
+ doctype: 'io.cozy.test'
122
+ }
123
+
124
+ const mockError = new Error('no index')
125
+
126
+ getDocsAndNormalize
127
+ .mockRejectedValueOnce(mockError)
128
+ .mockResolvedValueOnce([{ _id: '2', age: 20 }])
129
+
130
+ const result = await pouchQE.find(options)
131
+
132
+ expect(createIndex).toHaveBeenCalledWith(pouchQE.db, ['age'], {
133
+ indexName: 'by_age',
134
+ doctype: 'io.cozy.test'
135
+ })
136
+
137
+ expect(getDocsAndNormalize).toHaveBeenCalledTimes(2)
138
+ expect(result).toEqual([{ _id: '2', age: 20 }])
139
+ })
140
+
141
+ it('should throw error if non-index related error occurs', async () => {
142
+ const options = { selector: { status: 'active' } }
143
+ const mockError = new Error('generic error')
144
+
145
+ getDocsAndNormalize.mockRejectedValue(mockError)
146
+
147
+ await expect(pouchQE.find(options)).rejects.toThrow('generic error')
148
+
149
+ expect(createIndex).not.toHaveBeenCalled()
150
+ })
151
+ })
@@ -0,0 +1,422 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.executeSQL = exports.deleteIndex = exports.createMangoIndex = exports.makeSQLCreateDeletedIndex = exports.makeSQLCreateDocIDIndex = exports.makeSQLCreateMangoIndex = exports.makeSQLDropIndex = exports.makeSQLQueryAll = exports.makeSQLQueryForIds = exports.makeSQLQueryForId = exports.makeSQLQueryFromMango = exports.makeSortClause = exports.makeWhereClause = exports.mangoSelectorToSQL = exports.parseResults = exports.keepDocWitHighestRev = void 0;
9
+
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+
12
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
+
14
+ var _jsonapi = require("../../jsonapi");
15
+
16
+ var _helpers = require("../helpers");
17
+
18
+ var MANGO_TO_SQL_OP = {
19
+ $eq: '=',
20
+ $ne: '!=',
21
+ $gt: '>',
22
+ $gte: '>=',
23
+ $lt: '<',
24
+ $lte: '<=',
25
+ $in: 'IN',
26
+ $nin: 'NOT IN',
27
+ $exists: 'IS'
28
+ };
29
+
30
+ var extractRevPrefix = function extractRevPrefix(rev) {
31
+ if (!rev) {
32
+ return 0;
33
+ }
34
+
35
+ var prefixStr = rev.split('-')[0];
36
+ return prefixStr ? parseInt(prefixStr) : 0;
37
+ };
38
+
39
+ var keepDocWitHighestRev = function keepDocWitHighestRev(docs) {
40
+ if (!docs || docs.length < 1) {
41
+ return null;
42
+ }
43
+
44
+ var highestDocRev = {
45
+ doc: docs[0],
46
+ revPrefix: extractRevPrefix(docs[0]._rev)
47
+ };
48
+
49
+ for (var i = 0; i < docs.length; i++) {
50
+ var revPrefix = extractRevPrefix(docs[i]._rev);
51
+
52
+ if (revPrefix > highestDocRev.revPrefix) {
53
+ highestDocRev = {
54
+ doc: docs[i],
55
+ revPrefix: revPrefix
56
+ };
57
+ }
58
+ }
59
+
60
+ return highestDocRev.doc;
61
+ };
62
+
63
+ exports.keepDocWitHighestRev = keepDocWitHighestRev;
64
+
65
+ var parseResults = function parseResults(client, result, doctype) {
66
+ var _ref = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {},
67
+ _ref$isSingleDoc = _ref.isSingleDoc,
68
+ isSingleDoc = _ref$isSingleDoc === void 0 ? false : _ref$isSingleDoc,
69
+ _ref$skip = _ref.skip,
70
+ skip = _ref$skip === void 0 ? 0 : _ref$skip,
71
+ _ref$limit = _ref.limit,
72
+ limit = _ref$limit === void 0 ? -1 : _ref$limit;
73
+
74
+ var parsedResults = [];
75
+
76
+ for (var i = 0; i < result.rows.length; i++) {
77
+ var item = result.rows.item(i);
78
+ var doc = JSON.parse(item['data']); // Handle special case for docs with `cozyPouchData`
79
+
80
+ var cozyPouchData = (0, _helpers.getCozyPouchData)(doc);
81
+
82
+ if (cozyPouchData) {
83
+ return {
84
+ data: cozyPouchData
85
+ };
86
+ }
87
+
88
+ doc._id = item.doc_id;
89
+ doc._rev = item.rev;
90
+ doc._type = doctype;
91
+ (0, _jsonapi.normalizeDoc)(client, doctype, doc);
92
+ parsedResults.push(doc);
93
+ }
94
+
95
+ if (parsedResults.length === 0) {
96
+ return {
97
+ data: []
98
+ };
99
+ }
100
+
101
+ if (isSingleDoc) {
102
+ if (parsedResults.length > 1) {
103
+ var _doc = keepDocWitHighestRev(parsedResults);
104
+
105
+ return {
106
+ data: _doc
107
+ };
108
+ }
109
+
110
+ return {
111
+ data: parsedResults[0]
112
+ };
113
+ } // XXX - Ideally we should have the total number of rows in the database to have a reliable
114
+ // next parameter, but we prefer to avoid this computation for performances.
115
+ // So let's rely on the total number of returned rows - if next is true, the last paginated
116
+ // query should have less results than the limit, thanks to the offset
117
+
118
+
119
+ var next = false;
120
+
121
+ if (limit !== -1 && parsedResults.length >= limit) {
122
+ next = true;
123
+ }
124
+
125
+ return {
126
+ data: parsedResults,
127
+ meta: {
128
+ count: parsedResults.length
129
+ },
130
+ skip: skip,
131
+ next: next
132
+ };
133
+ };
134
+
135
+ exports.parseResults = parseResults;
136
+
137
+ var parseCondition = function parseCondition(field, condition) {
138
+ var conditions = [];
139
+ var sqlField = transformMangoFieldInJSONSQL(field);
140
+
141
+ if (typeof condition === 'object' && !Array.isArray(condition)) {
142
+ for (var operator in condition) {
143
+ var sqlOp = MANGO_TO_SQL_OP[operator];
144
+
145
+ if (operator === '$in' || operator === '$nin') {
146
+ var values = condition[operator].map(function (v) {
147
+ return typeof v === 'string' ? "'".concat(v, "'") : v;
148
+ }).join(', ');
149
+ conditions.push("".concat(sqlField, " ").concat(sqlOp, " (").concat(values, ")"));
150
+ } else if (operator === '$exists') {
151
+ var value = condition[operator];
152
+
153
+ if (value) {
154
+ sqlOp += ' NOT NULL';
155
+ } else {
156
+ sqlOp += ' NULL';
157
+ }
158
+
159
+ conditions.push("".concat(sqlField, " ").concat(sqlOp));
160
+ } else {
161
+ var _value = typeof condition[operator] === 'string' ? "'".concat(condition[operator], "'") : condition[operator];
162
+
163
+ if (operator === '$gt' && _value === null) {
164
+ // Special case for $gt: null conditions
165
+ conditions.push("".concat(sqlField, " IS NOT NULL"));
166
+ } else {
167
+ conditions.push("".concat(sqlField, " ").concat(sqlOp, " ").concat(_value));
168
+ }
169
+ }
170
+ }
171
+ } else {
172
+ var _value2 = typeof condition === 'string' ? "'".concat(condition, "'") : condition;
173
+
174
+ conditions.push("".concat(sqlField, " = ").concat(_value2));
175
+ }
176
+
177
+ return conditions.join(' AND ');
178
+ };
179
+
180
+ var parseLogicalOperator = function parseLogicalOperator(operator, conditionsArray) {
181
+ var sqlOperator = operator === '$and' ? 'AND' : 'OR';
182
+ var parsedConditions = conditionsArray.map(function (cond) {
183
+ return "(".concat(mangoSelectorToSQL(cond).replace(/^WHERE /, ''), ")");
184
+ });
185
+ return parsedConditions.join(" ".concat(sqlOperator, " "));
186
+ };
187
+
188
+ var transformMangoFieldInJSONSQL = function transformMangoFieldInJSONSQL(field) {
189
+ var columnName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'data';
190
+ return "json_extract(".concat(columnName, ", '$.").concat(field, "')");
191
+ };
192
+
193
+ var mangoSelectorToSQL = function mangoSelectorToSQL(selector) {
194
+ var conditions = [];
195
+
196
+ for (var key in selector) {
197
+ if (key === '$and' || key === '$or') {
198
+ conditions.push(parseLogicalOperator(key, selector[key]));
199
+ } else {
200
+ conditions.push(parseCondition(key, selector[key]));
201
+ }
202
+ }
203
+
204
+ return conditions.length > 0 ? "".concat(conditions.join(' AND ')) : '';
205
+ };
206
+
207
+ exports.mangoSelectorToSQL = mangoSelectorToSQL;
208
+
209
+ var makeWhereClause = function makeWhereClause(selector) {
210
+ var baseWhere = 'DELETED = 0';
211
+
212
+ if (!selector) {
213
+ return baseWhere;
214
+ }
215
+
216
+ var mangoWhere = mangoSelectorToSQL(selector);
217
+ baseWhere += " AND ".concat(mangoWhere);
218
+ return baseWhere;
219
+ };
220
+
221
+ exports.makeWhereClause = makeWhereClause;
222
+
223
+ var makeSortClause = function makeSortClause(mangoSortBy) {
224
+ if (!mangoSortBy || !Array.isArray(mangoSortBy) || mangoSortBy.length < 1) {
225
+ return null;
226
+ }
227
+
228
+ var firstSortEntry = mangoSortBy[0];
229
+ var sortOrder = Object.values(firstSortEntry)[0].toUpperCase();
230
+ var sortFields = mangoSortBy.map(function (sort) {
231
+ var attribute = Object.keys(sort)[0];
232
+ return "json_extract(data, '$.".concat(attribute, "')");
233
+ }).join(', ');
234
+ var sortClause = "".concat(sortFields, " ").concat(sortOrder);
235
+ return sortClause;
236
+ };
237
+
238
+ exports.makeSortClause = makeSortClause;
239
+
240
+ var makeSQLQueryFromMango = function makeSQLQueryFromMango(_ref2) {
241
+ var selector = _ref2.selector,
242
+ sort = _ref2.sort,
243
+ indexName = _ref2.indexName,
244
+ _ref2$limit = _ref2.limit,
245
+ limit = _ref2$limit === void 0 ? -1 : _ref2$limit,
246
+ _ref2$skip = _ref2.skip,
247
+ skip = _ref2$skip === void 0 ? 0 : _ref2$skip;
248
+ var whereClause = makeWhereClause(selector);
249
+ var sortClause = makeSortClause(sort);
250
+ var sql = ["SELECT json AS data, doc_id, rev", "FROM 'by-sequence' INDEXED BY ".concat(indexName), "WHERE ".concat(whereClause)].join(' ');
251
+
252
+ if (skip > 0) {
253
+ sql += " OFFSET ".concat(skip);
254
+ }
255
+
256
+ if (sortClause) {
257
+ sql += " ORDER BY ".concat(sortClause);
258
+ }
259
+
260
+ sql += " LIMIT ".concat(limit);
261
+ sql += ';';
262
+ return sql;
263
+ };
264
+
265
+ exports.makeSQLQueryFromMango = makeSQLQueryFromMango;
266
+
267
+ var makeSQLQueryForId = function makeSQLQueryForId(id) {
268
+ var sql = ["SELECT json AS data, doc_id, rev", "FROM 'by-sequence'", "WHERE doc_id=\"".concat(id, "\" AND deleted=0"), ";"].join(' ');
269
+ return sql;
270
+ };
271
+
272
+ exports.makeSQLQueryForId = makeSQLQueryForId;
273
+
274
+ var makeSQLQueryForIds = function makeSQLQueryForIds(ids) {
275
+ var doc_ids = ids.join(',');
276
+ var sql = "\n SELECT json AS data, doc_id, rev\n FROM 'by-sequence'\n WHERE doc_id IN (\"".concat(doc_ids, "\") AND deleted = 0;\n ");
277
+ return sql;
278
+ };
279
+
280
+ exports.makeSQLQueryForIds = makeSQLQueryForIds;
281
+
282
+ var makeSQLQueryAll = function makeSQLQueryAll() {
283
+ var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
284
+ _ref3$limit = _ref3.limit,
285
+ limit = _ref3$limit === void 0 ? -1 : _ref3$limit,
286
+ _ref3$skip = _ref3.skip,
287
+ skip = _ref3$skip === void 0 ? 0 : _ref3$skip;
288
+
289
+ var sql = ["SELECT json AS data, doc_id, rev", "FROM 'by-sequence'", "WHERE deleted=0", "LIMIT ".concat(limit)].join(' ');
290
+
291
+ if (skip > 0) {
292
+ sql += " OFFSET ".concat(skip);
293
+ }
294
+
295
+ sql += ';';
296
+ return sql;
297
+ };
298
+
299
+ exports.makeSQLQueryAll = makeSQLQueryAll;
300
+
301
+ var makeSQLDropIndex = function makeSQLDropIndex(indexName) {
302
+ return "DROP INDEX IF EXISTS '".concat(indexName, "';");
303
+ };
304
+
305
+ exports.makeSQLDropIndex = makeSQLDropIndex;
306
+
307
+ var makeSQLCreateMangoIndex = function makeSQLCreateMangoIndex(indexName, fieldsToIndex, _ref4) {
308
+ var partialFilter = _ref4.partialFilter;
309
+ var jsonAttributes = fieldsToIndex.map(function (field) {
310
+ return "json_extract(json, '$.".concat(field, "')");
311
+ });
312
+ var jsonIndex = jsonAttributes.join(',');
313
+ var sql = "\n CREATE INDEX IF NOT EXISTS '".concat(indexName, "'\n ON 'by-sequence'\n (").concat(jsonIndex, ")\n ");
314
+
315
+ if (partialFilter) {
316
+ var whereClause = makeWhereClause(partialFilter);
317
+ sql += " WHERE ".concat(whereClause);
318
+ }
319
+
320
+ sql += ';';
321
+ return sql;
322
+ };
323
+
324
+ exports.makeSQLCreateMangoIndex = makeSQLCreateMangoIndex;
325
+
326
+ var makeSQLCreateDocIDIndex = function makeSQLCreateDocIDIndex() {
327
+ // This index is useful for docid queries
328
+ var sql = "\n CREATE UNIQUE INDEX IF NOT EXISTS 'by_docid_and_deleted'\n ON 'by-sequence'\n (doc_id, deleted);\n ";
329
+ return sql;
330
+ };
331
+
332
+ exports.makeSQLCreateDocIDIndex = makeSQLCreateDocIDIndex;
333
+
334
+ var makeSQLCreateDeletedIndex = function makeSQLCreateDeletedIndex() {
335
+ // This index is useful for allDocs queries
336
+ var sql = "\n CREATE INDEX IF NOT EXISTS 'by_deleted'\n ON 'by-sequence'\n (deleted);\n ";
337
+ return sql;
338
+ };
339
+
340
+ exports.makeSQLCreateDeletedIndex = makeSQLCreateDeletedIndex;
341
+
342
+ var createMangoIndex = /*#__PURE__*/function () {
343
+ var _ref6 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(db, indexName, fieldsToIndex, _ref5) {
344
+ var partialFilter, sql, result;
345
+ return _regenerator.default.wrap(function _callee$(_context) {
346
+ while (1) {
347
+ switch (_context.prev = _context.next) {
348
+ case 0:
349
+ partialFilter = _ref5.partialFilter;
350
+ sql = makeSQLCreateMangoIndex(indexName, fieldsToIndex, {
351
+ partialFilter: partialFilter
352
+ });
353
+ _context.next = 4;
354
+ return executeSQL(db, sql);
355
+
356
+ case 4:
357
+ result = _context.sent;
358
+ return _context.abrupt("return", result);
359
+
360
+ case 6:
361
+ case "end":
362
+ return _context.stop();
363
+ }
364
+ }
365
+ }, _callee);
366
+ }));
367
+
368
+ return function createMangoIndex(_x, _x2, _x3, _x4) {
369
+ return _ref6.apply(this, arguments);
370
+ };
371
+ }();
372
+
373
+ exports.createMangoIndex = createMangoIndex;
374
+
375
+ var deleteIndex = /*#__PURE__*/function () {
376
+ var _ref7 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(db, indexName) {
377
+ var sql;
378
+ return _regenerator.default.wrap(function _callee2$(_context2) {
379
+ while (1) {
380
+ switch (_context2.prev = _context2.next) {
381
+ case 0:
382
+ sql = makeSQLDropIndex(indexName);
383
+ _context2.next = 3;
384
+ return executeSQL(db, sql);
385
+
386
+ case 3:
387
+ case "end":
388
+ return _context2.stop();
389
+ }
390
+ }
391
+ }, _callee2);
392
+ }));
393
+
394
+ return function deleteIndex(_x5, _x6) {
395
+ return _ref7.apply(this, arguments);
396
+ };
397
+ }();
398
+
399
+ exports.deleteIndex = deleteIndex;
400
+
401
+ var executeSQL = /*#__PURE__*/function () {
402
+ var _ref8 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(db, sql) {
403
+ return _regenerator.default.wrap(function _callee3$(_context3) {
404
+ while (1) {
405
+ switch (_context3.prev = _context3.next) {
406
+ case 0:
407
+ return _context3.abrupt("return", db.executeAsync(sql));
408
+
409
+ case 1:
410
+ case "end":
411
+ return _context3.stop();
412
+ }
413
+ }
414
+ }, _callee3);
415
+ }));
416
+
417
+ return function executeSQL(_x7, _x8) {
418
+ return _ref8.apply(this, arguments);
419
+ };
420
+ }();
421
+
422
+ exports.executeSQL = executeSQL;