w-serv-orm 1.1.13 → 1.1.14

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.
@@ -80,11 +80,13 @@
80
80
  單筆失敗不中斷整批,故reject時其餘筆數已寫入。
81
81
  mix之各步驟遇單筆失敗不中斷後續步驟,待全部步驟完成後一併reject;遇整批性錯誤則立即reject,後續步驟不執行。mix於resolve時回傳各步驟所處理之列之id(依add、del、diff之序串接,del之列不分是否命中)。</p>
82
82
  <p>insert、save與mix之新增、修改,數據未帶有效主鍵(未給、null、空字串,或非字串非數字之值,含NaN與±Infinity)者,若資料表之主鍵欄為id且為字串型(或型別未知;型別如STRING(36)者以括號前之字判定),由本套件產生主鍵(同各ORM之genIDSeq)並於resolve時回傳;單一空物件與只含一個空物件之陣列不補(ORM視為無效輸入而不寫入),多筆批次中之空物件列則補。
83
- 主鍵欄為字串型(或型別未知)之資料表,主鍵為有限數字者一律以其字串形式處置(如123視為'123'):寫入、resolve回傳、del與mix之刪除,以及select、delAll條件中主鍵之比較($eq、$ne、$gt、$gte、$lt、$lte、$in、$nin、$all,含$not、$and、$or、$nor之內)皆同,故以數字或其字串形式寫入、查詢與刪除者為同一筆,範圍比較依字串之字典序;主鍵欄為整數型者不轉型。轉型只作用於procOrm,經woItems直接操作者不轉型。舊版w-orm-mongodb(2025-04-29以前)保留之數字主鍵資料,以數字查詢將查不到。
83
+ 主鍵欄為字串型(或型別未知)之資料表,主鍵為有限數字者一律以其字串形式處置(如123視為'123'):寫入、resolve回傳、del與mix之刪除,以及select、delAll條件中主鍵之比較($eq、$ne、$gt、$gte、$lt、$lte、$in、$nin,含$and、$or之內)皆同,故以數字或其字串形式寫入、查詢與刪除者為同一筆,範圍比較依字串之字典序;主鍵欄為整數型者不轉型。轉型只作用於procOrm,經woItems直接操作者不轉型。舊版w-orm-mongodb(2025-04-29以前)保留之數字主鍵資料,以數字查詢將查不到。
84
84
  reject時不回傳補出之主鍵,故重送未帶主鍵之數據會再產生新主鍵而重複寫入,需冪等重送者請自帶主鍵(非空字串或有限數字);save帶主鍵者重送以主鍵覆寫,del重送時已刪除者為主鍵未命中。
85
85
  回傳之id為本套件依輸入(含補值與轉型)所得之主鍵,非ORM之寫入結果;ORM之比對規則較寬者(如w-orm-mdb之Jet不分大小寫、忽略尾端空白),insert略過或save命中之對象可能與回傳之id不同。lmdb、lowdb、level、mongodb等主鍵固定為字串id之ORM,其資料表之id須為字串型pk或不標型別;本套件以id為主鍵,主鍵欄非id之ORM(如w-orm-postgresql預設為time)之回傳id不具主鍵意義。
86
86
  輸入之形狀:insert與save之各筆、mix之新增與修改之各筆須為物件,mix之add、del、diff若給予須為陣列,select與delAll之條件若給予須為純物件(原型為null或Object.prototype;未給、undefined與空物件{}為無條件:select回全部、delAll刪除全部;null、陣列、字串、數字、布林、函數、Date、RegExp、Map、Set與類別實例皆reject),否則於任何寫入或查詢之前reject,如'failed to insert data, not an object: data[0]'、'invalid find of select, need an object'、'invalid find of delAll, need an object'。
