w-orm-lowdb 1.0.34 → 1.0.36

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.
@@ -91,6 +91,8 @@ let kpGqueue = {}
91
91
  * data為本次操作之輸入數據,無輸入數據者為null。
92
92
  * err為錯誤訊息字串,內容與正規管道所送出者一致。
93
93
  * 整批性錯誤於reject之前發出;逐筆失敗於該筆結果定案後發出,每筆一次。
94
+ * insert、insertBulk、save與del因輸入本身導致之失敗(如原型為null之Date使複製拋錯、存取器拋錯)亦屬整批性錯誤,同樣於reject之前恰發出一次、不發出change事件、資料庫不變;
95
+ * 拋錯於複製建立之前者,data為呼叫端傳入之原值,其後者為複製;err為拋出者之原訊息(呼叫端自行拋出之值或訊息原樣通過,無法轉為字串者以固定訊息unknown error取代),本套件不另行回顯數據內容。
94
96
  * 註: 逐筆失敗時整批仍resolve,故收到本事件不表示該次呼叫失敗;正常結果(如查無數據、主鍵未命中、全數已存在)不發出本事件。
95
97
  *
96
98
  * 註: 本套件之主鍵欄位固定為id,尚未支援指定其他欄位為主鍵。
@@ -357,9 +359,17 @@ function WOrmLowdb(opt = {}) {
357
359
  }
358
360
 
359
361
  //emitError, 操作發生錯誤時發出, 錯誤訊息一律轉為字串
