w-orm-lowdb 1.0.6 → 1.0.8

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.
@@ -49,7 +49,7 @@
49
49
  import events from 'events'
50
50
  import { Low } from 'lowdb'
51
51
  import { JSONFile } from 'lowdb/node'
52
- import { Query } from 'mingo' //須指定安裝6.5.6, 若6.6.0無法匯入Query
52
+ import { Query } from 'mingo'
53
53
  import get from 'lodash-es/get.js'
54
54
  import each from 'lodash-es/each.js'
55
55
  import map from 'lodash-es/map.js'
@@ -84,6 +84,9 @@ let kpGlock = {}
84
84
  */
85
85
  function WOrmLowdb(opt = {}) {
86
86
 
87
+ //_cache
88
+ let _cache = null
89
+
87
90
  //url
88
91
  let url = get(opt, 'url')
89
92
  if (!isestr(url)) {
@@ -128,6 +131,28 @@ function WOrmLowdb(opt = {}) {
128
131
  kpGlock[gkey] = false
129
132
  }
130
133
 
134
+ //getData
135
+ let getData = async() => {
136
+
137
+ //check
138
+ if (isarr(_cache)) {
139
+ return cloneDeep(_cache) //與外部使用數據脫勾
140
+ }
141
+
142
+ //read
143
+ await lowdb.read()
144
+
145
+ //default, 使用lowdb.read()初始化後須馬上檢測, 若無key則須先創建空陣列
146
+ if (!haskey(lowdb.data, key)) {
147
+ lowdb.data[key] = []
148
+ }
149
+
150
+ //update
151
+ _cache = lowdb.data[key]
152
+
153
+ return cloneDeep(_cache) //與外部使用數據脫勾
154
+ }
155
+
131
156
  /**
132
157
  * 查詢數據
133
158
  *
@@ -142,13 +167,8 @@ function WOrmLowdb(opt = {}) {
142
167
  let res = null
143
168
  try {
144
169
 
145
- //read
146
- await lowdb.read()
147
-
148
- //default, 使用lowdb.read()初始化後須馬上檢測, 若無key則須先創建空陣列
149
- if (!haskey(lowdb.data, key)) {
150
- lowdb.data[key] = []
151
- }
170
+ //ltdt
171
+ let ltdt = await getData()
152
172
 
153
173
  //filter
154
174
  if (iseobj(find)) {
@@ -158,12 +178,12 @@ function WOrmLowdb(opt = {}) {
158
178
  // console.log('q', q)
159
179
 
160
180
  //find
161
- res = q.find(lowdb.data[key]).all()
181
+ res = q.find(ltdt).all()
162
182
  // console.log('res', res)
163
183
 
164
184
  }
165
185
  else {
166
- res = lowdb.data[key]
186
+ res = ltdt
167
187
  }
168
188
 
169
189
  }
@@ -277,15 +297,28 @@ function WOrmLowdb(opt = {}) {
277
297
  ok: 1,
278
298
  }
279
299
 
280
- //emit
281
- ee.emit('change', 'insert', data, res)
282
-
283
300
  }
284
301
  catch (err) {
285
302
  isErr = true
286
303
  res = err
287
304
  }
288
305
 
306
+ //update, 不能保證插入多少, 一律重設快取
307
+ _cache = null
308
+
309
+ //emit, 於change可能須使用select, 故須放在重設快取之後
310
+ if (!isErr) {
311
+ try {
312
+
313
+ //emit
314
+ ee.emit('change', 'insert', data, res)
315
+
316
+ }
317
+ catch (err) {
318
+ console.log(err)
319
+ }
320
+ }
321
+
289
322
  if (isErr) {
290
323
  return Promise.reject(res)
291
324
  }
@@ -368,8 +401,11 @@ function WOrmLowdb(opt = {}) {
368
401
  //查找資料表內v.id
369
402
  let r = get(kp, v.id, null)
370
403
 
404
+ //existed
405
+ let existed = iseobj(r)
406
+
371
407
  //check
372
- if (iseobj(r)) {
408
+ if (existed) {
373
409
  //已存在v.id
374
410
  if (isEqual(v, r.v)) {
375
411
  //內容相同不更新
@@ -384,6 +420,9 @@ function WOrmLowdb(opt = {}) {
384
420
  b = true
385
421
  }
386
422
  }
423
+ else {
424
+ //內容不存在
425
+ }
387
426
 
388
427
  //rest
389
428
  if (iseobj(rest)) {
@@ -400,10 +439,24 @@ function WOrmLowdb(opt = {}) {
400
439
  ok: 1,
401
440
  }
402
441
  }
442
+ //rest.n === 0:
443
+ // 內容相同不更新, 不須update
444
+ // 內容不存在, 若autoInsert則須insert
403
445
 
404
446
  //autoInsert
405
- if (autoInsert && rest.n === 0) {
406
- rest = await insertCore(v)
447
+ if (autoInsert && rest.n === 0 && !existed) {
448
+ let k = size(lowdb.data[key])
449
+ lowdb.data[key].push(v)
450
+ kp[v.id] = {
451
+ k,
452
+ v: lowdb.data[key][k],
453
+ }
454
+ b = true
455
+ rest = {
456
+ n: 1,
457
+ nInserted: 1,
458
+ ok: 1,
459
+ }
407
460
  }
408
461
 
409
462
  return rest
@@ -414,15 +467,28 @@ function WOrmLowdb(opt = {}) {
414
467
  await lowdb.write()
415
468
  }
416
469
 
417
- //emit
418
- ee.emit('change', 'save', data, res)
419
-
420
470
  }
421
471
  catch (err) {
422
472
  isErr = true
423
473
  res = err
424
474
  }
425
475
 
476
+ //update, 不能保證變更多少, 一律重設快取
477
+ _cache = null
478
+
479
+ //emit, 於change可能須使用select, 故須放在重設快取之後
480
+ if (!isErr) {
481
+ try {
482
+
483
+ //emit
484
+ ee.emit('change', 'save', data, res)
485
+
486
+ }
487
+ catch (err) {
488
+ console.log(err)
489
+ }
490
+ }
491
+
426
492
  if (isErr) {
427
493
  return Promise.reject(res)
428
494
  }
@@ -554,15 +620,28 @@ function WOrmLowdb(opt = {}) {
554
620
  await lowdb.write()
555
621
  }
556
622
 
557
- //emit
558
- ee.emit('change', 'del', data, res)
559
-
560
623
  }
561
624
  catch (err) {
562
625
  isErr = true
563
626
  res = err
564
627
  }
565
628
 
629
+ //update, 不能保證刪除多少, 一律重設快取
630
+ _cache = null
631
+
632
+ //emit, 於change可能須使用select, 故須放在重設快取之後
633
+ if (!isErr) {
634
+ try {
635
+
636
+ //emit
637
+ ee.emit('change', 'del', data, res)
638
+
639
+ }
640
+ catch (err) {
641
+ console.log(err)
642
+ }
643
+ }
644
+
566
645
  if (isErr) {
567
646
  return Promise.reject(res)
568
647
  }
@@ -679,15 +758,28 @@ function WOrmLowdb(opt = {}) {
679
758
  ok: 1,
680
759
  }
681
760
 
682
- //emit
683
- ee.emit('change', 'delAll', null, res)
684
-
685
761
  }
686
762
  catch (err) {
687
763
  isErr = true
688
764
  res = err
689
765
  }
690
766
 
767
+ //update, 不能保證刪除多少, 一律重設快取
768
+ _cache = null
769
+
770
+ //emit, 於change可能須使用select, 故須放在重設快取之後
771
+ if (!isErr) {
772
+ try {
773
+
774
+ //emit
775
+ ee.emit('change', 'delAll', null, res)
776
+
777
+ }
778
+ catch (err) {
779
+ console.log(err)
780
+ }
781
+ }
782
+
691
783
  if (isErr) {
692
784
  return Promise.reject(res)
693
785
  }
@@ -732,7 +824,7 @@ export default WOrmLowdb
732
824
  <br class="clear">
733
825
 
734
826
  <footer>
735
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Sun May 11 2025 15:21:09 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
827
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Thu May 14 2026 19:54:31 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
736
828
  </footer>
737
829
 
738
830
  <script>prettyPrint();</script>
package/docs/index.html CHANGED
@@ -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 Sun May 11 2025 15:21:09 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.5</a> on Thu May 14 2026 19:54:31 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
@@ -44,6 +44,14 @@ let rsm = [
44
44
  },
45
45
  ]
46
46
 
47
+ let rsa = [
48
+ {
49
+ id: 'id-rosemary',
50
+ name: 'rosemary',
51
+ value: 654.321,
52
+ },
53
+ ]
54
+
47
55
  async function test() {
48
56
 
49
57
  //wo
@@ -105,6 +113,15 @@ async function test() {
105
113
  // let sr = await wo.select({ name: { $regex: 'PeT', $options: '$i' } })
106
114
  // console.log('selectReg', sr)
107
115
 
116
+ //save
117
+ await wo.save(rsa, { autoInsert: true })
118
+ .then(function(msg) {
119
+ console.log('save then', msg)
120
+ })
121
+ .catch(function(msg) {
122
+ console.log('save catch', msg)
123
+ })
124
+
108
125
  //del
109
126
  let d = ss.filter(function(v) {
110
127
  return v.name === 'kettle'
@@ -159,6 +176,8 @@ test()
159
176
  // value: 456
160
177
  // }
161
178
  // ]
179
+ // change save
180
+ // save then [ { n: 1, nModified: 1, ok: 1 } ]
162
181
  // change del
163
182
  // del then [ { n: 1, nDeleted: 1, ok: 1 } ]
164
183
 
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "w-orm-lowdb",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "main": "dist/w-orm-lowdb.umd.js",
5
5
  "dependencies": {
6
- "lodash-es": "^4.17.21",
6
+ "lodash-es": "^4.18.1",
7
7
  "lowdb": "^7.0.1",
8
- "mingo": "^6.6.1",
9
- "wsemi": "^1.7.90"
8
+ "mingo": "^7.2.1",
9
+ "wsemi": "^1.8.52"
10
10
  },
11
11
  "devDependencies": {
12
- "w-package-tools": "^1.0.90"
12
+ "w-package-tools": "^1.1.5"
13
13
  },
14
14
  "scripts": {
15
15
  "test": "mocha --parallel --timeout 60000",
package/script.txt CHANGED
@@ -15,4 +15,3 @@ npm run deploy
15
15
  #npm test
16
16
 
17
17
  #npm publish
18
-
package/src/WOrmLowdb.mjs CHANGED
@@ -2,7 +2,7 @@ import path from 'path'
2
2
  import events from 'events'
3
3
  import { Low } from 'lowdb'
4
4
  import { JSONFile } from 'lowdb/node'
5
- import { Query } from 'mingo' //須指定安裝6.5.6, 若6.6.0無法匯入Query
5
+ import { Query } from 'mingo'
6
6
  import get from 'lodash-es/get.js'
7
7
  import each from 'lodash-es/each.js'
8
8
  import map from 'lodash-es/map.js'
@@ -37,6 +37,9 @@ let kpGlock = {}
37
37
  */
38
38
  function WOrmLowdb(opt = {}) {
39
39
 
40
+ //_cache
41
+ let _cache = null
42
+
40
43
  //url
41
44
  let url = get(opt, 'url')
42
45
  if (!isestr(url)) {
@@ -81,6 +84,28 @@ function WOrmLowdb(opt = {}) {
81
84
  kpGlock[gkey] = false
82
85
  }
83
86
 
87
+ //getData
88
+ let getData = async() => {
89
+
90
+ //check
91
+ if (isarr(_cache)) {
92
+ return cloneDeep(_cache) //與外部使用數據脫勾
93
+ }
94
+
95
+ //read
96
+ await lowdb.read()
97
+
98
+ //default, 使用lowdb.read()初始化後須馬上檢測, 若無key則須先創建空陣列
99
+ if (!haskey(lowdb.data, key)) {
100
+ lowdb.data[key] = []
101
+ }
102
+
103
+ //update
104
+ _cache = lowdb.data[key]
105
+
106
+ return cloneDeep(_cache) //與外部使用數據脫勾
107
+ }
108
+
84
109
  /**
85
110
  * 查詢數據
86
111
  *
@@ -95,13 +120,8 @@ function WOrmLowdb(opt = {}) {
95
120
  let res = null
96
121
  try {
97
122
 
98
- //read
99
- await lowdb.read()
100
-
101
- //default, 使用lowdb.read()初始化後須馬上檢測, 若無key則須先創建空陣列
102
- if (!haskey(lowdb.data, key)) {
103
- lowdb.data[key] = []
104
- }
123
+ //ltdt
124
+ let ltdt = await getData()
105
125
 
106
126
  //filter
107
127
  if (iseobj(find)) {
@@ -111,12 +131,12 @@ function WOrmLowdb(opt = {}) {
111
131
  // console.log('q', q)
112
132
 
113
133
  //find
114
- res = q.find(lowdb.data[key]).all()
134
+ res = q.find(ltdt).all()
115
135
  // console.log('res', res)
116
136
 
117
137
  }
118
138
  else {
119
- res = lowdb.data[key]
139
+ res = ltdt
120
140
  }
121
141
 
122
142
  }
@@ -230,15 +250,28 @@ function WOrmLowdb(opt = {}) {
230
250
  ok: 1,
231
251
  }
232
252
 
233
- //emit
234
- ee.emit('change', 'insert', data, res)
235
-
236
253
  }
237
254
  catch (err) {
238
255
  isErr = true
239
256
  res = err
240
257
  }
241
258
 
259
+ //update, 不能保證插入多少, 一律重設快取
260
+ _cache = null
261
+
262
+ //emit, 於change可能須使用select, 故須放在重設快取之後
263
+ if (!isErr) {
264
+ try {
265
+
266
+ //emit
267
+ ee.emit('change', 'insert', data, res)
268
+
269
+ }
270
+ catch (err) {
271
+ console.log(err)
272
+ }
273
+ }
274
+
242
275
  if (isErr) {
243
276
  return Promise.reject(res)
244
277
  }
@@ -321,8 +354,11 @@ function WOrmLowdb(opt = {}) {
321
354
  //查找資料表內v.id
322
355
  let r = get(kp, v.id, null)
323
356
 
357
+ //existed
358
+ let existed = iseobj(r)
359
+
324
360
  //check
325
- if (iseobj(r)) {
361
+ if (existed) {
326
362
  //已存在v.id
327
363
  if (isEqual(v, r.v)) {
328
364
  //內容相同不更新
@@ -337,6 +373,9 @@ function WOrmLowdb(opt = {}) {
337
373
  b = true
338
374
  }
339
375
  }
376
+ else {
377
+ //內容不存在
378
+ }
340
379
 
341
380
  //rest
342
381
  if (iseobj(rest)) {
@@ -353,10 +392,24 @@ function WOrmLowdb(opt = {}) {
353
392
  ok: 1,
354
393
  }
355
394
  }
395
+ //rest.n === 0:
396
+ // 內容相同不更新, 不須update
397
+ // 內容不存在, 若autoInsert則須insert
356
398
 
357
399
  //autoInsert
358
- if (autoInsert && rest.n === 0) {
359
- rest = await insertCore(v)
400
+ if (autoInsert && rest.n === 0 && !existed) {
401
+ let k = size(lowdb.data[key])
402
+ lowdb.data[key].push(v)
403
+ kp[v.id] = {
404
+ k,
405
+ v: lowdb.data[key][k],
406
+ }
407
+ b = true
408
+ rest = {
409
+ n: 1,
410
+ nInserted: 1,
411
+ ok: 1,
412
+ }
360
413
  }
361
414
 
362
415
  return rest
@@ -367,15 +420,28 @@ function WOrmLowdb(opt = {}) {
367
420
  await lowdb.write()
368
421
  }
369
422
 
370
- //emit
371
- ee.emit('change', 'save', data, res)
372
-
373
423
  }
374
424
  catch (err) {
375
425
  isErr = true
376
426
  res = err
377
427
  }
378
428
 
429
+ //update, 不能保證變更多少, 一律重設快取
430
+ _cache = null
431
+
432
+ //emit, 於change可能須使用select, 故須放在重設快取之後
433
+ if (!isErr) {
434
+ try {
435
+
436
+ //emit
437
+ ee.emit('change', 'save', data, res)
438
+
439
+ }
440
+ catch (err) {
441
+ console.log(err)
442
+ }
443
+ }
444
+
379
445
  if (isErr) {
380
446
  return Promise.reject(res)
381
447
  }
@@ -507,15 +573,28 @@ function WOrmLowdb(opt = {}) {
507
573
  await lowdb.write()
508
574
  }
509
575
 
510
- //emit
511
- ee.emit('change', 'del', data, res)
512
-
513
576
  }
514
577
  catch (err) {
515
578
  isErr = true
516
579
  res = err
517
580
  }
518
581
 
582
+ //update, 不能保證刪除多少, 一律重設快取
583
+ _cache = null
584
+
585
+ //emit, 於change可能須使用select, 故須放在重設快取之後
586
+ if (!isErr) {
587
+ try {
588
+
589
+ //emit
590
+ ee.emit('change', 'del', data, res)
591
+
592
+ }
593
+ catch (err) {
594
+ console.log(err)
595
+ }
596
+ }
597
+
519
598
  if (isErr) {
520
599
  return Promise.reject(res)
521
600
  }
@@ -632,15 +711,28 @@ function WOrmLowdb(opt = {}) {
632
711
  ok: 1,
633
712
  }
634
713
 
635
- //emit
636
- ee.emit('change', 'delAll', null, res)
637
-
638
714
  }
639
715
  catch (err) {
640
716
  isErr = true
641
717
  res = err
642
718
  }
643
719
 
720
+ //update, 不能保證刪除多少, 一律重設快取
721
+ _cache = null
722
+
723
+ //emit, 於change可能須使用select, 故須放在重設快取之後
724
+ if (!isErr) {
725
+ try {
726
+
727
+ //emit
728
+ ee.emit('change', 'delAll', null, res)
729
+
730
+ }
731
+ catch (err) {
732
+ console.log(err)
733
+ }
734
+ }
735
+
644
736
  if (isErr) {
645
737
  return Promise.reject(res)
646
738
  }
@@ -1,4 +1,5 @@
1
1
  import assert from 'assert'
2
+ import fs from 'node:fs/promises'
2
3
  import WOrm from '../src/WOrmLowdb.mjs'
3
4
  import w from 'wsemi'
4
5
 
@@ -57,6 +58,14 @@ if (isWindows()) {
57
58
  },
58
59
  ]
59
60
 
61
+ let rsa = [
62
+ {
63
+ id: 'id-rosemary',
64
+ name: 'rosemary',
65
+ value: 654.321,
66
+ },
67
+ ]
68
+
60
69
  //wo
61
70
  let wo = WOrm(opt)
62
71
 
@@ -285,9 +294,24 @@ if (isWindows()) {
285
294
  // })
286
295
  // vget[9] = rt
287
296
 
297
+ //save
298
+ rt = null
299
+ vans[10] = [{ n: 1, nModified: 1, ok: 1 }]
300
+ await wo.save(rsa, { autoInsert: true })
301
+ .then(function(msg) {
302
+ // console.log('save then', msg)
303
+ // save then [ { n: 1, nModified: 1, ok: 1 } ]
304
+ rt = msg
305
+ })
306
+ .catch(function(msg) {
307
+ // console.log('save catch', msg)
308
+ rt = msg.toString()
309
+ })
310
+ vget[10] = rt
311
+
288
312
  //del
289
313
  rt = null
290
- vans[10] = [{ n: 1, nDeleted: 1, ok: 1 }]
314
+ vans[11] = [{ n: 1, nDeleted: 1, ok: 1 }]
291
315
  let ss = await wo.select()
292
316
  let d = ss.filter(function(v) {
293
317
  return v.name === 'kettle'
@@ -302,7 +326,7 @@ if (isWindows()) {
302
326
  // console.log('del catch', msg)
303
327
  rt = msg.toString()
304
328
  })
305
- vget[10] = rt
329
+ vget[11] = rt
306
330
 
307
331
  })
308
332
 
@@ -314,7 +338,7 @@ if (isWindows()) {
314
338
  assert.strict.deepStrictEqual(vget[2], vans[2])
315
339
  })
316
340
 
317
- it(`should get ${JSON.stringify(vans[3])} for save`, async function() {
341
+ it(`should get ${JSON.stringify(vans[3])} for save(autoInsert=false)`, async function() {
318
342
  assert.strict.deepStrictEqual(vget[3], vans[3])
319
343
  })
320
344
 
@@ -342,10 +366,15 @@ if (isWindows()) {
342
366
  // assert.strict.deepStrictEqual(vget[9], vans[9])
343
367
  // })
344
368
 
345
- it(`should get ${JSON.stringify(vans[10])} for del`, async function() {
369
+ it(`should get ${JSON.stringify(vans[10])} for save(autoInsert=true)`, async function() {
346
370
  assert.strict.deepStrictEqual(vget[10], vans[10])
347
371
  })
348
372
 
373
+ it(`should get ${JSON.stringify(vans[11])} for del`, async function() {
374
+ assert.strict.deepStrictEqual(vget[11], vans[11])
375
+ })
376
+
349
377
  })
378
+
350
379
  }
351
380