87
- 資料表名(procOrm之woName)須為本實例資料表之自有名稱,否則reject 'can not find table[x] in ORM'(原型鏈上之名稱如constructor、toString與路徑字串如tests.select亦然);select與delAll之條件之巢狀深度(物件與陣列各算一層)超過64層者reject 'invalid find of select, too deep'。條件與寫入列(insert、save、mix之新增與修改)之任何深度(一般物件之值、陣列之元素)含自有__proto__鍵(JSON.parse、Object.fromEntries、structuredClone等可產生;物件字面量之__proto__為設原型而不算)或存取器屬性(getter、setter)者整批reject,如'invalid find of select, unsupported key[<strong>proto</strong>]'、'failed to insert data, unsupported accessor property: data[0]',訊息不回顯客戶端之值。含整數length鍵之條件與寫入列本身依其自有鍵處置,不被當成陣列樣物件;欄位值內之巢狀物件之XSS清除由wsemi之clearXSS進行,不在此限(見規則帳本R-OBJ-01之已知限制)。mix之del各筆與單獨del之各筆不做上述檢查。
87
+ 條件(find):select與delAll之條件僅支援系列白名單,由各w-orm-*依相同規則檢核(須為已實作該白名單之w-orm-*版本;舊版或尚未更新者仍可能接受白名單外之運算子,不在下述保證內),本套件不依運算子放行或攔截(僅轉型主鍵條件,見上):欄位等值{欄:純量}(多欄為AND)、欄位運算子$eq $ne $gt $gte $lt $lte(值為純量)與$in $nin(值為純量陣列)、文件層$and $or(值為條件物件之非空陣列);純量為字串(不含NUL字元與孤立代理字元)、有限數字、布林、有效Date,null僅可用於欄位等值、$eq、$ne。白名單外之運算子($not $nor $regex $options $exists $all $where $expr $like $ilike等)、欄位層$and/$or、函數值、undefined值、空的$nin/$and/$or等,由ORM整批reject,procOrm以固定字串回傳(select為'failed to select data',delAll為'failed to delete data'),ORM之錯誤原文只由console.log輸出,delAll不刪除任何數據。select未給、為undefined或{}時回傳全部數據;select(find)命中之數據即delAll(find)刪除之數據。
88
+ delAll(破壞性操作,須審慎使用,非必要不用;刪除單筆請用del):不給條件(未給、undefined或{})即刪除全部數據,不另行確認,給了條件才是部分刪除;傳了值卻不是條件物件(null、陣列含[]與[{...}]、字串、數值、布林、函數、Date、RegExp、Map、Set、類別實例等)一律整批reject,不視為{},不刪除任何數據。經資料通道(前端直接操作資料表,如w-serv-webdata)呼叫之delAll與此語意一致,不另加通道專屬限制,以免用法歧異造成誤解;通道端若另有更窄之條件限縮,未通過者由通道端拒絕,授權仍由開放處負責;通訊內容經JSON序列化時,顯式傳入之undefined會成為null而被reject,前端須省略參數或傳{}。條件值若來自可能為undefined、null或空陣列之變數,呼叫端須先自行判斷(undefined值會reject而非被忽略,空的$nin會reject,$in:[]則為恆假而刪除0筆);建議先以select(find)確認命中範圍再刪除(ORM啟用快取而他方已寫入時,select可能回傳快取,而delAll一律直讀資料庫,預覽不保證即實際刪除之集合)。n與nDeleted皆為實際刪除筆數,條件無命中時回{n:0,nDeleted:0,ok:1},不視為錯誤。
89
+ 資料表名(procOrm之woName)須為本實例資料表之自有名稱,否則reject 'can not find table[x] in ORM'(原型鏈上之名稱如constructor、toString與路徑字串如tests.select亦然);select與delAll之條件之巢狀深度(物件與陣列各算一層)超過64層者reject 'invalid find of select, too deep'。條件與寫入列(insert、save、mix之新增與修改)之任何深度(一般物件之值、陣列之元素)含自有__proto__鍵(JSON.parse、Object.fromEntries、structuredClone等可產生;物件字面量之__proto__為設原型而不算)或存取器屬性(getter、setter)者整批reject,如'invalid find of select, unsupported key[<strong>proto</strong>]'、'failed to insert data, unsupported accessor property: data[0]',訊息不回顯客戶端之值。select與delAll之條件另拒絕複製時會被洗掉之結構,整批reject:Symbol鍵或不可列舉鍵('invalid find of select, unsupported symbol key or non-enumerable property');Proxy(含已撤銷者、原型為Proxy者)、帶Symbol.toStringTag者(自有或繼承,含Map、Set等內建品牌物件)、內建品牌物件(含原型被改為null者)、非純物件(類別實例、偽原型等)、有空洞或額外屬性或不可列舉元素之陣列、帶自有屬性之Date、函數值與Symbol值('invalid find of select, unsupported irregular object or array'),使後端所見之條件同呼叫端所給者,且檢查期間與拒收後之診斷輸出皆不執行使用端程式(陷阱、getter、Symbol.toStringTag與util.inspect.custom;被拒條件以本層建立之純資料快照輸出至console.log,字串長度、層數與項數有上限);以Proxy包裝之條件(如Vue響應式物件)與Mongoose等文件須先轉為純物件(寫入列不在此限)。跨realm之純物件照常:於字串型主鍵表之複製位置(頂層、$and/$or元素、id之運算子物件)被複製為本realm物件,其餘位置原樣交後端,現行後端白名單要求本realm物件而reject。含整數length鍵之條件與寫入列本身依其自有鍵處置,不被當成陣列樣物件;欄位值內之巢狀物件之XSS清除由wsemi之clearXSS進行,不在此限(見規則帳本R-OBJ-01之已知限制)。mix之del各筆與單獨del之各筆不做上述檢查。
88
90
  mix之add與del、del與diff含同一主鍵(依上述轉型後)者,於任何步驟之前整批reject且不寫入任何一筆,訊息列其位置而不回顯主鍵,如'invalid input of mix, same id in add and del: add[0], del[1]';因mix依add、del、diff之序執行,同鍵將使新增因已存在而略過後即被刪除。
