@flumens/models 0.5.2 → 0.6.0

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.
@@ -1 +1,77 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("tslib"),t=require("mobx"),r=function(r){function n(n){var o=r.call(this,n)||this;o.fetch=function(){return e.__awaiter(o,void 0,void 0,(function(){var t,r,n,o=this;return e.__generator(this,(function(i){switch(i.label){case 0:return this.store&&this.Model?[4,this.store.findAll()]:(this.ready.resolve(!1),[2]);case 1:return t=i.sent(),r=function(t){return o.Model.fromJSON(e.__assign(e.__assign({},t),{attrs:t.data}))},n=t.map(r),this.push.apply(this,n),this.ready.resolve(!0),[2]}}))}))},o.removeAllSynced=function(){var e=[];return o.forEach((function(t){t.syncedAt&&e.push(t.destroy())})),Promise.all(e)},o.comparator=function(e){return-new Date(e.createdAt).getTime()},o.reset=function(){return e.__awaiter(o,void 0,void 0,(function(){var t;return e.__generator(this,(function(e){switch(e.label){case 0:return t=this.map((function(e){return e.destroy()})),[4,Promise.all(t)];case 1:return e.sent(),[2]}}))}))};return t.observe(o,(function(e){e.addedCount&&e.added.forEach((function(e){return e.collection=o})),e.removedCount&&e.removed.forEach((function(e){return delete e.collection}))})),o}return e.__extends(n,r),n}(require("../Collection.js").default);exports.default=r;
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var tslib = require('tslib');
6
+ var mobx = require('mobx');
7
+ var Collection = require('../Collection.js');
8
+
9
+ var SampleCollection = /** @class */ (function (_super) {
10
+ tslib.__extends(SampleCollection, _super);
11
+ function SampleCollection(options) {
12
+ var _this = _super.call(this, options) || this;
13
+ _this.fetch = function () { return tslib.__awaiter(_this, void 0, void 0, function () {
14
+ var modelsJSON, getModel, models;
15
+ var _this = this;
16
+ return tslib.__generator(this, function (_a) {
17
+ switch (_a.label) {
18
+ case 0:
19
+ if (!this.store || !this.Model) {
20
+ this.ready.resolve(false);
21
+ return [2 /*return*/];
22
+ }
23
+ return [4 /*yield*/, this.store.findAll()];
24
+ case 1:
25
+ modelsJSON = _a.sent();
26
+ getModel = function (json) {
27
+ return _this.Model.fromJSON(tslib.__assign(tslib.__assign({}, json), { attrs: json.data }));
28
+ };
29
+ models = modelsJSON.map(getModel);
30
+ this.push.apply(this, models);
31
+ this.ready.resolve(true);
32
+ return [2 /*return*/];
33
+ }
34
+ });
35
+ }); };
36
+ _this.removeAllSynced = function () {
37
+ var toWait = [];
38
+ _this.forEach(function (sample) {
39
+ if (sample.syncedAt) {
40
+ toWait.push(sample.destroy());
41
+ }
42
+ });
43
+ return Promise.all(toWait);
44
+ };
45
+ /**
46
+ * Reverse order so that newest are at the top of list.
47
+ */
48
+ _this.comparator = function (a) {
49
+ var date = new Date(a.createdAt);
50
+ return -date.getTime();
51
+ };
52
+ _this.reset = function () { return tslib.__awaiter(_this, void 0, void 0, function () {
53
+ var destroyAllSamples;
54
+ return tslib.__generator(this, function (_a) {
55
+ switch (_a.label) {
56
+ case 0:
57
+ destroyAllSamples = this.map(function (sample) { return sample.destroy(); });
58
+ return [4 /*yield*/, Promise.all(destroyAllSamples)];
59
+ case 1:
60
+ _a.sent();
61
+ return [2 /*return*/];
62
+ }
63
+ });
64
+ }); };
65
+ var attachCollectionToModels = function (change) {
66
+ if (change.addedCount)
67
+ change.added.forEach(function (model) { return (model.collection = _this); }); // eslint-disable-line no-return-assign, no-param-reassign
68
+ if (change.removedCount)
69
+ change.removed.forEach(function (model) { return delete model.collection; }); // eslint-disable-line no-param-reassign
70
+ };
71
+ mobx.observe(_this, attachCollectionToModels);
72
+ return _this;
73
+ }
74
+ return SampleCollection;
75
+ }(Collection["default"]));
76
+
77
+ exports["default"] = SampleCollection;
@@ -18,7 +18,7 @@ export interface RemoteConfig {
18
18
  [key: string]: string | number | null;
19
19
  } | ((value: any, submission: any, model: any) => any);
20
20
  }
