w-orm-lowdb 1.0.1 → 1.0.3

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.
@@ -29,7 +29,7 @@
29
29
  <nav >
30
30
 
31
31
 
32
- <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmLowdb.html">WOrmLowdb</a><ul class='methods'><li data-type='method'><a href="WOrmLowdb.html#.del">del</a></li><li data-type='method'><a href="WOrmLowdb.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmLowdb.html#.insert">insert</a></li><li data-type='method'><a href="WOrmLowdb.html#.save">save</a></li><li data-type='method'><a href="WOrmLowdb.html#.select">select</a></li></ul></li></ul>
32
+ <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmLowdb.html">WOrmLowdb</a><ul class='methods'><li data-type='method'><a href="WOrmLowdb.html#.delAllCore">delAllCore</a></li><li data-type='method'><a href="WOrmLowdb.html#.delCore">delCore</a></li><li data-type='method'><a href="WOrmLowdb.html#.insertCore">insertCore</a></li><li data-type='method'><a href="WOrmLowdb.html#.saveCore">saveCore</a></li><li data-type='method'><a href="WOrmLowdb.html#.selectCore">selectCore</a></li></ul></li></ul>
33
33
 
34
34
  </nav>
35
35
 
@@ -48,7 +48,7 @@
48
48
  <pre class="prettyprint source linenums"><code>import events from 'events'
49
49
  import { Low } from 'lowdb'
50
50
  import { JSONFile } from 'lowdb/node'
51
- import { Query } from 'mingo'
51
+ import { Query } from 'mingo' //須指定安裝6.5.6, 若6.6.0無法匯入Query
52
52
  import get from 'lodash-es/get.js'
53
53
  import each from 'lodash-es/each.js'
54
54
  import map from 'lodash-es/map.js'
@@ -64,6 +64,12 @@ import iseobj from 'wsemi/src/iseobj.mjs'
64
64
  import isearr from 'wsemi/src/isearr.mjs'
65
65
  import haskey from 'wsemi/src/haskey.mjs'
66
66
  import arrPullAt from 'wsemi/src/arrPullAt.mjs'
67
+ import waitFun from 'wsemi/src/waitFun.mjs'
68
+
69
+
70
+ //全域鎖, 一次僅能執行一種操作函數
71
+ //select理論上是不用鎖, 但因為操作上db.jon.tmp更名回db.json時似乎非rename而是串流寫入, 導致有機會撈到不完整json數據進而出錯, 故還是得要上鎖以策安全
72
+ let glock = false
67
73
 
68
74
 
69
75
  /**
@@ -120,7 +126,7 @@ function WOrmLowdb(opt = {}) {
120
126
  * @param {Object} [find={}] 輸入查詢條件物件
121
127
  * @returns {Promise} 回傳Promise,resolve回傳數據,reject回傳錯誤訊息
122
128
  */
