w-orm-lowdb 1.0.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.
Files changed (53) hide show
  1. package/.editorconfig +9 -0
  2. package/.eslintignore +3 -0
  3. package/.eslintrc.js +55 -0
  4. package/.jsdoc +25 -0
  5. package/LICENSE +21 -0
  6. package/README.md +162 -0
  7. package/SECURITY.md +5 -0
  8. package/babel.config.js +15 -0
  9. package/db.json +14 -0
  10. package/dist/w-orm-lowdb.umd.js +7 -0
  11. package/dist/w-orm-lowdb.umd.js.map +1 -0
  12. package/docs/WOrmLowdb.html +1406 -0
  13. package/docs/WOrmLowdb.mjs.html +644 -0
  14. package/docs/fonts/Montserrat/Montserrat-Bold.eot +0 -0
  15. package/docs/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
  16. package/docs/fonts/Montserrat/Montserrat-Bold.woff +0 -0
  17. package/docs/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
  18. package/docs/fonts/Montserrat/Montserrat-Regular.eot +0 -0
  19. package/docs/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
  20. package/docs/fonts/Montserrat/Montserrat-Regular.woff +0 -0
  21. package/docs/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
  22. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
  23. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
  24. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
  25. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
  26. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
  27. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
  28. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
  29. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
  30. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
  31. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
  32. package/docs/index.html +84 -0
  33. package/docs/scripts/collapse.js +39 -0
  34. package/docs/scripts/commonNav.js +28 -0
  35. package/docs/scripts/linenumber.js +25 -0
  36. package/docs/scripts/nav.js +12 -0
  37. package/docs/scripts/polyfill.js +4 -0
  38. package/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
  39. package/docs/scripts/prettify/lang-css.js +2 -0
  40. package/docs/scripts/prettify/prettify.js +28 -0
  41. package/docs/scripts/search.js +99 -0
  42. package/docs/styles/jsdoc.css +776 -0
  43. package/docs/styles/prettify.css +80 -0
  44. package/g-basic.mjs +178 -0
  45. package/g.mjs +24 -0
  46. package/package.json +32 -0
  47. package/script.txt +18 -0
  48. package/src/WOrmLowdb.mjs +572 -0
  49. package/test/basic.test.mjs +376 -0
  50. package/toolg/addVersion.mjs +4 -0
  51. package/toolg/cleanFolder.mjs +4 -0
  52. package/toolg/gDistRollup.mjs +23 -0
  53. package/toolg/modifyReadme.mjs +4 -0