21
- export declare const boolToWarehouseValue: (val?: boolean | 't' | 'f' | null) => "t" | "f";
21
+ export declare const boolToWarehouseValue: (val?: boolean | "t" | "f" | null) => "t" | "f";
22
22
  export type Keys = (() => {
23
23
  [key: string]: RemoteConfig;
24
24
  }) | {
@@ -1 +1,120 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("tslib");function t(e,t){for(var r=atob(e.split(",")[1]),s=[],n=0;n<r.length;n++)s.push(r.charCodeAt(n));return new Blob([new Uint8Array(s)],{type:t})}function r(e){if(!e)return!1;return!!e.toString().match(/^\s*data:([a-z]+\/[a-z]+(;[a-z\-]+\=[a-z\-]+)?)?(;base64)?,[a-z0-9\!\$\&\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$/i)}exports.boolToWarehouseValue=function(e){return!0===e||"t"===e?"t":"f"},exports.dataURItoBlob=t,exports.getBlobFromURL=function(e,s){if(r(e)){var n=t(e,s);return Promise.resolve(n)}return new Promise((function(t){var r=new XMLHttpRequest;r.open("GET",e,!0),r.responseType="blob",r.onload=function(){var e=r.response;t(e)},r.send()}))},exports.getErrorMessageFromObject=function(e){return Object.entries(e).reduce((function(e,t){return"".concat(e).concat(t[0]," ").concat(t[1],"\n")}),"")},exports.isDataURL=r,exports.validateRemoteModel=function(){var t=this.getSurvey(),r=t.verify&&t.verify(this.attrs,this),s={};if(r){var n=r&&"issues"in r;!("ValidationError"===(null==r?void 0:r.name)||"ValidationError"===(null==r?void 0:r.type))&&!n?s.errors=[r.message]:n?s.errors=r.issues.map((function(e){return e.message})):s=e.__assign({},r)}var o=function(e,t){var r=t.validateRemote();return r&&(e[t.cid]=r,e[t.cid].model=t),e},i=(this.samples||[]).reduce(o,{}),a=(this.occurrences||[]).reduce(o,{}),u=(this.media||[]).reduce(o,{});return Object.keys(s).length||Object.keys(i).length||Object.keys(a).length||Object.keys(u).length?{attributes:s,model:this,models:e.__assign(e.__assign(e.__assign({},i),a),u)}:null};
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var tslib = require('tslib');
6
+
7
+ var getErrorMessageFromObject = function (errors) {
8
+ return Object.entries(errors).reduce(function (string, err) { return "".concat(string).concat(err[0], " ").concat(err[1], "\n"); }, '');
9
+ };
10
+ /**
11
+ * Converts DataURI object to a Blob.
12
+ *
13
+ * @param {type} dataURI
14
+ * @param {type} fileType
15
+ * @returns {undefined}
16
+ */
17
+ function dataURItoBlob(dataURI, fileType) {
18
+ var binary = atob(dataURI.split(',')[1]);
19
+ var array = [];
20
+ for (var i = 0; i < binary.length; i++) {
21
+ array.push(binary.charCodeAt(i));
22
+ }
23
+ return new Blob([new Uint8Array(array)], {
24
+ type: fileType,
25
+ });
26
+ }
27
+ // Detecting data URLs
28
+ // https://gist.github.com/bgrins/6194623
29
+ // data URI - MDN https://developer.mozilla.org/en-US/docs/data_URIs
30
+ // The 'data' URL scheme: http://tools.ietf.org/html/rfc2397
31
+ // Valid URL Characters: http://tools.ietf.org/html/rfc2396#section2
32
+ function isDataURL(string) {
33
+ if (!string) {
34
+ return false;
35
+ }
36
+ var normalized = string.toString(); // numbers
37
+ /* eslint-disable no-useless-escape, max-len */
38
+ var regex = /^\s*data:([a-z]+\/[a-z]+(;[a-z\-]+\=[a-z\-]+)?)?(;base64)?,[a-z0-9\!\$\&\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$/i;
39
+ return !!normalized.match(regex);
40
+ }
41
+ function getBlobFromURL(url, mediaType) {
42
+ if (isDataURL(url)) {
43
+ var blob = dataURItoBlob(url, mediaType);
44
+ return Promise.resolve(blob);
45
+ }
46
+ return new Promise(function (resolve) {
47
+ // load image
48
+ var xhr = new XMLHttpRequest();
49
+ xhr.open('GET', url, true);
50
+ xhr.responseType = 'blob';
51
+ xhr.onload = function () {
52
+ var blob = xhr.response;
53
+ resolve(blob);
54
+ };
55
+ // todo check error case
56
+ xhr.send();
57
+ });
58
+ }
59
+ var boolToWarehouseValue = function (val) {
60
+ return val === true || val === 't' ? 't' : 'f';
61
+ };
62
+ function validateRemoteModel() {
63
+ // @ts-ignore
64
+ var survey = this.getSurvey();
65
+ // @ts-ignore
66
+ var error = survey.verify && survey.verify(this.attrs, this);
67
+ var attributes = {};
68
+ if (error) {
69
+ var isYupError = (error === null || error === void 0 ? void 0 : error.name) === 'ValidationError' ||
70
+ (error === null || error === void 0 ? void 0 : error.type) === 'ValidationError';
71
+ var isZodError = error && 'issues' in error;
72
+ var isPlainError = !isYupError && !isZodError;
73
+ if (isPlainError) {
74
+ attributes.errors = [error.message];
75
+ }
76
+ else if (isZodError) {
77
+ attributes.errors = error.issues.map(function (_a) {
78
+ var message = _a.message;
79
+ return message;
80
+ });
81
+ }
82
+ else {
83
+ attributes = tslib.__assign({}, error);
84
+ }
85
+ }
86
+ var validateSubModel = function (agg, model) {
87
+ var invalids = model.validateRemote();
88
+ if (invalids) {
89
+ agg[model.cid] = invalids; // eslint-disable-line
90
+ agg[model.cid].model = model; // eslint-disable-line
91
+ }
92
+ return agg;
93
+ };
94
+ // @ts-ignore
95
+ var samples = (this.samples || []).reduce(validateSubModel, {});
96
+ // @ts-ignore
97
+ var occurrences = (this.occurrences || []).reduce(validateSubModel, {});
98
+ // @ts-ignore
99
+ var media = (this.media || []).reduce(validateSubModel, {});
100
+ if (Object.keys(attributes).length ||
101
+ Object.keys(samples).length ||
102
+ Object.keys(occurrences).length ||
103
+ Object.keys(media).length) {
104
+ var models = tslib.__assign(tslib.__assign(tslib.__assign({}, samples), occurrences), media);
105
+ return {
106
+ attributes: attributes,
107
+ // @ts-ignore
108
+ model: this,
109
+ models: models,
110
+ };
111
+ }
112
+ return null;
113
+ }
114
+
115
+ exports.boolToWarehouseValue = boolToWarehouseValue;
116
+ exports.dataURItoBlob = dataURItoBlob;
117
+ exports.getBlobFromURL = getBlobFromURL;
118
+ exports.getErrorMessageFromObject = getErrorMessageFromObject;
119
+ exports.isDataURL = isDataURL;
120
+ exports.validateRemoteModel = validateRemoteModel;
package/dist/Model.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import Deferred from '@flumens/utils/dist/deferred';
1
+ import { Deferred } from '@flumens/utils';
2
2
  import Store from './Stores/Store';
3
3
  export interface Options<T = any> {
4
4
  id?: string;
package/dist/Model.js CHANGED
@@ -1 +1,191 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("tslib"),e=require("mobx"),s=require("mobx-utils"),r=require("@flumens/utils/dist/deferred"),i=require("@flumens/utils/dist/uuid");function a(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var n=a(r),o=a(i),d={deleted:!1},u=function(){function r(r){var i=this,a=r.id,u=void 0===a?"":a,c=r.cid,h=void 0===c?"":c,l=r.createdAt,f=r.updatedAt,v=r.syncedAt,p=r.attrs,_=void 0===p?{}:p,y=r.store;this.ready=new n.default,this.debouncedValue=3e3,this._observerPaused=!1,this.id=u,this.cid=h||u||o.default();var b,A,w=Date.now();this.createdAt=l||w,this.updatedAt=f||w,this.syncedAt=v,this.attrs=(b=t.__assign(t.__assign({},d),_),JSON.parse(JSON.stringify(b))),e.makeObservable(this,{createdAt:e.observable,updatedAt:e.observable,syncedAt:e.observable,attrs:e.observable}),this.store=y;s.deepObserve(this.attrs,(function(){i._observerPaused||(i.updatedAt=Date.now(),function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];clearTimeout(A),A=setTimeout((function(){return i.sync.apply(i,t)}),i.debouncedValue)}())}))}return r.prototype.setUpdatedAtTimestamp=function(t){this.updatedAt=t},r.prototype.fetch=function(){return t.__awaiter(this,void 0,void 0,(function(){var s;return t.__generator(this,(function(t){switch(t.label){case 0:return this.store?[4,this.store.find(this.cid)]:(this.ready.resolve(!1),[2]);case 1:return(s=t.sent())?[3,3]:[4,this.save()];case 2:return t.sent(),this.ready.resolve(!0),[2];case 3:return s.id&&(this.id=s.id),s.cid&&(this.cid=s.cid),this._observerPaused=!0,e.set(this.attrs,s.data),this._observerPaused=!1,this.createdAt=s.createdAt,this.updatedAt=s.updatedAt,this.syncedAt=s.syncedAt,this.ready.resolve(!0),[2]}}))}))},r.prototype.save=function(){return t.__awaiter(this,void 0,void 0,(function(){var e;return t.__generator(this,(function(s){switch(s.label){case 0:if(!this.store)throw new Error("Trying to save locally without a store");return e=this.toJSON(),[4,this.store.save(t.__assign(t.__assign({},e),{data:e.attrs}))];case 1:return s.sent(),[2]}}))}))},r.prototype.destroy=function(){return t.__awaiter(this,void 0,void 0,(function(){return t.__generator(this,(function(t){switch(t.label){case 0:if(!this.store)throw new Error("Trying to delete locally without a store");return[4,this.store.delete(this.cid)];case 1:return t.sent(),[2]}}))}))},r.prototype.sync=function(){return t.__awaiter(this,void 0,void 0,(function(){return t.__generator(this,(function(t){switch(t.label){case 0:return this.store?[4,this.save()]:[3,2];case 1:t.sent(),t.label=2;case 2:return[2]}}))}))},r.prototype.toJSON=function(){return{id:this.id,cid:this.cid,createdAt:this.createdAt,updatedAt:this.updatedAt,syncedAt:this.syncedAt,attrs:e.toJS(this.attrs)}},r.prototype.resetDefaults=function(s){var r=this;this.id="";var i=JSON.parse(JSON.stringify(t.__assign(t.__assign({},d),s)));e.set(this.attrs,i);var a=Object.keys(i);return Object.keys(this.attrs).forEach((function(t){a.includes(t)||(r.attrs[t]=null,delete r.attrs[t])})),this.save()},r}();exports.default=u;
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var tslib = require('tslib');
6
+ var mobx = require('mobx');
7
+ var mobxUtils = require('mobx-utils');
8
+ var utils = require('@flumens/utils');
9
+
10
+ /**
11
+ * Simple object clone.
12
+ */
13
+ var clone = function (obj) { return JSON.parse(JSON.stringify(obj)); };
14
+ var defaults = {
15
+ deleted: false,
16
+ };
17
+ var Model = /** @class */ (function () {
18
+ function Model(_a) {
19
+ var _b = _a.id, id = _b === void 0 ? '' : _b, _c = _a.cid, cid = _c === void 0 ? '' : _c, createdAt = _a.createdAt, updatedAt = _a.updatedAt, syncedAt = _a.syncedAt, _d = _a.attrs, attrs = _d === void 0 ? {} : _d, store = _a.store;
20
+ var _this = this;
21
+ /**
22
+ * A deferred promise to flag if the model was initialised from the store.
23
+ */
24
+ this.ready = new utils.Deferred();
25
+ this.debouncedValue = 3000;
26
+ // a mechanism to disable auto-sync
27
+ this._observerPaused = false;
28
+ this.id = id;
29
+ this.cid = cid || id || utils.UUIDv7();
30
+ var now = Date.now();
31
+ this.createdAt = createdAt || now;
32
+ this.updatedAt = updatedAt || now;
33
+ this.syncedAt = syncedAt;
34
+ this.attrs = clone(tslib.__assign(tslib.__assign({}, defaults), attrs));
35
+ mobx.makeObservable(this, {
36
+ createdAt: mobx.observable,
37
+ updatedAt: mobx.observable,
38
+ syncedAt: mobx.observable,
39
+ attrs: mobx.observable,
40
+ });
41
+ this.store = store;
42
+ var isDebouncing;
43
+ var debouncedSync = function () {
44
+ var args = [];
45
+ for (var _i = 0; _i < arguments.length; _i++) {
46
+ args[_i] = arguments[_i];
47
+ }
48
+ clearTimeout(isDebouncing);
49
+ isDebouncing = setTimeout(function () { return _this.sync.apply(_this, args); }, // eslint-disable-line prefer-spread
50
+ _this.debouncedValue);
51
+ };
52
+ var setUpdatedTimestamp = function () {
53
+ if (_this._observerPaused)
54
+ return;
55
+ _this.updatedAt = Date.now();
56
+ debouncedSync();
57
+ };
58
+ mobxUtils.deepObserve(this.attrs, setUpdatedTimestamp);
59
+ }
60
+ Model.prototype.setUpdatedAtTimestamp = function (newUpdatedAt) {
61
+ this.updatedAt = newUpdatedAt;
62
+ };
63
+ /**
64
+ * Initialize the model from store.
65
+ */
66
+ Model.prototype.fetch = function () {
67
+ return tslib.__awaiter(this, void 0, void 0, function () {
68
+ var document;
69
+ return tslib.__generator(this, function (_a) {
70
+ switch (_a.label) {
71
+ case 0:
72
+ if (!this.store) {
73
+ this.ready.resolve(false);
74
+ return [2 /*return*/];
75
+ }
76
+ return [4 /*yield*/, this.store.find(this.cid)];
77
+ case 1:
78
+ document = _a.sent();
79
+ if (!!document) return [3 /*break*/, 3];
80
+ return [4 /*yield*/, this.save()];
81
+ case 2:
82
+ _a.sent(); // persisting for the first time
83
+ this.ready.resolve(true);
84
+ return [2 /*return*/];
85
+ case 3:
86
+ if (document.id)
87
+ this.id = document.id; // checking presence for backwards compatibility
88
+ if (document.cid)
89
+ this.cid = document.cid; // checking presence for backwards compatibility
90
+ this._observerPaused = true;
91
+ mobx.set(this.attrs, document.data);
92
+ this._observerPaused = false;
93
+ this.createdAt = document.createdAt;
94
+ this.updatedAt = document.updatedAt;
95
+ this.syncedAt = document.syncedAt;
96
+ this.ready.resolve(true);
97
+ return [2 /*return*/];
98
+ }
99
+ });
100
+ });
101
+ };
102
+ /**
103
+ * Save the model to the offline store.
104
+ */
105
+ Model.prototype.save = function () {
106
+ return tslib.__awaiter(this, void 0, void 0, function () {
107
+ var json;
108
+ return tslib.__generator(this, function (_a) {
109
+ switch (_a.label) {
110
+ case 0:
111
+ if (!this.store) {
112
+ throw new Error('Trying to save locally without a store');
113
+ }
114
+ json = this.toJSON();
115
+ return [4 /*yield*/, this.store.save(tslib.__assign(tslib.__assign({}, json), { data: json.attrs }))];
116
+ case 1:
117
+ _a.sent();
118
+ return [2 /*return*/];
119
+ }
120
+ });
121
+ });
122
+ };
123
+ /**
124
+ * Destroy the model and remove from the offline store.
125
+ */
126
+ Model.prototype.destroy = function () {
127
+ return tslib.__awaiter(this, void 0, void 0, function () {
128
+ return tslib.__generator(this, function (_a) {
129
+ switch (_a.label) {
130
+ case 0:
131
+ if (!this.store) {
132
+ throw new Error('Trying to delete locally without a store');
133
+ }
134
+ return [4 /*yield*/, this.store.delete(this.cid)];
135
+ case 1:
136
+ _a.sent();
137
+ return [2 /*return*/];
138
+ }
139
+ });
140
+ });
141
+ };
142
+ // eslint-disable-next-line unused-imports/no-unused-vars
143
+ Model.prototype.sync = function () {
144
+ return tslib.__awaiter(this, void 0, void 0, function () {
145
+ return tslib.__generator(this, function (_a) {
146
+ switch (_a.label) {
147
+ case 0:
148
+ if (!this.store) return [3 /*break*/, 2];
149
+ return [4 /*yield*/, this.save()];
150
+ case 1:
151
+ _a.sent(); // if extended then store might be initialised in a subclass later
152
+ _a.label = 2;
153
+ case 2: return [2 /*return*/];
154
+ }
155
+ });
156
+ });
157
+ };
158
+ /**
159
+ * Returns a clean (no observables) JSON representation of the model.
160
+ */
161
+ Model.prototype.toJSON = function () {
162
+ return {
163
+ id: this.id,
164
+ cid: this.cid,
165
+ createdAt: this.createdAt,
166
+ updatedAt: this.updatedAt,
167
+ syncedAt: this.syncedAt,
168
+ attrs: mobx.toJS(this.attrs),
169
+ };
170
+ };
171
+ Model.prototype.resetDefaults = function (defaultsToSet) {
172
+ var _this = this;
173
+ this.id = ''; // must be first in case a reaction is triggered from changing attrs that check this
174
+ var defaultsCopy = JSON.parse(JSON.stringify(tslib.__assign(tslib.__assign({}, defaults), defaultsToSet)));
175
+ mobx.set(this.attrs, defaultsCopy);
176
+ // clean up non-defaults
177
+ var defaultKeys = Object.keys(defaultsCopy);
178
+ var deleteProp = function (key) {
179
+ var isDefaultKey = defaultKeys.includes(key);
180
+ if (isDefaultKey)
181
+ return;
182
+ _this.attrs[key] = null; // might be a different type to current set value
183
+ delete _this.attrs[key];
184
+ };
185
+ Object.keys(this.attrs).forEach(deleteProp);
186
+ return this.save();
187
+ };
188
+ return Model;
189
+ }());
190
+
191
+ exports["default"] = Model;
@@ -1 +1,228 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("tslib"),r=require("localforage"),t=require("localforage-cordovasqlitedriver"),i=require("@ionic/react"),n=require("./utils.js");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=o(r),s=o(t),u=["indexeddb","websql","localstorage"];if(i.isPlatform("hybrid")){if(!window.sqlitePlugin)throw new Error("cordova-sql-storage plugin is missing. Please install it.");u=e.__spreadArray([s.default],u,!0)}var c={driverOrder:u},d=function(){function r(t){var i=this,n=e.__assign(e.__assign({},c),t);this.debugging=n.debugging,this.localForage=null,this.ready=new Promise((function(e,t){var o=new Promise((function(e){n.driverOrder&&"object"==typeof n.driverOrder[0]?a.default.defineDriver(n.driverOrder[0]).then(e):e(void 0)}));if(!n.storeName)throw new Error("storeName prop is missing");i.storeName=n.storeName,o.then((function(){var o={name:n.name||"indicia",storeName:n.storeName};n.version&&(o.version=n.version);var s=r._getDriverOrder(n.driverOrder),u=n.LocalForage||a.default;i.localForage=u.createInstance(o),i.localForage.setDriver(s).then(e).catch(t)}))}))}return r._getDriverOrder=function(e){return e.map((function(e){switch(e){case"indexeddb":return a.default.INDEXEDDB;case"websql":return a.default.WEBSQL;case"localstorage":return a.default.LOCALSTORAGE;default:return"object"==typeof e&&e._driver?e._driver:console.error("No such db driver!")}}))},r.prototype.save=function(r){return e.__awaiter(this,void 0,void 0,(function(){var t;return e.__generator(this,(function(e){switch(e.label){case 0:return[4,this.ready];case 1:if(e.sent(),!r.cid)throw new Error("Invalid key passed to store");return this.debugging?[4,this.find(r.cid)]:[3,3];case 2:t=e.sent(),n.printDiff(t,r,r.cid,this.storeName),e.label=3;case 3:return[2,this.localForage.setItem(r.cid,r)]}}))}))},r.prototype.find=function(r){return e.__awaiter(this,void 0,void 0,(function(){return e.__generator(this,(function(e){switch(e.label){case 0:return[4,this.ready];case 1:if(e.sent(),!r)throw new Error("Invalid key passed to store");return[2,this.localForage.getItem(r)]}}))}))},r.prototype.findAll=function(){return e.__awaiter(this,void 0,void 0,(function(){var r;return e.__generator(this,(function(e){switch(e.label){case 0:return[4,this.ready];case 1:return e.sent(),r=[],[4,this.localForage.iterate((function(e){r.push(e)}))];case 2:return e.sent(),[2,r]}}))}))},r.prototype.delete=function(r){return e.__awaiter(this,void 0,void 0,(function(){return e.__generator(this,(function(e){switch(e.label){case 0:return[4,this.ready];case 1:if(e.sent(),!r)throw new Error("Invalid key passed to store");return[2,this.localForage.removeItem(r)]}}))}))},r.prototype.deleteAll=function(){return e.__awaiter(this,void 0,void 0,(function(){var r,t=this;return e.__generator(this,(function(e){switch(e.label){case 0:return[4,this.ready];case 1:return e.sent(),[4,this.findAll()];case 2:return r=e.sent(),[4,Promise.all(r.map((function(e){return t.delete(e)})))];case 3:return e.sent(),[2]}}))}))},r.prototype.export=function(){return e.__awaiter(this,void 0,void 0,(function(){var r;return e.__generator(this,(function(t){switch(t.label){case 0:return[4,this.ready];case 1:return t.sent(),r=function(r,t){var i;return e.__assign(e.__assign({},r),((i={})[t.cid]=t,i))},[4,this.findAll()];case 2:return[2,t.sent().reduce(r,{})]}}))}))},r.prototype.import=function(r){return e.__awaiter(this,void 0,void 0,(function(){var t,i=this;return e.__generator(this,(function(e){switch(e.label){case 0:return[4,this.ready];case 1:return e.sent(),[4,this.deleteAll()];case 2:if(e.sent(),"object"!=typeof r)throw new Error("Invalid obj passed to store");return t=Object.entries(r).map((function(e){var r=e[1];return i.save(r)})),[4,Promise.all(t)];case 3:return e.sent(),[2]}}))}))},r}();exports.default=d;
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var tslib = require('tslib');
6
+ var LocalForage = require('localforage');
7
+ var CordovaSQLiteDriver = require('localforage-cordovasqlitedriver');
8
+ var utils = require('@flumens/utils');
9
+ var utils$1 = require('./utils.js');
10
+
11
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
12
+
13
+ var LocalForage__default = /*#__PURE__*/_interopDefaultLegacy(LocalForage);
14
+ var CordovaSQLiteDriver__default = /*#__PURE__*/_interopDefaultLegacy(CordovaSQLiteDriver);
15
+
16
+ var defaultDriverOrder = ['indexeddb', 'websql', 'localstorage'];
17
+ if (utils.isPlatform('hybrid')) {
18
+ if (!window.sqlitePlugin) {
19
+ throw new Error('cordova-sql-storage plugin is missing. Please install it.');
20
+ }
21
+ defaultDriverOrder = tslib.__spreadArray([CordovaSQLiteDriver__default["default"]], defaultDriverOrder, true);
22
+ }
23
+ // create local store
24
+ var defaultConfig = {
25
+ driverOrder: defaultDriverOrder,
26
+ };
27
+ var LocalForageStore = /** @class */ (function () {
28
+ function LocalForageStore(options) {
29
+ var _this = this;
30
+ var config = tslib.__assign(tslib.__assign({}, defaultConfig), options);
31
+ this.debugging = config.debugging;
32
+ // initialize db
33
+ this.localForage = null;
34
+ this.ready = new Promise(function (resolve, reject) {
35
+ // check custom drivers (eg. SQLite)
36
+ var customDriversPromise = new Promise(function (_resolve) {
37
+ if (config.driverOrder && typeof config.driverOrder[0] === 'object') {
38
+ LocalForage__default["default"].defineDriver(config.driverOrder[0]).then(_resolve);
39
+ }
40
+ else {
41
+ _resolve(undefined);
42
+ }
43
+ });
44
+ if (!config.storeName) {
45
+ throw new Error('storeName prop is missing');
46
+ }
47
+ _this.storeName = config.storeName;
48
+ // config
49
+ customDriversPromise.then(function () {
50
+ var dbConfig = {
51
+ name: config.name || 'indicia',
52
+ storeName: config.storeName,
53
+ };
54
+ if (config.version) {
55
+ dbConfig.version = config.version;
56
+ }
57
+ var drivers = LocalForageStore._getDriverOrder(config.driverOrder);
58
+ var DB = config.LocalForage || LocalForage__default["default"];
59
+ // init
60
+ _this.localForage = DB.createInstance(dbConfig);
61
+ _this.localForage.setDriver(drivers).then(resolve).catch(reject);
62
+ });
63
+ });
64
+ }
65
+ LocalForageStore._getDriverOrder = function (driverOrder) {
66
+ return driverOrder.map(function (driver) {
67
+ switch (driver) {
68
+ case 'indexeddb':
69
+ return LocalForage__default["default"].INDEXEDDB;
70
+ case 'websql':
71
+ return LocalForage__default["default"].WEBSQL;
72
+ case 'localstorage':
73
+ return LocalForage__default["default"].LOCALSTORAGE;
74
+ default:
75
+ // custom
76
+ if (typeof driver === 'object' && driver._driver) {
77
+ return driver._driver;
78
+ }
79
+ return console.error('No such db driver!');
80
+ }
81
+ });
82
+ };
83
+ LocalForageStore.prototype.save = function (val) {
84
+ return tslib.__awaiter(this, void 0, void 0, function () {
85
+ var currentVal;
86
+ return tslib.__generator(this, function (_a) {
87
+ switch (_a.label) {
88
+ case 0: return [4 /*yield*/, this.ready];
89
+ case 1:
90
+ _a.sent();
91
+ if (!val.cid) {
92
+ throw new Error('Invalid key passed to store');
93
+ }
94
+ if (!this.debugging) return [3 /*break*/, 3];
95
+ return [4 /*yield*/, this.find(val.cid)];
96
+ case 2:
97
+ currentVal = _a.sent();
98
+ utils$1.printDiff(currentVal, val, val.cid, this.storeName);
99
+ _a.label = 3;
100
+ case 3: return [2 /*return*/, this.localForage.setItem(val.cid, val)];
101
+ }
102
+ });
103
+ });
104
+ };
105
+ LocalForageStore.prototype.find = function (key) {
106
+ return tslib.__awaiter(this, void 0, void 0, function () {
107
+ return tslib.__generator(this, function (_a) {
108
+ switch (_a.label) {
109
+ case 0: return [4 /*yield*/, this.ready];
110
+ case 1:
111
+ _a.sent();
112
+ if (!key) {
113
+ throw new Error('Invalid key passed to store');
114
+ }
115
+ return [2 /*return*/, this.localForage.getItem(key)];
116
+ }
117
+ });
118
+ });
119
+ };
120
+ LocalForageStore.prototype.findAll = function () {
121
+ return tslib.__awaiter(this, void 0, void 0, function () {
122
+ var models;
123
+ return tslib.__generator(this, function (_a) {
124
+ switch (_a.label) {
125
+ case 0: return [4 /*yield*/, this.ready];
126
+ case 1:
127
+ _a.sent();
128
+ models = [];
129
+ return [4 /*yield*/, this.localForage.iterate(function (value) {
130
+ models.push(value);
131
+ })];
132
+ case 2:
133
+ _a.sent();
134
+ return [2 /*return*/, models];
135
+ }
136
+ });
137
+ });
138
+ };
139
+ LocalForageStore.prototype.delete = function (key) {
140
+ return tslib.__awaiter(this, void 0, void 0, function () {
141
+ return tslib.__generator(this, function (_a) {
142
+ switch (_a.label) {
143
+ case 0: return [4 /*yield*/, this.ready];
144
+ case 1:
145
+ _a.sent();
146
+ if (!key) {
147
+ throw new Error('Invalid key passed to store');
148
+ }
149
+ return [2 /*return*/, this.localForage.removeItem(key)];
150
+ }
151
+ });
152
+ });
153
+ };
154
+ LocalForageStore.prototype.deleteAll = function () {
155
+ return tslib.__awaiter(this, void 0, void 0, function () {
156
+ var models;
157
+ var _this = this;
158
+ return tslib.__generator(this, function (_a) {
159
+ switch (_a.label) {
160
+ case 0: return [4 /*yield*/, this.ready];
161
+ case 1:
162
+ _a.sent();
163
+ return [4 /*yield*/, this.findAll()];
164
+ case 2:
165
+ models = _a.sent();
166
+ return [4 /*yield*/, Promise.all(models.map(function (model) { return _this.delete(model); }))];
167
+ case 3:
168
+ _a.sent();
169
+ return [2 /*return*/];
170
+ }
171
+ });
172
+ });
173
+ };
174
+ /**
175
+ * Exports all objects from the store.
176
+ */
177
+ LocalForageStore.prototype.export = function () {
178
+ return tslib.__awaiter(this, void 0, void 0, function () {
179
+ var addCIDs;
180
+ return tslib.__generator(this, function (_a) {
181
+ switch (_a.label) {
182
+ case 0: return [4 /*yield*/, this.ready];
183
+ case 1:
184
+ _a.sent();
185
+ addCIDs = function (agg, val) {
186
+ var _a;
187
+ return (tslib.__assign(tslib.__assign({}, agg), (_a = {}, _a[val.cid] = val, _a)));
188
+ };
189
+ return [4 /*yield*/, this.findAll()];
190
+ case 2: return [2 /*return*/, (_a.sent()).reduce(addCIDs, {})];
191
+ }
192
+ });
193
+ });
194
+ };
195
+ /**
196
+ * Imports objects to store.
197
+ */
198
+ LocalForageStore.prototype.import = function (obj) {
199
+ return tslib.__awaiter(this, void 0, void 0, function () {
200
+ var savingAll;
201
+ var _this = this;
202
+ return tslib.__generator(this, function (_a) {
203
+ switch (_a.label) {
204
+ case 0: return [4 /*yield*/, this.ready];
205
+ case 1:
206
+ _a.sent();
207
+ return [4 /*yield*/, this.deleteAll()];
208
+ case 2:
209
+ _a.sent();
210
+ if (typeof obj !== 'object') {
211
+ throw new Error('Invalid obj passed to store');
212
+ }
213
+ savingAll = Object.entries(obj).map(function (_a) {
214
+ var val = _a[1];
215
+ return _this.save(val);
216
+ });
217
+ return [4 /*yield*/, Promise.all(savingAll)];
218
+ case 3:
219
+ _a.sent();
220
+ return [2 /*return*/];
221
+ }
222
+ });
223
+ });
224
+ };
225
+ return LocalForageStore;
226
+ }());
227
+
228
+ exports["default"] = LocalForageStore;
@@ -1,5 +1,5 @@
1
1
  import { SQLiteConnection } from '@capacitor-community/sqlite';
2
- import Deferred from '@flumens/utils/dist/deferred';
2
+ import { Deferred } from '@flumens/utils';
3
3
  type SQLiteDatabaseOptions = {
4
4
  name?: string;
5
5
  debug?: boolean;