123
- async function select(find = {}) {
129
+ async function selectCore(find = {}) {
124
130
  let isErr = false
125
131
 
126
132
  //res
@@ -162,6 +168,18 @@ function WOrmLowdb(opt = {}) {
162
168
  }
163
169
  return res
164
170
  }
171
+ async function select(find = {}) {
172
+ if (glock) {
173
+ await waitFun(() => {
174
+ return !glock
175
+ })
176
+ }
177
+ glock = true
178
+ return await selectCore(find)
179
+ .finally(() => {
180
+ glock = false
181
+ })
182
+ }
165
183
 
166
184
  /**
167
185
  * 插入數據,插入同樣數據會自動產生不同_id,故insert前需自行判斷有無重複
@@ -170,7 +188,7 @@ function WOrmLowdb(opt = {}) {
170
188
  * @param {Object|Array} data 輸入數據物件或陣列
171
189
  * @returns {Promise} 回傳Promise,resolve回傳插入結果,reject回傳錯誤訊息
172
190
  */
173
- async function insert(data) {
191
+ async function insertCore(data) {
174
192
  let isErr = false
175
193
 
176
194
  //check
@@ -260,6 +278,18 @@ function WOrmLowdb(opt = {}) {
260
278
  }
261
279
  return res
262
280
  }
281
+ async function insert(data) {
282
+ if (glock) {
283
+ await waitFun(() => {
284
+ return !glock
285
+ })
286
+ }
287
+ glock = true
288
+ return await insertCore(data)
289
+ .finally(() => {
290
+ glock = false
291
+ })
292
+ }
263
293
 
264
294
  /**
265
295
  * 儲存數據
@@ -270,7 +300,7 @@ function WOrmLowdb(opt = {}) {
270
300
  * @param {boolean} [option.autoInsert=true] 輸入是否於儲存時發現原本無數據,則自動改以插入處理,預設為true
271
301
  * @returns {Promise} 回傳Promise,resolve回傳儲存結果,reject回傳錯誤訊息
272
302
  */
273
- async function save(data, option = {}) {
303
+ async function saveCore(data, option = {}) {
274
304
  let isErr = false
275
305
 
276
306
  //check
@@ -322,11 +352,8 @@ function WOrmLowdb(opt = {}) {
322
352
  //rest
323
353
  let rest = null
324
354
 
325
- //id
326
- let id = get(v, 'id', '')
327
-
328
- //查找資料表內v.id為_v
329
- let r = get(kp, id, null)
355
+ //查找資料表內v.id
356
+ let r = get(kp, v.id, null)
330
357
 
331
358
  //check
332
359
  if (iseobj(r)) {
@@ -363,7 +390,7 @@ function WOrmLowdb(opt = {}) {
363
390
 
364
391
  //autoInsert
365
392
  if (autoInsert &amp;&amp; rest.n === 0) {
366
- rest = await insert(v)
393
+ rest = await insertCore(v)
367
394
  }
368
395
 
369
396
  return rest
@@ -388,6 +415,18 @@ function WOrmLowdb(opt = {}) {
388
415
  }
389
416
  return res
390
417
  }
418
+ async function save(data, option = {}) {
419
+ if (glock) {
420
+ await waitFun(() => {
421
+ return !glock
422
+ })
423
+ }
424
+ glock = true
425
+ return await saveCore(data, option)
426
+ .finally(() => {
427
+ glock = false
428
+ })
429
+ }
391
430
 
392
431
  /**
393
432
  * 刪除數據
@@ -396,7 +435,7 @@ function WOrmLowdb(opt = {}) {
396
435
  * @param {Object|Array} data 輸入數據物件或陣列
397
436
  * @returns {Promise} 回傳Promise,resolve回傳刪除結果,reject回傳錯誤訊息
398
437
  */
399
- async function del(data) {
438
+ async function delCore(data) {
400
439
  let isErr = false
401
440
 
402
441
  //check
@@ -516,6 +555,18 @@ function WOrmLowdb(opt = {}) {
516
555
  }
517
556
  return res
518
557
  }
558
+ async function del(data) {
559
+ if (glock) {
560
+ await waitFun(() => {
561
+ return !glock
562
+ })
563
+ }
564
+ glock = true
565
+ return await delCore(data)
566
+ .finally(() => {
567
+ glock = false
568
+ })
569
+ }
519
570
 
520
571
  /**
521
572
  * 刪除全部數據,需與del分開,避免未傳數據導致直接刪除全表
@@ -524,7 +575,7 @@ function WOrmLowdb(opt = {}) {
524
575
  * @param {Object} [find={}] 輸入刪除條件物件
525
576
  * @returns {Promise} 回傳Promise,resolve回傳刪除結果,reject回傳錯誤訊息
526
577
  */
527
- async function delAll(find = {}) {
578
+ async function delAllCore(find = {}) {
528
579
  let isErr = false
529
580
 
530
581
  //res
@@ -629,6 +680,18 @@ function WOrmLowdb(opt = {}) {
629
680
  }
630
681
  return res
631
682
  }
683
+ async function delAll(find = {}) {
684
+ if (glock) {
685
+ await waitFun(() => {
686
+ return !glock
687
+ })
688
+ }
689
+ glock = true
690
+ return await delAllCore(find)
691
+ .finally(() => {
692
+ glock = false
693
+ })
694
+ }
632
695
 
633
696
  //bind
634
697
  ee.select = select
@@ -656,7 +719,7 @@ export default WOrmLowdb
656
719
  <br class="clear">
657
720
 
658
721
  <footer>
659
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Wed Apr 02 2025 11:25:26 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
722
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Fri May 09 2025 12:29:37 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
660
723
  </footer>
661
724
 
662
725
  <script>prettyPrint();</script>
package/docs/index.html CHANGED
@@ -29,7 +29,7 @@
29
29
  <nav >
30
30
 
31
31
 
32
- <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmLowdb.html">WOrmLowdb</a><ul class='methods'><li data-type='method'><a href="WOrmLowdb.html#.del">del</a></li><li data-type='method'><a href="WOrmLowdb.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmLowdb.html#.insert">insert</a></li><li data-type='method'><a href="WOrmLowdb.html#.save">save</a></li><li data-type='method'><a href="WOrmLowdb.html#.select">select</a></li></ul></li></ul>
32
+ <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmLowdb.html">WOrmLowdb</a><ul class='methods'><li data-type='method'><a href="WOrmLowdb.html#.delAllCore">delAllCore</a></li><li data-type='method'><a href="WOrmLowdb.html#.delCore">delCore</a></li><li data-type='method'><a href="WOrmLowdb.html#.insertCore">insertCore</a></li><li data-type='method'><a href="WOrmLowdb.html#.saveCore">saveCore</a></li><li data-type='method'><a href="WOrmLowdb.html#.selectCore">selectCore</a></li></ul></li></ul>
33
33
 
34
34
  </nav>
35
35
 
@@ -71,7 +71,7 @@
71
71
  <br class="clear">
72
72
 
73
73
  <footer>
74
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Wed Apr 02 2025 11:25:26 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
74
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Fri May 09 2025 12:29:37 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
75
75
  </footer>
76
76
 
77
77
  <script>prettyPrint();</script>
package/g-basic.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import wo from './src/WOrmLowdb.mjs'
2
- //import wo from './dist/w-orm-lowdb.umd.js'
1
+ import WOrm from './src/WOrmLowdb.mjs'
2
+ //import WOrm from './dist/w-orm-lowdb.umd.js'
3
3
  // import w from 'wsemi'
4
4
 
5
5
 
@@ -46,19 +46,16 @@ let rsm = [
46
46
 
47
47
  async function test() {
48
48
 
49
-
50
- //w
51
- let w = wo(opt)
52
-
49
+ //wo
50
+ let wo = WOrm(opt)
53
51
 
54
52
  //on
55
- w.on('change', function(mode, data, res) {
53
+ wo.on('change', function(mode, data, res) {
56
54
  console.log('change', mode)
57
55
  })
58
56
 
59
-
60
57
  //delAll
61
- await w.delAll()
58
+ await wo.delAll()
62
59
  .then(function(msg) {
63
60
  console.log('delAll then', msg)
64
61
  })
@@ -66,9 +63,8 @@ async function test() {
66
63
  console.log('delAll catch', msg)
67
64
  })
68
65
 
69
-
70
66
  //insert
71
- await w.insert(rs)
67
+ await wo.insert(rs)
72
68
  .then(function(msg) {
73
69
  console.log('insert then', msg)
74
70
  })
@@ -76,9 +72,8 @@ async function test() {
76
72
  console.log('insert catch', msg)
77
73
  })
78
74
 
79
-
80
75
  //save
81
- await w.save(rsm, { autoInsert: false })
76
+ await wo.save(rsm, { autoInsert: false })
82
77
  .then(function(msg) {
83
78
  console.log('save then', msg)
84
79
  })
@@ -86,42 +81,35 @@ async function test() {
86
81
  console.log('save catch', msg)
87
82
  })
88
83
 
89
-
90
84
  //select all
91
- let ss = await w.select()
85
+ let ss = await wo.select()
92
86
  console.log('select all', ss)
93
87
 
94
-
95
88
  //select
96
- let so = await w.select({ id: 'id-rosemary' })
89
+ let so = await wo.select({ id: 'id-rosemary' })
97
90
  console.log('select', so)
98
91
 
99
-
100
92
  //select by $and, $gt, $lt
101
- let spa = await w.select({ '$and': [{ value: { '$gt': 123 } }, { value: { '$lt': 200 } }] })
93
+ let spa = await wo.select({ '$and': [{ value: { '$gt': 123 } }, { value: { '$lt': 200 } }] })
102
94
  console.log('select by $and, $gt, $lt', spa)
103
95
 
104
-
105
96
  //select by $or, $gte, $lte
106
- let spb = await w.select({ '$or': [{ value: { '$lte': -1 } }, { value: { '$gte': 200 } }] })
97
+ let spb = await wo.select({ '$or': [{ value: { '$lte': -1 } }, { value: { '$gte': 200 } }] })
107
98
  console.log('select by $or, $gte, $lte', spb)
108
99
 
109
-
110
100
  //select by $or, $and, $ne, $in, $nin
111
- let spc = await w.select({ '$or': [{ '$and': [{ value: { '$ne': 123 } }, { value: { '$in': [123, 321, 123.456, 456] } }, { value: { '$nin': [456, 654] } }] }, { '$or': [{ value: { '$lte': -1 } }, { value: { '$gte': 400 } }] }] })
101
+ let spc = await wo.select({ '$or': [{ '$and': [{ value: { '$ne': 123 } }, { value: { '$in': [123, 321, 123.456, 456] } }, { value: { '$nin': [456, 654] } }] }, { '$or': [{ value: { '$lte': -1 } }, { value: { '$gte': 400 } }] }] })
112
102
  console.log('select by $or, $and, $ne, $in, $nin', spc)
113
103
 
114
-
115
104
  // //select by regex //mingo不支援regex
116
- // let sr = await w.select({ name: { $regex: 'PeT', $options: '$i' } })
105
+ // let sr = await wo.select({ name: { $regex: 'PeT', $options: '$i' } })
117
106
  // console.log('selectReg', sr)
118
107
 
119
-
120
108
  //del
121
109
  let d = ss.filter(function(v) {
122
110
  return v.name === 'kettle'
123
111
  })
124
- await w.del(d)
112
+ await wo.del(d)
125
113
  .then(function(msg) {
126
114
  console.log('del then', msg)
127
115
  })
@@ -129,7 +117,6 @@ async function test() {
129
117
  console.log('del catch', msg)
130
118
  })
131
119
 
132
-
133
120
  }
134
121
  test()
135
122
  // change delAll
@@ -175,4 +162,5 @@ test()
175
162
  // change del
176
163
  // del then [ { n: 1, nDeleted: 1, ok: 1 } ]
177
164
 
178
- //node --experimental-modules g-basic.mjs
165
+
166
+ //node g-basic.mjs
package/package.json CHANGED
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "w-orm-lowdb",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "main": "dist/w-orm-lowdb.umd.js",
5
5
  "dependencies": {
6
6
  "lodash-es": "^4.17.21",
7
7
  "lowdb": "^7.0.1",
8
- "mingo": "^6.5.6",
9
- "wsemi": "^1.7.74"
8
+ "mingo": "^6.6.1",
9
+ "wsemi": "^1.7.90"
10
10
  },
11
11
  "devDependencies": {
12
- "w-package-tools": "^1.0.85"
12
+ "w-package-tools": "^1.0.90"
13
13
  },
14
14
  "scripts": {
15
- "test": "mocha --parallel --timeout 60000 --experimental-modules",
15
+ "test": "mocha --parallel --timeout 60000",
16
16
  "deploy": "gh-pages -d docs"
17
17
  },
18
18
  "repository": {
package/script.txt CHANGED
@@ -1,10 +1,10 @@
1
- #node --experimental-modules toolg/addVersion.mjs
2
- node --experimental-modules toolg/modifyReadme.mjs
1
+ #node toolg/addVersion.mjs
2
+ node toolg/modifyReadme.mjs
3
3
 
4
- node --experimental-modules toolg/cleanFolder.mjs
4
+ node toolg/cleanFolder.mjs
5
5
  ./node_modules/.bin/jsdoc -c .jsdoc
6
6
 
7
- node --experimental-modules toolg/gDistRollup.mjs
7
+ node toolg/gDistRollup.mjs
8
8
 
9
9
  git add . -A
10
10
  git commit -m 'modify: '
package/src/WOrmLowdb.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import events from 'events'
2
2
  import { Low } from 'lowdb'
3
3
  import { JSONFile } from 'lowdb/node'
4
- import { Query } from 'mingo'
4
+ import { Query } from 'mingo' //須指定安裝6.5.6, 若6.6.0無法匯入Query
5
5
  import get from 'lodash-es/get.js'
6
6
  import each from 'lodash-es/each.js'
7
7
  import map from 'lodash-es/map.js'
@@ -17,6 +17,12 @@ import iseobj from 'wsemi/src/iseobj.mjs'
17
17
  import isearr from 'wsemi/src/isearr.mjs'
18
18
  import haskey from 'wsemi/src/haskey.mjs'
19
19
  import arrPullAt from 'wsemi/src/arrPullAt.mjs'
20
+ import waitFun from 'wsemi/src/waitFun.mjs'
21
+
22
+
23
+ //全域鎖, 一次僅能執行一種操作函數
24
+ //select理論上是不用鎖, 但因為操作上db.jon.tmp更名回db.json時似乎非rename而是串流寫入, 導致有機會撈到不完整json數據進而出錯, 故還是得要上鎖以策安全
25
+ let glock = false
20
26
 
21
27
 
22
28
  /**
@@ -73,7 +79,7 @@ function WOrmLowdb(opt = {}) {
73
79
  * @param {Object} [find={}] 輸入查詢條件物件
74
80
  * @returns {Promise} 回傳Promise,resolve回傳數據,reject回傳錯誤訊息
75
81
  */
76
- async function select(find = {}) {
82
+ async function selectCore(find = {}) {
77
83
  let isErr = false
78
84
 
79
85
  //res
@@ -115,6 +121,18 @@ function WOrmLowdb(opt = {}) {
115
121
  }
116
122
  return res
117
123
  }
124
+ async function select(find = {}) {
125
+ if (glock) {
126
+ await waitFun(() => {
127
+ return !glock
128
+ })
129
+ }
130
+ glock = true
131
+ return await selectCore(find)
132
+ .finally(() => {
133
+ glock = false
134
+ })
135
+ }
118
136
 
119
137
  /**
120
138
  * 插入數據,插入同樣數據會自動產生不同_id,故insert前需自行判斷有無重複
@@ -123,7 +141,7 @@ function WOrmLowdb(opt = {}) {
123
141
  * @param {Object|Array} data 輸入數據物件或陣列
124
142
  * @returns {Promise} 回傳Promise,resolve回傳插入結果,reject回傳錯誤訊息
125
143
  */
126
- async function insert(data) {
144
+ async function insertCore(data) {
127
145
  let isErr = false
128
146
 
129
147
  //check
@@ -213,6 +231,18 @@ function WOrmLowdb(opt = {}) {
213
231
  }
214
232
  return res
215
233
  }
234
+ async function insert(data) {
235
+ if (glock) {
236
+ await waitFun(() => {
237
+ return !glock
238
+ })
239
+ }
240
+ glock = true
241
+ return await insertCore(data)
242
+ .finally(() => {
243
+ glock = false
244
+ })
245
+ }
216
246
 
217
247
  /**
218
248
  * 儲存數據
@@ -223,7 +253,7 @@ function WOrmLowdb(opt = {}) {
223
253
  * @param {boolean} [option.autoInsert=true] 輸入是否於儲存時發現原本無數據,則自動改以插入處理,預設為true
224
254
  * @returns {Promise} 回傳Promise,resolve回傳儲存結果,reject回傳錯誤訊息
225
255
  */
226
- async function save(data, option = {}) {
256
+ async function saveCore(data, option = {}) {
227
257
  let isErr = false
228
258
 
229
259
  //check
@@ -275,11 +305,8 @@ function WOrmLowdb(opt = {}) {
275
305
  //rest
276
306
  let rest = null
277
307
 
278
- //id
279
- let id = get(v, 'id', '')
280
-
281
- //查找資料表內v.id為_v
282
- let r = get(kp, id, null)
308
+ //查找資料表內v.id
309
+ let r = get(kp, v.id, null)
283
310
 
284
311
  //check
285
312
  if (iseobj(r)) {
@@ -316,7 +343,7 @@ function WOrmLowdb(opt = {}) {
316
343
 
317
344
  //autoInsert
318
345
  if (autoInsert && rest.n === 0) {
319
- rest = await insert(v)
346
+ rest = await insertCore(v)
320
347
  }
321
348
 
322
349
  return rest
@@ -341,6 +368,18 @@ function WOrmLowdb(opt = {}) {
341
368
  }
342
369
  return res
343
370
  }
371
+ async function save(data, option = {}) {
372
+ if (glock) {
373
+ await waitFun(() => {
374
+ return !glock
375
+ })
376
+ }
377
+ glock = true
378
+ return await saveCore(data, option)
379
+ .finally(() => {
380
+ glock = false
381
+ })
382
+ }
344
383
 
345
384
  /**
346
385
  * 刪除數據
@@ -349,7 +388,7 @@ function WOrmLowdb(opt = {}) {
349
388
  * @param {Object|Array} data 輸入數據物件或陣列
350
389
  * @returns {Promise} 回傳Promise,resolve回傳刪除結果,reject回傳錯誤訊息
351
390
  */
352
- async function del(data) {
391
+ async function delCore(data) {
353
392
  let isErr = false
354
393
 
355
394
  //check
@@ -469,6 +508,18 @@ function WOrmLowdb(opt = {}) {
469
508
  }
470
509
  return res
471
510
  }
511
+ async function del(data) {
512
+ if (glock) {
513
+ await waitFun(() => {
514
+ return !glock
515
+ })
516
+ }
517
+ glock = true
518
+ return await delCore(data)
519
+ .finally(() => {
520
+ glock = false
521
+ })
522
+ }
472
523
 
473
524
  /**
474
525
  * 刪除全部數據,需與del分開,避免未傳數據導致直接刪除全表
@@ -477,7 +528,7 @@ function WOrmLowdb(opt = {}) {
477
528
  * @param {Object} [find={}] 輸入刪除條件物件
478
529
  * @returns {Promise} 回傳Promise,resolve回傳刪除結果,reject回傳錯誤訊息
479
530
  */
480
- async function delAll(find = {}) {
531
+ async function delAllCore(find = {}) {
481
532
  let isErr = false
482
533
 
483
534
  //res
@@ -582,6 +633,18 @@ function WOrmLowdb(opt = {}) {
582
633
  }
583
634
  return res
584
635
  }
636
+ async function delAll(find = {}) {
637
+ if (glock) {
638
+ await waitFun(() => {
639
+ return !glock
640
+ })
641
+ }
642
+ glock = true
643
+ return await delAllCore(find)
644
+ .finally(() => {
645
+ glock = false
646
+ })
647
+ }
585
648
 
586
649
  //bind
587
650
  ee.select = select