w-orm-lowdb 1.0.32 → 1.0.33
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.
- package/README.md +7 -3
- package/dist/w-orm-lowdb.umd.js +2 -2
- package/dist/w-orm-lowdb.umd.js.map +1 -1
- package/docs/WOrmLowdb.html +15 -11
- package/docs/WOrmLowdb.mjs.html +39 -6
- package/docs/index.html +1 -1
- package/package.json +3 -3
- package/src/WOrmLowdb.mjs +38 -5
- package/test/unit-find-whitelist.test.mjs +466 -0
package/docs/WOrmLowdb.mjs.html
CHANGED
|
@@ -190,17 +190,46 @@ function WOrmLowdb(opt = {}) {
|
|
|
190
190
|
return pm
|
|
191
191
|
}
|
|
192
192
|
|
|
193
|
+
//reIsoDate, 西元0000-9999年之toISOString()恆為24字元YYYY-MM-DDTHH:mm:ss.sssZ, 字典序即時間序;
|
|
194
|
+
//年份<0或>9999者帶-yyyyyy-/+yyyyyy-前綴(27字元), 且'+'<'-'<數字, 字典序與時間序顛倒, 故不符此形者視為範圍外
|
|
195
|
+
let reIsoDate = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/
|
|
196
|
+
|
|
197
|
+
//pathKey, 路徑段(欄名或運算子名,皆已通過cvOrmFind之文法): 過長者截短, 規則同cvOrmFind之訊息(單鍵>30字元取前30加...,
|
|
198
|
+
//截斷處切開代理對而成孤立之高代理碼元者, cvOrmFind以?取代)
|
|
199
|
+
let pathKey = (k) => {
|
|
200
|
+
if (k.length <= 30) {
|
|
201
|
+
return k
|
|
202
|
+
}
|
|
203
|
+
let t = k.slice(0, 30)
|
|
204
|
+
let c = t.charCodeAt(29)
|
|
205
|
+
if (c >= 0xD800 && c <= 0xDBFF) {
|
|
206
|
+
t = `${t.slice(0, 29)}?`
|
|
207
|
+
}
|
|
208
|
+
return `${t}...`
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
//pathStr, 路徑字串化: 全路徑>120字元取...加末100字元, 規則同cvOrmFind之訊息
|
|
212
|
+
let pathStr = (s) => {
|
|
213
|
+
return s.length > 120 ? `...${s.slice(-100)}` : s
|
|
214
|
+
}
|
|
215
|
+
|
|
193
216
|
//isoFind, 把cvOrmFind所回傳複本內之Date就地轉為ISO字串(轉譯層): 數據以JSON存檔, Date於寫入時已成toISOString()之字串,
|
|
194
217
|
//條件內之Date不轉則恆不命中; 複本僅含null原型物件、密集陣列、純量與有效Date(無共享參照、無環), 就地轉換不影響呼叫端之find
|
|
195
|
-
|
|
218
|
+
//轉換所得之字串須為reIsoDate之形(檢查之值即使用之值), 範圍外(年份<0或>9999)者fail-closed: 拋出invalid find(帳本R-FIND-02), 不回顯值, p為路徑
|
|
219
|
+
let isoFind = (v, p = 'find') => {
|
|
196
220
|
if (v instanceof Date) {
|
|
197
|
-
|
|
221
|
+
let s = v.toISOString()
|
|
222
|
+
if (!reIsoDate.test(s)) {
|
|
223
|
+
throw new Error(`invalid find: Date year is out of range 0000-9999 at [${pathStr(p)}]`)
|
|
224
|
+
}
|
|
225
|
+
return s
|
|
198
226
|
}
|
|
199
227
|
if (v !== null && typeof v === 'object') {
|
|
200
228
|
|
|
201
229
|
//物件與陣列皆以Object.keys走訪(陣列為密集, 鍵即索引)
|
|
230
|
+
let isArr = Array.isArray(v)
|
|
202
231
|
for (let k of Object.keys(v)) {
|
|
203
|
-
v[k] = isoFind(v[k])
|
|
232
|
+
v[k] = isoFind(v[k], isArr ? `${p}[${k}]` : `${p}.${pathKey(k)}`)
|
|
204
233
|
}
|
|
205
234
|
}
|
|
206
235
|
return v
|
|
@@ -360,6 +389,7 @@ function WOrmLowdb(opt = {}) {
|
|
|
360
389
|
* 查詢數據
|
|
361
390
|
*
|
|
362
391
|
* 條件find僅支援系列白名單(規則同delAll之第1-3點,見delAll),與delAll共用同一檢核,select(find)命中之數據即delAll(find)刪除之數據
|
|
392
|
+
* 條件內之Date年份須介於0000-9999,範圍外整批reject;數據側已存入之範圍外Date無法以Date條件正確比較(規則同delAll之第6點,見README)
|
|
363
393
|
*
|
|
364
394
|
* @memberOf WOrmLowdb
|
|
365
395
|
* @param {Object} [find={}] 輸入查詢條件物件(系列白名單,規則同delAll之第1-3點); 未給、undefined或{}回傳全部數據; 非條件物件或白名單外運算子整批reject
|
|
@@ -1083,7 +1113,7 @@ function WOrmLowdb(opt = {}) {
|
|
|
1083
1113
|
* 2. 傳了值卻不是條件物件(null、陣列含[]與[{...}]、字串、數值、布林、函數、Date、RegExp、Map、Set、類別實例等)
|
|
1084
1114
|
* 一律整批reject,不視為{},不刪除任何數據。
|
|
1085
1115
|
* 3. 條件僅支援系列白名單: 欄位等值{欄:純量}(多欄為AND)、欄位運算子$eq $ne $gt $gte $lt $lte(值為純量)與
|
|
1086
|
-
* $in $nin(值為純量陣列)、文件層$and $or(值為條件物件之非空陣列)。純量為字串(不含NUL字元與孤立代理字元)、有限數字、布林、有效Date;
|
|
1116
|
+
* $in $nin(值為純量陣列)、文件層$and $or(值為條件物件之非空陣列)。純量為字串(不含NUL字元與孤立代理字元)、有限數字、布林、有效Date(年份須介於0000-9999,範圍外整批reject,見第6點);
|
|
1087
1117
|
* null僅可用於欄位等值、$eq、$ne。白名單外之運算子($not $nor $regex $options $exists $where $expr $like $ilike等)、
|
|
1088
1118
|
* 欄位層$and/$or、子查詢、函數值、Symbol鍵、undefined值、空的$nin/$and/$or等一律整批reject,
|
|
1089
1119
|
* 訊息為invalid find: 原因 at [路徑],且不刪除任何數據。
|
|
@@ -1093,7 +1123,10 @@ function WOrmLowdb(opt = {}) {
|
|
|
1093
1123
|
* 空的$nin會reject,$in:[]則為恆假(刪除0筆)。
|
|
1094
1124
|
* 6. 語意差異(依後端,見README): MongoDB式: $ne(比較值非null時)與$nin會命中欄位為null或缺欄之數據,$ne:null則排除之;
|
|
1095
1125
|
* 欄名同於Object.prototype成員(constructor、toString等)者,數據無此自有欄位時視為缺欄;
|
|
1096
|
-
* Date條件於本後端轉為ISO
|
|
1126
|
+
* Date條件於本後端轉為ISO字串後以字典序比較(與字串型欄位亦會比較):條件內任何位置之Date其年份須介於0000-9999,
|
|
1127
|
+
* 範圍外(年份小於0或大於9999,如new Date(8.64e15)、new Date(-8.64e15))整批reject,訊息為invalid find: Date year is out of range 0000-9999 at [路徑],
|
|
1128
|
+
* 不回顯值,不讀檔、不刪除任何數據;數據側已存入之範圍外Date(如以new Date(8.64e15)作永不過期哨兵)寫入行為不變,
|
|
1129
|
+
* 但此類資料無法以Date條件正確比較(例如{t:{$lt:現在}}會命中哨兵並將其刪除),見README。
|
|
1097
1130
|
* 需明確表達時可用可攜寫法: 排除NULL為{$and:[{f:{$ne:null}},{f:{$ne:x}}]},含NULL為{$or:[{f:null},{f:{$ne:x}}]}。
|
|
1098
1131
|
*
|
|
1099
1132
|
* n與nDeleted皆為實際刪除筆數,不取全表筆數。條件無命中時回{n:0,nDeleted:0,ok:1},不視為錯誤。
|
|
@@ -1220,7 +1253,7 @@ export default WOrmLowdb
|
|
|
1220
1253
|
<br class="clear">
|
|
1221
1254
|
|
|
1222
1255
|
<footer>
|
|
1223
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on
|
|
1256
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Oct 19 2026 20:07:22 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
1224
1257
|
</footer>
|
|
1225
1258
|
|
|
1226
1259
|
<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
|
|
74
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Oct 19 2026 20:07:22 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,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "w-orm-lowdb",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.33",
|
|
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.
|
|
8
|
+
"wsemi": "^1.9.20"
|
|
9
9
|
},
|
|
10
10
|
"devDependencies": {
|
|
11
|
-
"w-package-tools": "^1.1.
|
|
11
|
+
"w-package-tools": "^1.1.21"
|
|
12
12
|
},
|
|
13
13
|
"scripts": {
|
|
14
14
|
"test": "mocha --parallel \"test/*.test.mjs\" --timeout 180000",
|
package/src/WOrmLowdb.mjs
CHANGED
|
@@ -143,17 +143,46 @@ function WOrmLowdb(opt = {}) {
|
|
|
143
143
|
return pm
|
|
144
144
|
}
|
|
145
145
|
|
|
146
|
+
//reIsoDate, 西元0000-9999年之toISOString()恆為24字元YYYY-MM-DDTHH:mm:ss.sssZ, 字典序即時間序;
|
|
147
|
+
//年份<0或>9999者帶-yyyyyy-/+yyyyyy-前綴(27字元), 且'+'<'-'<數字, 字典序與時間序顛倒, 故不符此形者視為範圍外
|
|
148
|
+
let reIsoDate = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/
|
|
149
|
+
|
|
150
|
+
//pathKey, 路徑段(欄名或運算子名,皆已通過cvOrmFind之文法): 過長者截短, 規則同cvOrmFind之訊息(單鍵>30字元取前30加...,
|
|
151
|
+
//截斷處切開代理對而成孤立之高代理碼元者, cvOrmFind以?取代)
|
|
152
|
+
let pathKey = (k) => {
|
|
153
|
+
if (k.length <= 30) {
|
|
154
|
+
return k
|
|
155
|
+
}
|
|
156
|
+
let t = k.slice(0, 30)
|
|
157
|
+
let c = t.charCodeAt(29)
|
|
158
|
+
if (c >= 0xD800 && c <= 0xDBFF) {
|
|
159
|
+
t = `${t.slice(0, 29)}?`
|
|
160
|
+
}
|
|
161
|
+
return `${t}...`
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
//pathStr, 路徑字串化: 全路徑>120字元取...加末100字元, 規則同cvOrmFind之訊息
|
|
165
|
+
let pathStr = (s) => {
|
|
166
|
+
return s.length > 120 ? `...${s.slice(-100)}` : s
|
|
167
|
+
}
|
|
168
|
+
|
|
146
169
|
//isoFind, 把cvOrmFind所回傳複本內之Date就地轉為ISO字串(轉譯層): 數據以JSON存檔, Date於寫入時已成toISOString()之字串,
|
|
147
170
|
//條件內之Date不轉則恆不命中; 複本僅含null原型物件、密集陣列、純量與有效Date(無共享參照、無環), 就地轉換不影響呼叫端之find
|
|
148
|
-
|
|
171
|
+
//轉換所得之字串須為reIsoDate之形(檢查之值即使用之值), 範圍外(年份<0或>9999)者fail-closed: 拋出invalid find(帳本R-FIND-02), 不回顯值, p為路徑
|
|
172
|
+
let isoFind = (v, p = 'find') => {
|
|
149
173
|
if (v instanceof Date) {
|
|
150
|
-
|
|
174
|
+
let s = v.toISOString()
|
|
175
|
+
if (!reIsoDate.test(s)) {
|
|
176
|
+
throw new Error(`invalid find: Date year is out of range 0000-9999 at [${pathStr(p)}]`)
|
|
177
|
+
}
|
|
178
|
+
return s
|
|
151
179
|
}
|
|
152
180
|
if (v !== null && typeof v === 'object') {
|
|
153
181
|
|
|
154
182
|
//物件與陣列皆以Object.keys走訪(陣列為密集, 鍵即索引)
|
|
183
|
+
let isArr = Array.isArray(v)
|
|
155
184
|
for (let k of Object.keys(v)) {
|
|
156
|
-
v[k] = isoFind(v[k])
|
|
185
|
+
v[k] = isoFind(v[k], isArr ? `${p}[${k}]` : `${p}.${pathKey(k)}`)
|
|
157
186
|
}
|
|
158
187
|
}
|
|
159
188
|
return v
|
|
@@ -313,6 +342,7 @@ function WOrmLowdb(opt = {}) {
|
|
|
313
342
|
* 查詢數據
|
|
314
343
|
*
|
|
315
344
|
* 條件find僅支援系列白名單(規則同delAll之第1-3點,見delAll),與delAll共用同一檢核,select(find)命中之數據即delAll(find)刪除之數據
|
|
345
|
+
* 條件內之Date年份須介於0000-9999,範圍外整批reject;數據側已存入之範圍外Date無法以Date條件正確比較(規則同delAll之第6點,見README)
|
|
316
346
|
*
|
|
317
347
|
* @memberOf WOrmLowdb
|
|
318
348
|
* @param {Object} [find={}] 輸入查詢條件物件(系列白名單,規則同delAll之第1-3點); 未給、undefined或{}回傳全部數據; 非條件物件或白名單外運算子整批reject
|
|
@@ -1036,7 +1066,7 @@ function WOrmLowdb(opt = {}) {
|
|
|
1036
1066
|
* 2. 傳了值卻不是條件物件(null、陣列含[]與[{...}]、字串、數值、布林、函數、Date、RegExp、Map、Set、類別實例等)
|
|
1037
1067
|
* 一律整批reject,不視為{},不刪除任何數據。
|
|
1038
1068
|
* 3. 條件僅支援系列白名單: 欄位等值{欄:純量}(多欄為AND)、欄位運算子$eq $ne $gt $gte $lt $lte(值為純量)與
|
|
1039
|
-
* $in $nin(值為純量陣列)、文件層$and $or(值為條件物件之非空陣列)。純量為字串(不含NUL字元與孤立代理字元)、有限數字、布林、有效Date;
|
|
1069
|
+
* $in $nin(值為純量陣列)、文件層$and $or(值為條件物件之非空陣列)。純量為字串(不含NUL字元與孤立代理字元)、有限數字、布林、有效Date(年份須介於0000-9999,範圍外整批reject,見第6點);
|
|
1040
1070
|
* null僅可用於欄位等值、$eq、$ne。白名單外之運算子($not $nor $regex $options $exists $where $expr $like $ilike等)、
|
|
1041
1071
|
* 欄位層$and/$or、子查詢、函數值、Symbol鍵、undefined值、空的$nin/$and/$or等一律整批reject,
|
|
1042
1072
|
* 訊息為invalid find: 原因 at [路徑],且不刪除任何數據。
|
|
@@ -1046,7 +1076,10 @@ function WOrmLowdb(opt = {}) {
|
|
|
1046
1076
|
* 空的$nin會reject,$in:[]則為恆假(刪除0筆)。
|
|
1047
1077
|
* 6. 語意差異(依後端,見README): MongoDB式: $ne(比較值非null時)與$nin會命中欄位為null或缺欄之數據,$ne:null則排除之;
|
|
1048
1078
|
* 欄名同於Object.prototype成員(constructor、toString等)者,數據無此自有欄位時視為缺欄;
|
|
1049
|
-
* Date條件於本後端轉為ISO
|
|
1079
|
+
* Date條件於本後端轉為ISO字串後以字典序比較(與字串型欄位亦會比較):條件內任何位置之Date其年份須介於0000-9999,
|
|
1080
|
+
* 範圍外(年份小於0或大於9999,如new Date(8.64e15)、new Date(-8.64e15))整批reject,訊息為invalid find: Date year is out of range 0000-9999 at [路徑],
|
|
1081
|
+
* 不回顯值,不讀檔、不刪除任何數據;數據側已存入之範圍外Date(如以new Date(8.64e15)作永不過期哨兵)寫入行為不變,
|
|
1082
|
+
* 但此類資料無法以Date條件正確比較(例如{t:{$lt:現在}}會命中哨兵並將其刪除),見README。
|
|
1050
1083
|
* 需明確表達時可用可攜寫法: 排除NULL為{$and:[{f:{$ne:null}},{f:{$ne:x}}]},含NULL為{$or:[{f:null},{f:{$ne:x}}]}。
|
|
1051
1084
|
*
|
|
1052
1085
|
* n與nDeleted皆為實際刪除筆數,不取全表筆數。條件無命中時回{n:0,nDeleted:0,ok:1},不視為錯誤。
|