89
91
  insert(含mix之新增)為主鍵已存在即略過之冪等新增,回傳之id含被略過者;recover亦以insert還原,故資料表須先清空。
90
92
  insert、save與mix之新增、修改,寫入前各欄位之字串皆經wsemi之clearXSS清除(白名單外之標籤轉義,白名單內之標籤刪除白名單外之屬性與危險網址,標籤外之文字只轉義會開始標籤之&lt;,故'a &lt; b'等數學式不改寫);select與del不經清除。
@@ -101,7 +103,7 @@ insert、save與mix之新增、修改,寫入前各欄位之字串皆經wsemi
101
103
 
102
104
  <dt class="tag-source">Source:</dt>
103
105
  <dd class="tag-source"><ul class="dummy"><li>
104
- <a href="WServOrm.mjs.html">WServOrm.mjs</a>, <a href="WServOrm.mjs.html#line101">line 101</a>
106
+ <a href="WServOrm.mjs.html">WServOrm.mjs</a>, <a href="WServOrm.mjs.html#line103">line 103</a>
105
107
  </li></ul></dd>
106
108
 
107
109
 
@@ -444,7 +446,7 @@ insert、save與mix之新增、修改,寫入前各欄位之字串皆經wsemi
444
446
  <br class="clear">
445
447
 
446
448
  <footer>
447
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sat Oct 17 2026 05:14:34 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
449
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Oct 19 2026 23:46:34 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
448
450
  </footer>
449
451
 
450
452
  <script>prettyPrint();</script>
@@ -64,11 +64,13 @@ import getProc from './getProc.mjs'
64
64
  * mix之各步驟遇單筆失敗不中斷後續步驟,待全部步驟完成後一併reject;遇整批性錯誤則立即reject,後續步驟不執行。mix於resolve時回傳各步驟所處理之列之id(依add、del、diff之序串接,del之列不分是否命中)。
65
65
  *
66
66
  * insert、save與mix之新增、修改,數據未帶有效主鍵(未給、null、空字串,或非字串非數字之值,含NaN與±Infinity)者,若資料表之主鍵欄為id且為字串型(或型別未知;型別如STRING(36)者以括號前之字判定),由本套件產生主鍵(同各ORM之genIDSeq)並於resolve時回傳;單一空物件與只含一個空物件之陣列不補(ORM視為無效輸入而不寫入),多筆批次中之空物件列則補。