362
+ //拋出之值本身可能無法轉為字串(如呼叫端之存取器拋出null原型物件, 或其message存取器拋錯), 此時以固定訊息取代, 令error事件仍恰發出一次(帳本R-WRITE-ERR-01), reject之值不變
360
363
  let emitError = (mode, data, err) => {
364
+ let msg = 'unknown error'
361
365
  try {
362
- ee.emit('error', mode, data, getErrMsg(err))
366
+ msg = getErrMsg(err)
367
+ }
368
+ catch (errMsg) {
369
+ //無法轉為字串者沿用固定訊息
370
+ }
371
+ try {
372
+ ee.emit('error', mode, data, msg)
363
373
  }
364
374
  catch (errEmit) {
365
375
  console.log(errEmit)
@@ -598,31 +608,31 @@ function WOrmLowdb(opt = {}) {
598
608
  async function insertCore(data, option = {}) {
599
609
  let isErr = false
600
610
 
601
- //returnList
602
- let returnList = get(option, 'returnList')
603
- if (!isbol(returnList)) {
604
- returnList = false
605
- }
611
+ //res
612
+ let res = null
613
+ try {
606
614
 
607
- //check
608
- if (!iseobj(data) && !isearr(data)) {
609
- if (returnList) {
610
- //輸入無效, 對齊save與del之空陣列規定
611
- return []
615
+ //returnList, 讀取呼叫端傳入之option、判定data與cloneDeep皆可能因輸入而拋錯, 故一律置於try內(帳本R-WRITE-ERR-01)
616
+ let returnList = get(option, 'returnList')
617
+ if (!isbol(returnList)) {
618
+ returnList = false
612
619
  }
613
- return {
614
- n: 0,
615
- nInserted: 0,
616
- ok: 1,
617
- }
618
- }
619
620
 
620
- //cloneDeep, 與外部數據脫勾
621
- data = cloneDeep(data)
621
+ //check, 輸入無效者直接回傳, 不經catch之後之收尾且不發事件
622
+ if (!iseobj(data) && !isearr(data)) {
623
+ if (returnList) {
624
+ //輸入無效, 對齊save與del之空陣列規定
625
+ return []
626
+ }
627
+ return {
628
+ n: 0,
629
+ nInserted: 0,
630
+ ok: 1,
631
+ }
632
+ }
622
633
 
623
- //res
624
- let res = null
625
- try {
634
+ //cloneDeep, 與外部數據脫勾, 其拋錯者(如原型為null之Date)亦走同一錯誤路徑(error事件恰一次後reject)
635
+ data = cloneDeep(data)
626
636
 
627
637
  //check
628
638
  if (!isarr(data)) {
@@ -736,22 +746,22 @@ function WOrmLowdb(opt = {}) {
736
746
  async function insertBulkCore(data) {
737
747
  let isErr = false
738
748
 
739
- //check
740
- if (!iseobj(data) && !isearr(data)) {
741
- return {
742
- n: 0,
743
- nInserted: 0,
744
- ok: 1,
745
- }
746
- }
747
-
748
- //cloneDeep, 與外部數據脫勾
749
- data = cloneDeep(data)
750
-
751
749
  //res
752
750
  let res = null
753
751
  try {
754
752
 
753
+ //check, 判定data與cloneDeep皆可能因輸入而拋錯, 故一律置於try內(帳本R-WRITE-ERR-01); 輸入無效者直接回傳, 不經catch之後之收尾且不發事件
754
+ if (!iseobj(data) && !isearr(data)) {
755
+ return {
756
+ n: 0,
757
+ nInserted: 0,
758
+ ok: 1,
759
+ }
760
+ }
761
+
762
+ //cloneDeep, 與外部數據脫勾, 其拋錯者(如原型為null之Date)亦走同一錯誤路徑(error事件恰一次後reject)
763
+ data = cloneDeep(data)
764
+
755
765
  //check
756
766
  if (!isarr(data)) {
757
767
  data = [data]
@@ -843,21 +853,21 @@ function WOrmLowdb(opt = {}) {
843
853
  async function saveCore(data, option = {}) {
844
854
  let isErr = false
845
855
 
846
- //check
847
- if (!iseobj(data) && !isearr(data)) {
848
- return []
849
- }
850
-
851
- //cloneDeep, 與外部數據脫勾
852
- data = cloneDeep(data)
853
-
854
- //autoInsert
855
- let autoInsert = get(option, 'autoInsert', true)
856
-
857
856
  //res
858
857
  let res = null
859
858
  try {
860
859
 
860
+ //check, 判定data、cloneDeep與讀取呼叫端傳入之option皆可能因輸入而拋錯, 故一律置於try內(帳本R-WRITE-ERR-01); 輸入無效者直接回傳, 不經catch之後之收尾且不發事件
861
+ if (!iseobj(data) && !isearr(data)) {
862
+ return []
863
+ }
864
+
865
+ //cloneDeep, 與外部數據脫勾, 其拋錯者(如原型為null之Date)亦走同一錯誤路徑(error事件恰一次後reject)
866
+ data = cloneDeep(data)
867
+
868
+ //autoInsert
869
+ let autoInsert = get(option, 'autoInsert', true)
870
+
861
871
  //check
862
872
  if (!isarr(data)) {
863
873
  data = [data]
@@ -1042,18 +1052,18 @@ function WOrmLowdb(opt = {}) {
1042
1052
  async function delCore(data) {
1043
1053
  let isErr = false
1044
1054
 
1045
- //check
1046
- if (!iseobj(data) && !isearr(data)) {
1047
- return []
1048
- }
1049
-
1050
- //cloneDeep, 與外部數據脫勾
1051
- data = cloneDeep(data)
1052
-
1053
1055
  //res
1054
1056
  let res = null
1055
1057
  try {
1056
1058
 
1059
+ //check, 判定data與cloneDeep皆可能因輸入而拋錯, 故一律置於try內(帳本R-WRITE-ERR-01); 輸入無效者直接回傳, 不經catch之後之收尾且不發事件
1060
+ if (!iseobj(data) && !isearr(data)) {
1061
+ return []
1062
+ }
1063
+
1064
+ //cloneDeep, 與外部數據脫勾, 其拋錯者(如原型為null之Date)亦走同一錯誤路徑(error事件恰一次後reject)
1065
+ data = cloneDeep(data)
1066
+
1057
1067
  //check
1058
1068
  if (!isarr(data)) {
1059
1069
  data = [data]
@@ -1340,7 +1350,7 @@ export default WOrmLowdb
1340
1350
  <br class="clear">
1341
1351
 
1342
1352
  <footer>
1343
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Oct 19 2026 21:48:29 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
1353
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Oct 20 2026 12:54:27 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
1344
1354
  </footer>
1345
1355
 
1346
1356
  <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.5</a> on Mon Oct 19 2026 21:48:29 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 Tue Oct 20 2026 12:54:27 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/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "w-orm-lowdb",
3
- "version": "1.0.34",
3
+ "version": "1.0.36",
4
4
  "main": "dist/w-orm-lowdb.umd.js",
5
5
  "dependencies": {
6
6
  "lowdb": "^7.0.1",
7
7
  "mingo": "^7.2.4",
8
- "wsemi": "^1.9.20"
8
+ "wsemi": "^1.9.21"
9
9
  },
10
10
  "devDependencies": {
11
11
  "w-package-tools": "^1.1.21"
package/src/WOrmLowdb.mjs CHANGED
@@ -44,6 +44,8 @@ let kpGqueue = {}
44
44
  * data為本次操作之輸入數據,無輸入數據者為null。
45
45
  * err為錯誤訊息字串,內容與正規管道所送出者一致。
46
46
  * 整批性錯誤於reject之前發出;逐筆失敗於該筆結果定案後發出,每筆一次。
47
+ * insert、insertBulk、save與del因輸入本身導致之失敗(如原型為null之Date使複製拋錯、存取器拋錯)亦屬整批性錯誤,同樣於reject之前恰發出一次、不發出change事件、資料庫不變;
48
+ * 拋錯於複製建立之前者,data為呼叫端傳入之原值,其後者為複製;err為拋出者之原訊息(呼叫端自行拋出之值或訊息原樣通過,無法轉為字串者以固定訊息unknown error取代),本套件不另行回顯數據內容。
47
49
  * 註: 逐筆失敗時整批仍resolve,故收到本事件不表示該次呼叫失敗;正常結果(如查無數據、主鍵未命中、全數已存在)不發出本事件。
48
50
  *
49
51
  * 註: 本套件之主鍵欄位固定為id,尚未支援指定其他欄位為主鍵。
@@ -310,9 +312,17 @@ function WOrmLowdb(opt = {}) {
310
312
  }
311
313
 
312
314
  //emitError, 操作發生錯誤時發出, 錯誤訊息一律轉為字串
315
+ //拋出之值本身可能無法轉為字串(如呼叫端之存取器拋出null原型物件, 或其message存取器拋錯), 此時以固定訊息取代, 令error事件仍恰發出一次(帳本R-WRITE-ERR-01), reject之值不變
313
316
  let emitError = (mode, data, err) => {
317
+ let msg = 'unknown error'
314
318
  try {
315
- ee.emit('error', mode, data, getErrMsg(err))
319
+ msg = getErrMsg(err)
320
+ }
321
+ catch (errMsg) {
322
+ //無法轉為字串者沿用固定訊息
323
+ }
324
+ try {
325
+ ee.emit('error', mode, data, msg)
316
326
  }
317
327
  catch (errEmit) {
318
328
  console.log(errEmit)
@@ -551,31 +561,31 @@ function WOrmLowdb(opt = {}) {
551
561
  async function insertCore(data, option = {}) {
552
562
  let isErr = false
553
563
 
554
- //returnList
555
- let returnList = get(option, 'returnList')
556
- if (!isbol(returnList)) {
557
- returnList = false
558
- }
564
+ //res
565
+ let res = null
566
+ try {
559
567
 
560
- //check
561
- if (!iseobj(data) && !isearr(data)) {
562
- if (returnList) {
563
- //輸入無效, 對齊save與del之空陣列規定
564
- return []
568
+ //returnList, 讀取呼叫端傳入之option、判定data與cloneDeep皆可能因輸入而拋錯, 故一律置於try內(帳本R-WRITE-ERR-01)
569
+ let returnList = get(option, 'returnList')
570
+ if (!isbol(returnList)) {
571
+ returnList = false
565
572
  }
566
- return {
567
- n: 0,
568
- nInserted: 0,
569
- ok: 1,
570
- }
571
- }
572
573
 
573
- //cloneDeep, 與外部數據脫勾
574
- data = cloneDeep(data)
574
+ //check, 輸入無效者直接回傳, 不經catch之後之收尾且不發事件
575
+ if (!iseobj(data) && !isearr(data)) {
576
+ if (returnList) {
577
+ //輸入無效, 對齊save與del之空陣列規定
578
+ return []
579
+ }
580
+ return {
581
+ n: 0,
582
+ nInserted: 0,
583
+ ok: 1,
584
+ }
585
+ }
575
586
 
576
- //res
577
- let res = null
578
- try {
587
+ //cloneDeep, 與外部數據脫勾, 其拋錯者(如原型為null之Date)亦走同一錯誤路徑(error事件恰一次後reject)
588
+ data = cloneDeep(data)
579
589
 
580
590
  //check
581
591
  if (!isarr(data)) {
@@ -689,22 +699,22 @@ function WOrmLowdb(opt = {}) {
689
699
  async function insertBulkCore(data) {
690
700
  let isErr = false
691
701
 
692
- //check
693
- if (!iseobj(data) && !isearr(data)) {
694
- return {
695
- n: 0,
696
- nInserted: 0,
697
- ok: 1,
698
- }
699
- }
700
-
701
- //cloneDeep, 與外部數據脫勾
702
- data = cloneDeep(data)
703
-
704
702
  //res
705
703
  let res = null
706
704
  try {
707
705
 
706
+ //check, 判定data與cloneDeep皆可能因輸入而拋錯, 故一律置於try內(帳本R-WRITE-ERR-01); 輸入無效者直接回傳, 不經catch之後之收尾且不發事件
707
+ if (!iseobj(data) && !isearr(data)) {
708
+ return {
709
+ n: 0,
710
+ nInserted: 0,
711
+ ok: 1,
712
+ }
713
+ }
714
+
715
+ //cloneDeep, 與外部數據脫勾, 其拋錯者(如原型為null之Date)亦走同一錯誤路徑(error事件恰一次後reject)
716
+ data = cloneDeep(data)
717
+
708
718
  //check
709
719
  if (!isarr(data)) {
710
720
  data = [data]
@@ -796,21 +806,21 @@ function WOrmLowdb(opt = {}) {
796
806
  async function saveCore(data, option = {}) {
797
807
  let isErr = false
798
808
 
799
- //check
800
- if (!iseobj(data) && !isearr(data)) {
801
- return []
802
- }
803
-
804
- //cloneDeep, 與外部數據脫勾
805
- data = cloneDeep(data)
806
-
807
- //autoInsert
808
- let autoInsert = get(option, 'autoInsert', true)
809
-
810
809
  //res
811
810
  let res = null
812
811
  try {
813
812
 
813
+ //check, 判定data、cloneDeep與讀取呼叫端傳入之option皆可能因輸入而拋錯, 故一律置於try內(帳本R-WRITE-ERR-01); 輸入無效者直接回傳, 不經catch之後之收尾且不發事件
814
+ if (!iseobj(data) && !isearr(data)) {
815
+ return []
816
+ }
817
+
818
+ //cloneDeep, 與外部數據脫勾, 其拋錯者(如原型為null之Date)亦走同一錯誤路徑(error事件恰一次後reject)
819
+ data = cloneDeep(data)
820
+
821
+ //autoInsert
822
+ let autoInsert = get(option, 'autoInsert', true)
823
+
814
824
  //check
815
825
  if (!isarr(data)) {
816
826
  data = [data]
@@ -995,18 +1005,18 @@ function WOrmLowdb(opt = {}) {
995
1005
  async function delCore(data) {
996
1006
  let isErr = false
997
1007
 
998
- //check
999
- if (!iseobj(data) && !isearr(data)) {
1000
- return []
1001
- }
1002
-
1003
- //cloneDeep, 與外部數據脫勾
1004
- data = cloneDeep(data)
1005
-
1006
1008
  //res
1007
1009
  let res = null
1008
1010
  try {
1009
1011
 
1012
+ //check, 判定data與cloneDeep皆可能因輸入而拋錯, 故一律置於try內(帳本R-WRITE-ERR-01); 輸入無效者直接回傳, 不經catch之後之收尾且不發事件
1013
+ if (!iseobj(data) && !isearr(data)) {
1014
+ return []
1015
+ }
1016
+
1017
+ //cloneDeep, 與外部數據脫勾, 其拋錯者(如原型為null之Date)亦走同一錯誤路徑(error事件恰一次後reject)
1018
+ data = cloneDeep(data)
1019
+
1010
1020
  //check
1011
1021
  if (!isarr(data)) {
1012
1022
  data = [data]