@@ -0,0 +1,644 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+
5
+ <meta charset="utf-8">
6
+ <title>WOrmLowdb.mjs - Documentation</title>
7
+
8
+
9
+ <script src="scripts/prettify/prettify.js"></script>
10
+ <script src="scripts/prettify/lang-css.js"></script>
11
+ <!--[if lt IE 9]>
12
+ <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
13
+ <![endif]-->
14
+ <link type="text/css" rel="stylesheet" href="styles/prettify.css">
15
+ <link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
16
+ <script src="scripts/nav.js" defer></script>
17
+
18
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
19
+ </head>
20
+ <body>
21
+
22
+ <input type="checkbox" id="nav-trigger" class="nav-trigger" />
23
+ <label for="nav-trigger" class="navicon-button x">
24
+ <div class="navicon"></div>
25
+ </label>
26
+
27
+ <label for="nav-trigger" class="overlay"></label>
28
+
29
+ <nav >
30
+
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>
33
+
34
+ </nav>
35
+
36
+ <div id="main">
37
+
38
+ <h1 class="page-title">WOrmLowdb.mjs</h1>
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+ <section>
47
+ <article>
48
+ <pre class="prettyprint source linenums"><code>import events from 'events'
49
+ import { Low } from 'lowdb'
50
+ import { JSONFile } from 'lowdb/node'
51
+ import { Query } from 'mingo'
52
+ import get from 'lodash-es/get.js'
53
+ import each from 'lodash-es/each.js'
54
+ import map from 'lodash-es/map.js'
55
+ import merge from 'lodash-es/merge.js'
56
+ import isEqual from 'lodash-es/isEqual.js'
57
+ import size from 'lodash-es/size.js'
58
+ import cloneDeep from 'lodash-es/cloneDeep.js'
59
+ import genID from 'wsemi/src/genID.mjs'
60
+ import pmSeries from 'wsemi/src/pmSeries.mjs'
61
+ import isarr from 'wsemi/src/isarr.mjs'
62
+ import isestr from 'wsemi/src/isestr.mjs'
63
+ import iseobj from 'wsemi/src/iseobj.mjs'
64
+ import isearr from 'wsemi/src/isearr.mjs'
65
+ import haskey from 'wsemi/src/haskey.mjs'
66
+ import arrPullAt from 'wsemi/src/arrPullAt.mjs'
67
+
68
+
69
+ /**
70
+ * 操作資料庫(lowdb)
71
+ *
72
+ * @class
73
+ * @param {Object} [opt={}] 輸入設定物件,預設{}
74
+ * @param {String} [opt.url='./db.json'] 輸入資料庫位置字串,預設'./db.json'
75
+ * @param {String} [opt.db='worm'] 輸入使用資料庫名稱字串,預設'worm'
76
+ * @param {String} [opt.cl='test'] 輸入使用資料表名稱字串,預設'test'
77
+ * @returns {Object} 回傳操作資料庫物件,各事件功能詳見說明
78
+ */
79
+ function WOrmLowdb(opt = {}) {
80
+
81
+ //url
82
+ let url = get(opt, 'url')
83
+ if (!isestr(url)) {
84
+ url = './db.json'
85
+ }
86
+
87
+ //db
88
+ let db = get(opt, 'db')
89
+ if (!isestr(db)) {
90
+ db = 'worm'
91
+ }
92
+
93
+ //cl
94
+ let cl = get(opt, 'cl')
95
+ if (!isestr(cl)) {
96
+ cl = 'test'
97
+ }
98
+
99
+ //key
100
+ let key = `${db}:${cl}`
101
+
102
+ //adapter
103
+ let adapter = new JSONFile(url)
104
+
105
+ //lowdb
106
+ let lowdb = new Low(adapter, {})
107
+
108
+ //default
109
+ if (!haskey(lowdb.data, key)) {
110
+ lowdb.data[key] = []
111
+ }
112
+
113
+ //ee
114
+ let ee = new events.EventEmitter()
115
+
116
+ /**
117
+ * 查詢數據
118
+ *
119
+ * @memberOf WOrmLowdb
120
+ * @param {Object} [find={}] 輸入查詢條件物件
121
+ * @returns {Promise} 回傳Promise,resolve回傳數據,reject回傳錯誤訊息
122
+ */
123
+ async function select(find = {}) {
124
+ let isErr = false
125
+
126
+ //res
127
+ let res = null
128
+ try {
129
+
130
+ //read
131
+ await lowdb.read()
132
+
133
+ //filter
134
+ if (iseobj(find)) {
135
+
136
+ //q
137
+ let q = new Query(find)
138
+ // console.log('q', q)
139
+
140
+ //find
141
+ res = q.find(lowdb.data[key]).all()
142
+ // console.log('res', res)
143
+
144
+ }
145
+ else {
146
+ res = lowdb.data[key]
147
+ }
148
+
149
+ }
150
+ catch (err) {
151
+ isErr = true
152
+ res = err
153
+ }
154
+
155
+ if (isErr) {
156
+ return Promise.reject(res)
157
+ }
158
+ return res
159
+ }
160
+
161
+ /**
162
+ * 插入數據,插入同樣數據會自動產生不同_id,故insert前需自行判斷有無重複
163
+ *
164
+ * @memberOf WOrmLowdb
165
+ * @param {Object|Array} data 輸入數據物件或陣列
166
+ * @returns {Promise} 回傳Promise,resolve回傳插入結果,reject回傳錯誤訊息
167
+ */
168
+ async function insert(data) {
169
+ let isErr = false
170
+
171
+ //check
172
+ if (!iseobj(data) &amp;&amp; !isearr(data)) {
173
+ return Promise.reject(`data is not an effective object or array`)
174
+ }
175
+
176
+ //cloneDeep, 與外部數據脫勾
177
+ data = cloneDeep(data)
178
+
179
+ //res
180
+ let res = null
181
+ try {
182
+
183
+ //check
184
+ if (!isarr(data)) {
185
+ data = [data]
186
+ }
187
+
188
+ //check id
189
+ data = map(data, function(v) {
190
+ if (!isestr(v.id)) {
191
+ v.id = genID()
192
+ }
193
+ return v
194
+ })
195
+
196
+ //read
197
+ await lowdb.read()
198
+
199
+ //kp
200
+ let kp = {}
201
+ each(lowdb.data[key], (v, k) => {
202
+ kp[v.id] = { k, v }
203
+ })
204
+
205
+ //each
206
+ let nAll = size(data)
207
+ let nPush = 0
208
+ let b = false
209
+ each(data, (v) => {
210
+
211
+ //check
212
+ if (!haskey(kp, v.id)) {
213
+ //未存在v.id
214
+
215
+ //push
216
+ lowdb.data[key].push(v)
217
+
218
+ nPush++
219
+ b = true
220
+ }
221
+ else {
222
+ //已存在v.id則不push
223
+ }
224
+
225
+ })
226
+
227
+ //write
228
+ if (b) {
229
+ await lowdb.write()
230
+ }
231
+
232
+ //res
233
+ res = {
234
+ n: nAll,
235
+ nInserted: nPush,
236
+ ok: 1,
237
+ }
238
+
239
+ //emit
240
+ ee.emit('change', 'insert', data, res)
241
+
242
+ }
243
+ catch (err) {
244
+ isErr = true
245
+ res = err
246
+ }
247
+
248
+ if (isErr) {
249
+ return Promise.reject(res)
250
+ }
251
+ return res
252
+ }
253
+
254
+ /**
255
+ * 儲存數據
256
+ *
257
+ * @memberOf WOrmLowdb
258
+ * @param {Object|Array} data 輸入數據物件或陣列
259
+ * @param {Object} [option={}] 輸入設定物件,預設為{}
260
+ * @param {boolean} [option.autoInsert=true] 輸入是否於儲存時發現原本無數據,則自動改以插入處理,預設為true
261
+ * @returns {Promise} 回傳Promise,resolve回傳儲存結果,reject回傳錯誤訊息
262
+ */
263
+ async function save(data, option = {}) {
264
+ let isErr = false
265
+
266
+ //check
267
+ if (!iseobj(data) &amp;&amp; !isearr(data)) {
268
+ return Promise.reject(`data is not an effective object or array`)
269
+ }
270
+
271
+ //cloneDeep, 與外部數據脫勾
272
+ data = cloneDeep(data)
273
+
274
+ //autoInsert
275
+ let autoInsert = get(option, 'autoInsert', true)
276
+
277
+ //res
278
+ let res = null
279
+ try {
280
+
281
+ //check
282
+ if (!isarr(data)) {
283
+ data = [data]
284
+ }
285
+
286
+ //check id
287
+ data = map(data, function(v) {
288
+ if (!isestr(v.id)) {
289
+ v.id = genID()
290
+ }
291
+ return v
292
+ })
293
+
294
+ //read
295
+ await lowdb.read()
296
+
297
+ //kp
298
+ let kp = {}
299
+ each(lowdb.data[key], (v, k) => {
300
+ kp[v.id] = { k, v }
301
+ })
302
+
303
+ //pmSeries
304
+ let b = false
305
+ res = await pmSeries(data, async(v) => {
306
+
307
+ //rest
308
+ let rest = null
309
+
310
+ //id
311
+ let id = get(v, 'id', '')
312
+
313
+ //查找資料表內v.id為_v
314
+ let r = get(kp, id, null)
315
+
316
+ //check
317
+ if (iseobj(r)) {
318
+ //已存在v.id
319
+ if (isEqual(v, r.v)) {
320
+ //內容相同不更新
321
+ }
322
+ else {
323
+ //內容不同須更新
324
+
325
+ //merge
326
+ lowdb.data[key][r.k] = merge(lowdb.data[key][r.k], v)
327
+
328
+ rest = { update: true }
329
+ b = true
330
+ }
331
+ }
332
+
333
+ //rest
334
+ if (iseobj(rest)) {
335
+ rest = {
336
+ n: 1,
337
+ nModified: 1,
338
+ ok: 1,
339
+ }
340
+ }
341
+ else {
342
+ rest = {
343
+ n: 0,
344
+ nModified: 0,
345
+ ok: 1,
346
+ }
347
+ }
348
+
349
+ //autoInsert
350
+ if (autoInsert &amp;&amp; rest.n === 0) {
351
+ rest = await insert(v)
352
+ }
353
+
354
+ return rest
355
+ })
356
+
357
+ //write
358
+ if (b) {
359
+ await lowdb.write()
360
+ }
361
+
362
+ //emit
363
+ ee.emit('change', 'save', data, res)
364
+
365
+ }
366
+ catch (err) {
367
+ isErr = true
368
+ res = err
369
+ }
370
+
371
+ if (isErr) {
372
+ return Promise.reject(res)
373
+ }
374
+ return res
375
+ }
376
+
377
+ /**
378
+ * 刪除數據
379
+ *
380
+ * @memberOf WOrmLowdb
381
+ * @param {Object|Array} data 輸入數據物件或陣列
382
+ * @returns {Promise} 回傳Promise,resolve回傳刪除結果,reject回傳錯誤訊息
383
+ */
384
+ async function del(data) {
385
+ let isErr = false
386
+
387
+ //check
388
+ if (!iseobj(data) &amp;&amp; !isearr(data)) {
389
+ return Promise.reject(`data is not an effective object or array`)
390
+ }
391
+
392
+ //cloneDeep, 與外部數據脫勾
393
+ data = cloneDeep(data)
394
+
395
+ //res
396
+ let res = null
397
+ try {
398
+
399
+ //check
400
+ if (!isarr(data)) {
401
+ data = [data]
402
+ }
403
+
404
+ //read
405
+ await lowdb.read()
406
+
407
+ //kp
408
+ let kp = {}
409
+ each(lowdb.data[key], (v, k) => {
410
+ kp[v.id] = { k, v }
411
+ })
412
+
413
+ //pmSeries
414
+ let ks = []
415
+ let b = false
416
+ res = await pmSeries(data, async(v) => {
417
+
418
+ //rest
419
+ let rest = null
420
+
421
+ //id
422
+ let id = get(v, 'id', '')
423
+
424
+ //check
425
+ if (isestr(id)) {
426
+
427
+ //查找資料表內v.id為_v
428
+ let r = get(kp, id, null)
429
+
430
+ //check
431
+ if (iseobj(r)) {
432
+ //已存在v.id則須刪除
433
+
434
+ //push
435
+ ks.push(r.k)
436
+
437
+ b = true
438
+
439
+ //rest
440
+ rest = {
441
+ n: 1,
442
+ nDeleted: 1,
443
+ ok: 1,
444
+ }
445
+
446
+ }
447
+ else {
448
+ //不存在v.id則不刪除
449
+
450
+ //rest
451
+ rest = {
452
+ n: 1,
453
+ nDeleted: 0,
454
+ ok: 1,
455
+ }
456
+
457
+ }
458
+
459
+ }
460
+ else {
461
+ //未給v.id則不刪除
462
+
463
+ //rest
464
+ rest = {
465
+ n: 1,
466
+ nDeleted: 0,
467
+ ok: 0, //未給v.id視為有問題數據, 故ok給0
468
+ }
469
+
470
+ }
471
+
472
+ return rest
473
+ })
474
+
475
+ //update
476
+ if (b) {
477
+ lowdb.data[key] = arrPullAt(lowdb.data[key], ks)
478
+ }
479
+
480
+ //write
481
+ if (b) {
482
+ await lowdb.write()
483
+ }
484
+
485
+ //emit
486
+ ee.emit('change', 'del', data, res)
487
+
488
+ }
489
+ catch (err) {
490
+ isErr = true
491
+ res = err
492
+ }
493
+
494
+ if (isErr) {
495
+ return Promise.reject(res)
496
+ }
497
+ return res
498
+ }
499
+
500
+ /**
501
+ * 刪除全部數據,需與del分開,避免未傳數據導致直接刪除全表
502
+ *
503
+ * @memberOf WOrmLowdb
504
+ * @param {Object} [find={}] 輸入刪除條件物件
505
+ * @returns {Promise} 回傳Promise,resolve回傳刪除結果,reject回傳錯誤訊息
506
+ */
507
+ async function delAll(find = {}) {
508
+ let isErr = false
509
+
510
+ //res
511
+ let res = null
512
+ try {
513
+
514
+ //read
515
+ await lowdb.read()
516
+
517
+ //filter
518
+ let nAll = size(lowdb.data[key])
519
+ let nDel = 0
520
+ let b = false
521
+ if (iseobj(find)) {
522
+
523
+ //q
524
+ let q = new Query(find)
525
+ // console.log('q', q)
526
+
527
+ //find
528
+ let _res = q.find(lowdb.data[key]).all()
529
+ // console.log('_res', _res)
530
+
531
+ //nDel
532
+ nDel = size(_res)
533
+ // console.log('nDel', nDel)
534
+
535
+ if (nDel === 0) {
536
+ //未有find結果等於不刪除
537
+ }
538
+ else if (nAll === nDel) {
539
+ //全在find結果內等於全部刪除
540
+
541
+ //empty
542
+ lowdb.data[key] = []
543
+
544
+ b = true
545
+ }
546
+ else {
547
+ //部份在find結果內
548
+
549
+ //_kp
550
+ let _kp = {}
551
+ each(_res, (v, k) => {
552
+ _kp[v.id] = { k, v }
553
+ })
554
+
555
+ //arr
556
+ let arr = []
557
+ each(lowdb.data[key], (v, k) => {
558
+ if (!haskey(_kp, v.id)) {
559
+ //未在find結果內代表須保留
560
+ arr.push(v)
561
+ }
562
+ })
563
+
564
+ //update
565
+ lowdb.data[key] = arr
566
+
567
+ b = true
568
+ }
569
+ }
570
+ else {
571
+
572
+ //nDel
573
+ nDel = nAll
574
+
575
+ //empty
576
+ lowdb.data[key] = []
577
+
578
+ b = true
579
+ }
580
+
581
+ //write
582
+ if (b) {
583
+ await lowdb.write()
584
+ }
585
+
586
+ //res
587
+ res = {
588
+ n: nAll,
589
+ nDeleted: nDel,
590
+ ok: 1,
591
+ }
592
+
593
+ //emit
594
+ ee.emit('change', 'delAll', null, res)
595
+
596
+ }
597
+ catch (err) {
598
+ isErr = true
599
+ res = err
600
+ }
601
+
602
+ if (isErr) {
603
+ return Promise.reject(res)
604
+ }
605
+ return res
606
+ }
607
+
608
+ //bind
609
+ ee.select = select
610
+ ee.insert = insert
611
+ ee.save = save
612
+ ee.del = del
613
+ ee.delAll = delAll
614
+
615
+ return ee
616
+ }
617
+
618
+
619
+ export default WOrmLowdb
620
+ </code></pre>
621
+ </article>
622
+ </section>
623
+
624
+
625
+
626
+
627
+
628
+
629
+ </div>
630
+
631
+ <br class="clear">
632
+
633
+ <footer>
634
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Mar 18 2025 21:23:44 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
635
+ </footer>
636
+
637
+ <script>prettyPrint();</script>
638
+ <script src="scripts/polyfill.js"></script>
639
+ <script src="scripts/linenumber.js"></script>
640
+
641
+
642
+
643
+ </body>
644
+ </html>