67
- * 主鍵欄為字串型(或型別未知)之資料表,主鍵為有限數字者一律以其字串形式處置(如123視為'123'):寫入、resolve回傳、del與mix之刪除,以及select、delAll條件中主鍵之比較($eq、$ne、$gt、$gte、$lt、$lte、$in、$nin、$all,含$not、$and、$or、$nor之內)皆同,故以數字或其字串形式寫入、查詢與刪除者為同一筆,範圍比較依字串之字典序;主鍵欄為整數型者不轉型。轉型只作用於procOrm,經woItems直接操作者不轉型。舊版w-orm-mongodb(2025-04-29以前)保留之數字主鍵資料,以數字查詢將查不到。
67
+ * 主鍵欄為字串型(或型別未知)之資料表,主鍵為有限數字者一律以其字串形式處置(如123視為'123'):寫入、resolve回傳、del與mix之刪除,以及select、delAll條件中主鍵之比較($eq、$ne、$gt、$gte、$lt、$lte、$in、$nin,含$and、$or之內)皆同,故以數字或其字串形式寫入、查詢與刪除者為同一筆,範圍比較依字串之字典序;主鍵欄為整數型者不轉型。轉型只作用於procOrm,經woItems直接操作者不轉型。舊版w-orm-mongodb(2025-04-29以前)保留之數字主鍵資料,以數字查詢將查不到。
68
68
  * reject時不回傳補出之主鍵,故重送未帶主鍵之數據會再產生新主鍵而重複寫入,需冪等重送者請自帶主鍵(非空字串或有限數字);save帶主鍵者重送以主鍵覆寫,del重送時已刪除者為主鍵未命中。
69
69
  * 回傳之id為本套件依輸入(含補值與轉型)所得之主鍵,非ORM之寫入結果;ORM之比對規則較寬者(如w-orm-mdb之Jet不分大小寫、忽略尾端空白),insert略過或save命中之對象可能與回傳之id不同。lmdb、lowdb、level、mongodb等主鍵固定為字串id之ORM,其資料表之id須為字串型pk或不標型別;本套件以id為主鍵,主鍵欄非id之ORM(如w-orm-postgresql預設為time)之回傳id不具主鍵意義。
70
70
  * 輸入之形狀:insert與save之各筆、mix之新增與修改之各筆須為物件,mix之add、del、diff若給予須為陣列,select與delAll之條件若給予須為純物件(原型為null或Object.prototype;未給、undefined與空物件{}為無條件:select回全部、delAll刪除全部;null、陣列、字串、數字、布林、函數、Date、RegExp、Map、Set與類別實例皆reject),否則於任何寫入或查詢之前reject,如'failed to insert data, not an object: data[0]'、'invalid find of select, need an object'、'invalid find of delAll, need an object'。
