UNPKG

3.22 kBJavaScriptView Raw
1const Cursor = require('./Cursor'),
2 OriginalDatastore = require('nedb');
3
4class Datastore {
5 constructor(options) {
6 Object.defineProperties(this, {
7 __loaded: {
8 enumerable: false,
9 writable: true,
10 value: false
11 },
12
13 __original: {
14 configurable: true,
15 enumerable: false,
16 writable: false,
17 value: new OriginalDatastore(options)
18 }
19 });
20 }
21
22 load() {
23 if (!!this.__loaded)
24 return Promise.resolve();
25 return new Promise((resolve, reject) => {
26 this.__original.loadDatabase((error) => {
27 if (error)
28 reject(error);
29 this.__loaded = true;
30 resolve();
31 });
32 });
33 }
34
35 find(query, projection) {
36 if (typeof projection === 'function')
37 projection = {};
38 return new Cursor(this.__original.find(query, projection), this.load());
39 }
40
41 findOne(query, projection) {
42 if (typeof projection === 'function')
43 projection = {};
44
45 return this.load().then(() => {
46 return new Promise((resolve, reject) => {
47 this.__original.findOne(query, projection, (error, result) => {
48 if (error)
49 reject(error);
50 else resolve(result);
51 });
52 });
53 });
54 }
55
56 insert(docs) {
57 return this.load().then(() => {
58 return new Promise((resolve, reject) => {
59 this.__original.insert(docs, (error, result) => {
60 if (error)
61 reject(error);
62 else resolve(result);
63 });
64 });
65 });
66 }
67
68 update(query, update, options = {}) {
69 return this.load().then(() => {
70 return new Promise((resolve, reject) => {
71 this.__original.update(query, update, options, (error, numAffected, affectedDocuments, upsert) => {
72 if (error)
73 reject(error);
74 else if (options.upsert === true || options.returnUpdatedDocs === true) {
75 resolve([numAffected, affectedDocuments, upsert]);
76 }
77 else resolve(numAffected);
78 });
79 });
80 });
81 }
82
83 remove(query, options = {}) {
84 return this.load().then(() => {
85 return new Promise((resolve, reject) => {
86 this.__original.remove(query, options, (error, result) => {
87 if (error)
88 reject(error);
89 else resolve(result);
90 });
91 });
92 });
93 }
94
95 count(query) {
96 return this.load().then(() => {
97 return new Promise((resolve, reject) => {
98 this.__original.count(query, (error, result) => {
99 if (error)
100 reject(error);
101 else resolve(result);
102 });
103 });
104 });
105 }
106
107 ensureIndex(options) {
108 return this.load().then(() => {
109 return new Promise((resolve, reject) => {
110 this.__original.ensureIndex(options, (error) => {
111 if (error)
112 reject(error);
113 else resolve();
114 });
115 });
116 });
117 }
118
119 removeIndex(field) {
120 return this.load().then(() => {
121 return new Promise((resolve, reject) => {
122 this.__original.removeIndex(field, (error) => {
123 if (error)
124 reject(error);
125 else resolve();
126 });
127 });
128 });
129 }
130
131 static create(options) {
132 return new Proxy(new this(options), {
133 get(target, key) {
134 if (target[key]) {
135 return target[key];
136 }
137
138 return target.__original[key];
139 },
140
141 set(target, key, value) {
142 if (target.__original.hasOwnProperty(key)) {
143 target.__original[key] = value;
144 return true;
145 }
146
147 target[key] = value;
148
149 return true;
150 }
151 });
152 }
153}
154
155module.exports = Datastore;
\No newline at end of file