71
- * 資料表名(procOrm之woName)須為本實例資料表之自有名稱,否則reject 'can not find table[x] in ORM'(原型鏈上之名稱如constructor、toString與路徑字串如tests.select亦然);select與delAll之條件之巢狀深度(物件與陣列各算一層)超過64層者reject 'invalid find of select, too deep'。條件與寫入列(insert、save、mix之新增與修改)之任何深度(一般物件之值、陣列之元素)含自有__proto__鍵(JSON.parse、Object.fromEntries、structuredClone等可產生;物件字面量之__proto__為設原型而不算)或存取器屬性(getter、setter)者整批reject,如'invalid find of select, unsupported key[__proto__]'、'failed to insert data, unsupported accessor property: data[0]',訊息不回顯客戶端之值。含整數length鍵之條件與寫入列本身依其自有鍵處置,不被當成陣列樣物件;欄位值內之巢狀物件之XSS清除由wsemi之clearXSS進行,不在此限(見規則帳本R-OBJ-01之已知限制)。mix之del各筆與單獨del之各筆不做上述檢查。
71
+ * 條件(find):select與delAll之條件僅支援系列白名單,由各w-orm-*依相同規則檢核(須為已實作該白名單之w-orm-*版本;舊版或尚未更新者仍可能接受白名單外之運算子,不在下述保證內),本套件不依運算子放行或攔截(僅轉型主鍵條件,見上):欄位等值{欄:純量}(多欄為AND)、欄位運算子$eq $ne $gt $gte $lt $lte(值為純量)與$in $nin(值為純量陣列)、文件層$and $or(值為條件物件之非空陣列);純量為字串(不含NUL字元與孤立代理字元)、有限數字、布林、有效Date,null僅可用於欄位等值、$eq、$ne。白名單外之運算子($not $nor $regex $options $exists $all $where $expr $like $ilike等)、欄位層$and/$or、函數值、undefined值、空的$nin/$and/$or等,由ORM整批reject,procOrm以固定字串回傳(select為'failed to select data',delAll為'failed to delete data'),ORM之錯誤原文只由console.log輸出,delAll不刪除任何數據。select未給、為undefined或{}時回傳全部數據;select(find)命中之數據即delAll(find)刪除之數據。
72
+ * delAll(破壞性操作,須審慎使用,非必要不用;刪除單筆請用del):不給條件(未給、undefined或{})即刪除全部數據,不另行確認,給了條件才是部分刪除;傳了值卻不是條件物件(null、陣列含[]與[{...}]、字串、數值、布林、函數、Date、RegExp、Map、Set、類別實例等)一律整批reject,不視為{},不刪除任何數據。經資料通道(前端直接操作資料表,如w-serv-webdata)呼叫之delAll與此語意一致,不另加通道專屬限制,以免用法歧異造成誤解;通道端若另有更窄之條件限縮,未通過者由通道端拒絕,授權仍由開放處負責;通訊內容經JSON序列化時,顯式傳入之undefined會成為null而被reject,前端須省略參數或傳{}。條件值若來自可能為undefined、null或空陣列之變數,呼叫端須先自行判斷(undefined值會reject而非被忽略,空的$nin會reject,$in:[]則為恆假而刪除0筆);建議先以select(find)確認命中範圍再刪除(ORM啟用快取而他方已寫入時,select可能回傳快取,而delAll一律直讀資料庫,預覽不保證即實際刪除之集合)。n與nDeleted皆為實際刪除筆數,條件無命中時回{n:0,nDeleted:0,ok:1},不視為錯誤。
73
+ * 資料表名(procOrm之woName)須為本實例資料表之自有名稱,否則reject 'can not find table[x] in ORM'(原型鏈上之名稱如constructor、toString與路徑字串如tests.select亦然);select與delAll之條件之巢狀深度(物件與陣列各算一層)超過64層者reject 'invalid find of select, too deep'。條件與寫入列(insert、save、mix之新增與修改)之任何深度(一般物件之值、陣列之元素)含自有__proto__鍵(JSON.parse、Object.fromEntries、structuredClone等可產生;物件字面量之__proto__為設原型而不算)或存取器屬性(getter、setter)者整批reject,如'invalid find of select, unsupported key[__proto__]'、'failed to insert data, unsupported accessor property: data[0]',訊息不回顯客戶端之值。select與delAll之條件另拒絕複製時會被洗掉之結構,整批reject:Symbol鍵或不可列舉鍵('invalid find of select, unsupported symbol key or non-enumerable property');Proxy(含已撤銷者、原型為Proxy者)、帶Symbol.toStringTag者(自有或繼承,含Map、Set等內建品牌物件)、內建品牌物件(含原型被改為null者)、非純物件(類別實例、偽原型等)、有空洞或額外屬性或不可列舉元素之陣列、帶自有屬性之Date、函數值與Symbol值('invalid find of select, unsupported irregular object or array'),使後端所見之條件同呼叫端所給者,且檢查期間與拒收後之診斷輸出皆不執行使用端程式(陷阱、getter、Symbol.toStringTag與util.inspect.custom;被拒條件以本層建立之純資料快照輸出至console.log,字串長度、層數與項數有上限);以Proxy包裝之條件(如Vue響應式物件)與Mongoose等文件須先轉為純物件(寫入列不在此限)。跨realm之純物件照常:於字串型主鍵表之複製位置(頂層、$and/$or元素、id之運算子物件)被複製為本realm物件,其餘位置原樣交後端,現行後端白名單要求本realm物件而reject。含整數length鍵之條件與寫入列本身依其自有鍵處置,不被當成陣列樣物件;欄位值內之巢狀物件之XSS清除由wsemi之clearXSS進行,不在此限(見規則帳本R-OBJ-01之已知限制)。mix之del各筆與單獨del之各筆不做上述檢查。
72
74
  * mix之add與del、del與diff含同一主鍵(依上述轉型後)者,於任何步驟之前整批reject且不寫入任何一筆,訊息列其位置而不回顯主鍵,如'invalid input of mix, same id in add and del: add[0], del[1]';因mix依add、del、diff之序執行,同鍵將使新增因已存在而略過後即被刪除。
73
75
  * insert(含mix之新增)為主鍵已存在即略過之冪等新增,回傳之id含被略過者;recover亦以insert還原,故資料表須先清空。
74
76
  * insert、save與mix之新增、修改,寫入前各欄位之字串皆經wsemi之clearXSS清除(白名單外之標籤轉義,白名單內之標籤刪除白名單外之屬性與危險網址,標籤外之文字只轉義會開始標籤之&lt;,故'a &lt; b'等數學式不改寫);select與del不經清除。
@@ -196,7 +198,7 @@ export default WServOrm
196
198
  <br class="clear">
197
199
 
198
200
  <footer>
199
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sat Oct 17 2026 05:14:34 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
201
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Oct 19 2026 23:46:34 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
200
202
  </footer>
201
203
 
202
204
  <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 Sat Oct 17 2026 05:14:34 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 Mon Oct 19 2026 23:46:34 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,15 +1,15 @@
1
1
  {
2
2
  "name": "w-serv-orm",
3
- "version": "1.1.13",
3
+ "version": "1.1.14",
4
4
  "main": "dist/w-serv-orm.umd.js",
5
5
  "dependencies": {
6
6
  "json5": "^2.2.3",
7
7
  "w-data-collector": "^1.0.46",
8
- "wsemi": "^1.9.18"
8
+ "wsemi": "^1.9.20"
9
9
  },
10
10
  "devDependencies": {
11
- "w-orm-lowdb": "^1.0.31",
12
- "w-package-tools": "^1.1.20"
11
+ "w-orm-lowdb": "^1.0.32",
12
+ "w-package-tools": "^1.1.21"
13
13
  },
14
14
  "scripts": {
15
15
  "test": "mocha --parallel \"test/*.test.mjs\" --timeout 180000",
package/src/WServOrm.mjs CHANGED
@@ -17,11 +17,13 @@ import getProc from './getProc.mjs'
17
17
  * mix之各步驟遇單筆失敗不中斷後續步驟,待全部步驟完成後一併reject;遇整批性錯誤則立即reject,後續步驟不執行。mix於resolve時回傳各步驟所處理之列之id(依add、del、diff之序串接,del之列不分是否命中)。
18
18
  *
19
19
  * insert、save與mix之新增、修改,數據未帶有效主鍵(未給、null、空字串,或非字串非數字之值,含NaN與±Infinity)者,若資料表之主鍵欄為id且為字串型(或型別未知;型別如STRING(36)者以括號前之字判定),由本套件產生主鍵(同各ORM之genIDSeq)並於resolve時回傳;單一空物件與只含一個空物件之陣列不補(ORM視為無效輸入而不寫入),多筆批次中之空物件列則補。
20
- * 主鍵欄為字串型(或型別未知)之資料表,主鍵為有限數字者一律以其字串形式處置(如123視為'123'):寫入、resolve回傳、del與mix之刪除,以及select、delAll條件中主鍵之比較($eq、$ne、$gt、$gte、$lt、$lte、$in、$nin、$all,含$not、$and、$or、$nor之內)皆同,故以數字或其字串形式寫入、查詢與刪除者為同一筆,範圍比較依字串之字典序;主鍵欄為整數型者不轉型。轉型只作用於procOrm,經woItems直接操作者不轉型。舊版w-orm-mongodb(2025-04-29以前)保留之數字主鍵資料,以數字查詢將查不到。
20
+ * 主鍵欄為字串型(或型別未知)之資料表,主鍵為有限數字者一律以其字串形式處置(如123視為'123'):寫入、resolve回傳、del與mix之刪除,以及select、delAll條件中主鍵之比較($eq、$ne、$gt、$gte、$lt、$lte、$in、$nin,含$and、$or之內)皆同,故以數字或其字串形式寫入、查詢與刪除者為同一筆,範圍比較依字串之字典序;主鍵欄為整數型者不轉型。轉型只作用於procOrm,經woItems直接操作者不轉型。舊版w-orm-mongodb(2025-04-29以前)保留之數字主鍵資料,以數字查詢將查不到。
21
21
  * reject時不回傳補出之主鍵,故重送未帶主鍵之數據會再產生新主鍵而重複寫入,需冪等重送者請自帶主鍵(非空字串或有限數字);save帶主鍵者重送以主鍵覆寫,del重送時已刪除者為主鍵未命中。
22
22
  * 回傳之id為本套件依輸入(含補值與轉型)所得之主鍵,非ORM之寫入結果;ORM之比對規則較寬者(如w-orm-mdb之Jet不分大小寫、忽略尾端空白),insert略過或save命中之對象可能與回傳之id不同。lmdb、lowdb、level、mongodb等主鍵固定為字串id之ORM,其資料表之id須為字串型pk或不標型別;本套件以id為主鍵,主鍵欄非id之ORM(如w-orm-postgresql預設為time)之回傳id不具主鍵意義。
23
23
  * 輸入之形狀:insert與save之各筆、mix之新增與修改之各筆須為物件,mix之add、del、diff若給予須為陣列,select與delAll之條件若給予須為純物件(原型為null或Object.prototype;未給、undefined與空物件{}為無條件:select回全部、delAll刪除全部;null、陣列、字串、數字、布林、函數、Date、RegExp、Map、Set與類別實例皆reject),否則於任何寫入或查詢之前reject,如'failed to insert data, not an object: data[0]'、'invalid find of select, need an object'、'invalid find of delAll, need an object'。
24
- * 資料表名(procOrm之woName)須為本實例資料表之自有名稱,否則reject 'can not find table[x] in ORM'(原型鏈上之名稱如constructor、toString與路徑字串如tests.select亦然);select與delAll之條件之巢狀深度(物件與陣列各算一層)超過64層者reject 'invalid find of select, too deep'。條件與寫入列(insert、save、mix之新增與修改)之任何深度(一般物件之值、陣列之元素)含自有__proto__鍵(JSON.parse、Object.fromEntries、structuredClone等可產生;物件字面量之__proto__為設原型而不算)或存取器屬性(getter、setter)者整批reject,如'invalid find of select, unsupported key[__proto__]'、'failed to insert data, unsupported accessor property: data[0]',訊息不回顯客戶端之值。含整數length鍵之條件與寫入列本身依其自有鍵處置,不被當成陣列樣物件;欄位值內之巢狀物件之XSS清除由wsemi之clearXSS進行,不在此限(見規則帳本R-OBJ-01之已知限制)。mix之del各筆與單獨del之各筆不做上述檢查。
24
+ * 條件(find):select與delAll之條件僅支援系列白名單,由各w-orm-*依相同規則檢核(須為已實作該白名單之w-orm-*版本;舊版或尚未更新者仍可能接受白名單外之運算子,不在下述保證內),本套件不依運算子放行或攔截(僅轉型主鍵條件,見上):欄位等值{欄:純量}(多欄為AND)、欄位運算子$eq $ne $gt $gte $lt $lte(值為純量)與$in $nin(值為純量陣列)、文件層$and $or(值為條件物件之非空陣列);純量為字串(不含NUL字元與孤立代理字元)、有限數字、布林、有效Date,null僅可用於欄位等值、$eq、$ne。白名單外之運算子($not $nor $regex $options $exists $all $where $expr $like $ilike等)、欄位層$and/$or、函數值、undefined值、空的$nin/$and/$or等,由ORM整批reject,procOrm以固定字串回傳(select為'failed to select data',delAll為'failed to delete data'),ORM之錯誤原文只由console.log輸出,delAll不刪除任何數據。select未給、為undefined或{}時回傳全部數據;select(find)命中之數據即delAll(find)刪除之數據。
25
+ * delAll(破壞性操作,須審慎使用,非必要不用;刪除單筆請用del):不給條件(未給、undefined或{})即刪除全部數據,不另行確認,給了條件才是部分刪除;傳了值卻不是條件物件(null、陣列含[]與[{...}]、字串、數值、布林、函數、Date、RegExp、Map、Set、類別實例等)一律整批reject,不視為{},不刪除任何數據。經資料通道(前端直接操作資料表,如w-serv-webdata)呼叫之delAll與此語意一致,不另加通道專屬限制,以免用法歧異造成誤解;通道端若另有更窄之條件限縮,未通過者由通道端拒絕,授權仍由開放處負責;通訊內容經JSON序列化時,顯式傳入之undefined會成為null而被reject,前端須省略參數或傳{}。條件值若來自可能為undefined、null或空陣列之變數,呼叫端須先自行判斷(undefined值會reject而非被忽略,空的$nin會reject,$in:[]則為恆假而刪除0筆);建議先以select(find)確認命中範圍再刪除(ORM啟用快取而他方已寫入時,select可能回傳快取,而delAll一律直讀資料庫,預覽不保證即實際刪除之集合)。n與nDeleted皆為實際刪除筆數,條件無命中時回{n:0,nDeleted:0,ok:1},不視為錯誤。
26
+ * 資料表名(procOrm之woName)須為本實例資料表之自有名稱,否則reject 'can not find table[x] in ORM'(原型鏈上之名稱如constructor、toString與路徑字串如tests.select亦然);select與delAll之條件之巢狀深度(物件與陣列各算一層)超過64層者reject 'invalid find of select, too deep'。條件與寫入列(insert、save、mix之新增與修改)之任何深度(一般物件之值、陣列之元素)含自有__proto__鍵(JSON.parse、Object.fromEntries、structuredClone等可產生;物件字面量之__proto__為設原型而不算)或存取器屬性(getter、setter)者整批reject,如'invalid find of select, unsupported key[__proto__]'、'failed to insert data, unsupported accessor property: data[0]',訊息不回顯客戶端之值。select與delAll之條件另拒絕複製時會被洗掉之結構,整批reject:Symbol鍵或不可列舉鍵('invalid find of select, unsupported symbol key or non-enumerable property');Proxy(含已撤銷者、原型為Proxy者)、帶Symbol.toStringTag者(自有或繼承,含Map、Set等內建品牌物件)、內建品牌物件(含原型被改為null者)、非純物件(類別實例、偽原型等)、有空洞或額外屬性或不可列舉元素之陣列、帶自有屬性之Date、函數值與Symbol值('invalid find of select, unsupported irregular object or array'),使後端所見之條件同呼叫端所給者,且檢查期間與拒收後之診斷輸出皆不執行使用端程式(陷阱、getter、Symbol.toStringTag與util.inspect.custom;被拒條件以本層建立之純資料快照輸出至console.log,字串長度、層數與項數有上限);以Proxy包裝之條件(如Vue響應式物件)與Mongoose等文件須先轉為純物件(寫入列不在此限)。跨realm之純物件照常:於字串型主鍵表之複製位置(頂層、$and/$or元素、id之運算子物件)被複製為本realm物件,其餘位置原樣交後端,現行後端白名單要求本realm物件而reject。含整數length鍵之條件與寫入列本身依其自有鍵處置,不被當成陣列樣物件;欄位值內之巢狀物件之XSS清除由wsemi之clearXSS進行,不在此限(見規則帳本R-OBJ-01之已知限制)。mix之del各筆與單獨del之各筆不做上述檢查。
25
27
  * mix之add與del、del與diff含同一主鍵(依上述轉型後)者,於任何步驟之前整批reject且不寫入任何一筆,訊息列其位置而不回顯主鍵,如'invalid input of mix, same id in add and del: add[0], del[1]';因mix依add、del、diff之序執行,同鍵將使新增因已存在而略過後即被刪除。
26
28
  * insert(含mix之新增)為主鍵已存在即略過之冪等新增,回傳之id含被略過者;recover亦以insert還原,故資料表須先清空。
27
29
  * insert、save與mix之新增、修改,寫入前各欄位之字串皆經wsemi之clearXSS清除(白名單外之標籤轉義,白名單內之標籤刪除白名單外之屬性與危險網址,標籤外之文字只轉義會開始標籤之<,故'a < b'等數學式不改寫);select與del不經清除。