indexeddbshim 16.1.0 → 17.1.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.
- package/README.md +65 -3
- package/badges/licenses-badge-dev.svg +1 -1
- package/badges/licenses-badge.svg +1 -1
- package/dist/CFG.d.ts +1 -0
- package/dist/CFG.d.ts.map +1 -1
- package/dist/DOMException.d.ts.map +1 -1
- package/dist/DOMStringList.d.ts.map +1 -1
- package/dist/IDBCursor.d.ts +12 -3
- package/dist/IDBCursor.d.ts.map +1 -1
- package/dist/IDBDatabase.d.ts +2 -1
- package/dist/IDBDatabase.d.ts.map +1 -1
- package/dist/IDBFactory.d.ts +2 -1
- package/dist/IDBFactory.d.ts.map +1 -1
- package/dist/IDBIndex.d.ts +2 -1
- package/dist/IDBIndex.d.ts.map +1 -1
- package/dist/IDBKeyRange.d.ts +1 -1
- package/dist/IDBKeyRange.d.ts.map +1 -1
- package/dist/IDBObjectStore.d.ts +2 -1
- package/dist/IDBObjectStore.d.ts.map +1 -1
- package/dist/IDBRequest.d.ts +5 -3
- package/dist/IDBRequest.d.ts.map +1 -1
- package/dist/IDBTransaction.d.ts +23 -1
- package/dist/IDBTransaction.d.ts.map +1 -1
- package/dist/Key.d.ts.map +1 -1
- package/dist/Sca.d.ts.map +1 -1
- package/dist/UnicodeIdentifiers.d.ts.map +1 -1
- package/dist/browser-noninvasive.d.ts.map +1 -1
- package/dist/indexeddbshim-Key.js +1863 -1669
- package/dist/indexeddbshim-Key.js.map +1 -1
- package/dist/indexeddbshim-Key.min.js +2 -2
- package/dist/indexeddbshim-Key.min.js.map +1 -1
- package/dist/indexeddbshim-UnicodeIdentifiers-node.cjs +2373 -1893
- package/dist/indexeddbshim-UnicodeIdentifiers-node.cjs.map +1 -1
- package/dist/indexeddbshim-UnicodeIdentifiers.js +3124 -2285
- package/dist/indexeddbshim-UnicodeIdentifiers.js.map +1 -1
- package/dist/indexeddbshim-UnicodeIdentifiers.min.js +9 -2
- package/dist/indexeddbshim-UnicodeIdentifiers.min.js.map +1 -1
- package/dist/indexeddbshim-node.cjs +2373 -1893
- package/dist/indexeddbshim-node.cjs.map +1 -1
- package/dist/indexeddbshim-noninvasive.js +3123 -2284
- package/dist/indexeddbshim-noninvasive.js.map +1 -1
- package/dist/indexeddbshim-noninvasive.min.js +9 -2
- package/dist/indexeddbshim-noninvasive.min.js.map +1 -1
- package/dist/indexeddbshim.js +3120 -2282
- package/dist/indexeddbshim.js.map +1 -1
- package/dist/indexeddbshim.min.js +9 -2
- package/dist/indexeddbshim.min.js.map +1 -1
- package/dist/node-UnicodeIdentifiers.d.ts +2 -2
- package/dist/node-UnicodeIdentifiers.d.ts.map +1 -1
- package/dist/node.d.ts +2 -2
- package/dist/node.d.ts.map +1 -1
- package/dist/nodeSQLiteDatabase.d.ts +65 -0
- package/dist/nodeSQLiteDatabase.d.ts.map +1 -0
- package/dist/nodeWebSQL.d.ts.map +1 -1
- package/dist/util.d.ts +5 -0
- package/dist/util.d.ts.map +1 -1
- package/package.json +118 -106
- package/src/CFG.js +5 -3
- package/src/DOMException.js +11 -9
- package/src/DOMStringList.js +8 -3
- package/src/Event.js +2 -0
- package/src/IDBCursor.js +152 -95
- package/src/IDBDatabase.js +9 -6
- package/src/IDBFactory.js +31 -20
- package/src/IDBIndex.js +83 -79
- package/src/IDBKeyRange.js +42 -35
- package/src/IDBObjectStore.js +83 -77
- package/src/IDBRequest.js +28 -15
- package/src/IDBTransaction.js +40 -6
- package/src/IDBVersionChangeEvent.js +2 -0
- package/src/Key.js +28 -14
- package/src/Sca.js +2 -1
- package/src/UnicodeIdentifiers.js +2 -2
- package/src/browser-UnicodeIdentifiers.js +0 -1
- package/src/browser-noninvasive.js +0 -1
- package/src/browser.js +0 -1
- package/src/node-UnicodeIdentifiers.js +6 -2
- package/src/node.js +6 -2
- package/src/nodeSQLiteDatabase.js +174 -0
- package/src/nodeWebSQL.js +1 -3
- package/src/setGlobalVars.js +13 -13
- package/src/util.js +75 -15
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// ID_Start (includes Other_ID_Start)
|
|
2
2
|
const UnicodeIDStart =
|
|
3
|
-
|
|
3
|
+
String.raw`(?:[$A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D])`;
|
|
4
4
|
|
|
5
5
|
// ID_Continue (includes Other_ID_Continue)
|
|
6
6
|
const UnicodeIDContinue =
|
|
7
|
-
|
|
7
|
+
String.raw`(?:[$0-9A-Z_a-z\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF])`;
|
|
8
8
|
|
|
9
9
|
export {UnicodeIDStart, UnicodeIDContinue};
|
package/src/browser.js
CHANGED
|
@@ -10,10 +10,14 @@ CFG.win = {openDatabase: nodeWebSQL};
|
|
|
10
10
|
/**
|
|
11
11
|
* @param {import('./setGlobalVars.js').ShimmedObject} idb
|
|
12
12
|
* @param {import('./CFG.js').default} initialConfig
|
|
13
|
-
* @returns {
|
|
13
|
+
* @returns {import('./setGlobalVars.js').ShimmedObject|Window}
|
|
14
14
|
*/
|
|
15
15
|
const __setGlobalVars = function (idb, initialConfig = {}) {
|
|
16
|
-
const obj = setGlobalVars(idb, {
|
|
16
|
+
const obj = setGlobalVars(idb, {
|
|
17
|
+
fs,
|
|
18
|
+
escapeNULForSQLiteStatements: false,
|
|
19
|
+
...initialConfig
|
|
20
|
+
});
|
|
17
21
|
/* istanbul ignore next -- TS guard */
|
|
18
22
|
if (!obj.shimIndexedDB) {
|
|
19
23
|
return obj;
|
package/src/node.js
CHANGED
|
@@ -9,10 +9,14 @@ CFG.win = {openDatabase: nodeWebSQL};
|
|
|
9
9
|
/**
|
|
10
10
|
* @param {import('./setGlobalVars.js').ShimmedObject} idb
|
|
11
11
|
* @param {import('./CFG.js').default} initialConfig
|
|
12
|
-
* @returns {
|
|
12
|
+
* @returns {import('./setGlobalVars.js').ShimmedObject|Window}
|
|
13
13
|
*/
|
|
14
14
|
const __setGlobalVars = function (idb, initialConfig = {}) {
|
|
15
|
-
return setGlobalVars(idb, {
|
|
15
|
+
return setGlobalVars(idb, {
|
|
16
|
+
fs,
|
|
17
|
+
escapeNULForSQLiteStatements: false,
|
|
18
|
+
...initialConfig
|
|
19
|
+
});
|
|
16
20
|
};
|
|
17
21
|
|
|
18
22
|
export default __setGlobalVars;
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
class SQLiteResult {
|
|
7
|
+
/**
|
|
8
|
+
* @param {Error|null|undefined} error
|
|
9
|
+
* @param {number|undefined} [insertId]
|
|
10
|
+
* @param {number} [rowsAffected]
|
|
11
|
+
* @param {object[]} [rows]
|
|
12
|
+
*/
|
|
13
|
+
constructor (error, insertId, rowsAffected, rows) {
|
|
14
|
+
this.error = error;
|
|
15
|
+
this.insertId = insertId;
|
|
16
|
+
this.rowsAffected = rowsAffected;
|
|
17
|
+
this.rows = rows;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const READ_ONLY_ERROR = new Error(
|
|
22
|
+
'could not prepare statement (23 not authorized)'
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @typedef {(sql: string, duration: number) => void} SQLProfileCallback
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @typedef {((sql: string) => void)|undefined} SQLTraceCallback
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @param {string} name
|
|
35
|
+
* @param {{busyTimeout?: number, trace?: (sql: string) => void, profile?: SQLProfileCallback}} [opts]
|
|
36
|
+
* @returns {void}
|
|
37
|
+
*/
|
|
38
|
+
function SQLiteDatabase (name, opts = {}) {
|
|
39
|
+
/** @type {import('better-sqlite3').Database} */
|
|
40
|
+
const db = new Database(name);
|
|
41
|
+
|
|
42
|
+
/** @type {SQLTraceCallback} */
|
|
43
|
+
// eslint-disable-next-line prefer-destructuring -- TS
|
|
44
|
+
let trace = opts.trace;
|
|
45
|
+
/** @type {SQLProfileCallback|undefined} */
|
|
46
|
+
// eslint-disable-next-line prefer-destructuring -- TS
|
|
47
|
+
let profile = opts.profile;
|
|
48
|
+
|
|
49
|
+
if (opts.busyTimeout) {
|
|
50
|
+
db.pragma('busy_timeout = ' + Number(opts.busyTimeout));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Kept untyped (rather than the better-sqlite3 `Database` type) since that
|
|
54
|
+
// type is internal to `@types/better-sqlite3` and can't be named in this
|
|
55
|
+
// file's emitted declaration.
|
|
56
|
+
this._db = /** @type {any} */ ({
|
|
57
|
+
_db: db,
|
|
58
|
+
/**
|
|
59
|
+
* Compatibility with node-sqlite3's configure API.
|
|
60
|
+
* @param {'busyTimeout'|'trace'|'profile'} option
|
|
61
|
+
* @param {number|((sql: string, duration?: number) => void)} value
|
|
62
|
+
* @returns {void}
|
|
63
|
+
*/
|
|
64
|
+
configure (option, value) {
|
|
65
|
+
if (option === 'busyTimeout') {
|
|
66
|
+
db.pragma('busy_timeout = ' + Number(/** @type {number} */ (value)));
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (option === 'trace') {
|
|
70
|
+
trace = /** @type {(sql: string) => void} */ (value);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (option === 'profile') {
|
|
74
|
+
profile = /** @type {SQLProfileCallback} */ (value);
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
/**
|
|
78
|
+
* Compatibility with callback-oriented close semantics.
|
|
79
|
+
* @param {(err?: Error|null) => void} [cb]
|
|
80
|
+
* @returns {void}
|
|
81
|
+
*/
|
|
82
|
+
close (cb) {
|
|
83
|
+
try {
|
|
84
|
+
db.close();
|
|
85
|
+
if (cb) {
|
|
86
|
+
return cb(null);
|
|
87
|
+
}
|
|
88
|
+
} catch (err) {
|
|
89
|
+
if (cb) {
|
|
90
|
+
return cb(/** @type {Error} */ (err));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return undefined;
|
|
94
|
+
},
|
|
95
|
+
getTrace () {
|
|
96
|
+
return trace;
|
|
97
|
+
},
|
|
98
|
+
getProfile () {
|
|
99
|
+
return profile;
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* @param {import('better-sqlite3').Database} db
|
|
106
|
+
* @param {string} sql
|
|
107
|
+
* @param {unknown[]} args
|
|
108
|
+
* @returns {object[]}
|
|
109
|
+
*/
|
|
110
|
+
function runSelect (db, sql, args) {
|
|
111
|
+
const stmt = db.prepare(sql);
|
|
112
|
+
return stmt.reader ? /** @type {object[]} */ (stmt.all(...args)) : [];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* @param {import('better-sqlite3').Database} db
|
|
117
|
+
* @param {string} sql
|
|
118
|
+
* @param {unknown[]} args
|
|
119
|
+
* @returns {import('better-sqlite3').RunResult}
|
|
120
|
+
*/
|
|
121
|
+
function runNonSelect (db, sql, args) {
|
|
122
|
+
const stmt = db.prepare(sql);
|
|
123
|
+
return stmt.run(...args);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* @param {{sql: string, args: unknown[]}[]} queries
|
|
128
|
+
* @param {boolean} readOnly
|
|
129
|
+
* @param {(err: Error|null, results?: SQLiteResult[]) => void} callback
|
|
130
|
+
* @returns {void}
|
|
131
|
+
*/
|
|
132
|
+
SQLiteDatabase.prototype.exec = function exec (queries, readOnly, callback) {
|
|
133
|
+
const db = this._db._db;
|
|
134
|
+
const len = queries.length;
|
|
135
|
+
const results = Array.from({length: len});
|
|
136
|
+
|
|
137
|
+
for (let i = 0; i < len; i++) {
|
|
138
|
+
const query = queries[i];
|
|
139
|
+
const {sql, args} = query;
|
|
140
|
+
const isSelect = (/^\s*SELECT\b/iu).test(sql);
|
|
141
|
+
if (readOnly && !isSelect) {
|
|
142
|
+
results[i] = new SQLiteResult(READ_ONLY_ERROR);
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const trace = this._db.getTrace();
|
|
146
|
+
const profile = this._db.getProfile();
|
|
147
|
+
// eslint-disable-next-line unicorn/prefer-bigint-literals -- `0n` needs ES2020+ target for tsc
|
|
148
|
+
const start = profile ? process.hrtime.bigint() : BigInt(0);
|
|
149
|
+
try {
|
|
150
|
+
if (trace) {
|
|
151
|
+
trace(sql);
|
|
152
|
+
}
|
|
153
|
+
if (isSelect) {
|
|
154
|
+
const rows = runSelect(db, sql, args);
|
|
155
|
+
results[i] = new SQLiteResult(null, undefined, 0, rows);
|
|
156
|
+
} else {
|
|
157
|
+
const executionResult = runNonSelect(db, sql, args);
|
|
158
|
+
const insertId = Number(executionResult.lastInsertRowid);
|
|
159
|
+
results[i] = new SQLiteResult(null, insertId, executionResult.changes, []);
|
|
160
|
+
}
|
|
161
|
+
} catch (err) {
|
|
162
|
+
results[i] = new SQLiteResult(/** @type {Error} */ (err));
|
|
163
|
+
} finally {
|
|
164
|
+
if (profile) {
|
|
165
|
+
profile(sql, Number(process.hrtime.bigint() - start));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
queueMicrotask(() => {
|
|
170
|
+
callback(null, results);
|
|
171
|
+
});
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
export default SQLiteDatabase;
|
package/src/nodeWebSQL.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import customOpenDatabase from 'websql-configurable/custom/index.js';
|
|
2
|
-
import SQLiteDatabase from '
|
|
2
|
+
import SQLiteDatabase from './nodeSQLiteDatabase.js';
|
|
3
3
|
import CFG from './CFG.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -12,11 +12,9 @@ function wrappedSQLiteDatabase (name) {
|
|
|
12
12
|
db._db.configure('busyTimeout', /** @type {number} */ (CFG.sqlBusyTimeout)); // Default is 1000
|
|
13
13
|
}
|
|
14
14
|
if (CFG.sqlTrace) {
|
|
15
|
-
// @ts-expect-error native API?
|
|
16
15
|
db._db.configure('trace', CFG.sqlTrace);
|
|
17
16
|
}
|
|
18
17
|
if (CFG.sqlProfile) {
|
|
19
|
-
// @ts-expect-error native API?
|
|
20
18
|
db._db.configure('profile', CFG.sqlProfile);
|
|
21
19
|
}
|
|
22
20
|
return db;
|
package/src/setGlobalVars.js
CHANGED
|
@@ -40,7 +40,7 @@ function setConfig (prop, val) {
|
|
|
40
40
|
});
|
|
41
41
|
return;
|
|
42
42
|
}
|
|
43
|
-
if (!(prop
|
|
43
|
+
if (!Object.hasOwn(CFG, prop)) {
|
|
44
44
|
throw new Error(prop + ' is not a valid configuration property');
|
|
45
45
|
}
|
|
46
46
|
// @ts-expect-error Should not be `never` here!
|
|
@@ -264,7 +264,7 @@ function setGlobalVars (idb, initialConfig) {
|
|
|
264
264
|
setFS(CFG.fs);
|
|
265
265
|
}
|
|
266
266
|
if (CFG.fullIDLSupport) {
|
|
267
|
-
// Slow per MDN so off by default! Though apparently needed for WebIDL:
|
|
267
|
+
// Slow per MDN so off by default! Though apparently needed for WebIDL: https://stackoverflow.com/questions/41927589/rationales-consequences-of-webidl-class-inheritance-requirements
|
|
268
268
|
|
|
269
269
|
Object.setPrototypeOf(IDB.IDBOpenDBRequest, IDB.IDBRequest);
|
|
270
270
|
Object.setPrototypeOf(IDB.IDBCursorWithValue, IDB.IDBCursor);
|
|
@@ -303,7 +303,7 @@ function setGlobalVars (idb, initialConfig) {
|
|
|
303
303
|
|
|
304
304
|
/** @type {GetConfig} */
|
|
305
305
|
IDB.shimIndexedDB.__getConfig = function (prop) {
|
|
306
|
-
if (!(prop
|
|
306
|
+
if (!Object.hasOwn(CFG, prop)) {
|
|
307
307
|
throw new Error(prop + ' is not a valid configuration property');
|
|
308
308
|
}
|
|
309
309
|
return CFG[prop];
|
|
@@ -332,16 +332,16 @@ function setGlobalVars (idb, initialConfig) {
|
|
|
332
332
|
|
|
333
333
|
// Workaround to prevent an error in Firefox
|
|
334
334
|
if (!('indexedDB' in IDB) && typeof window !== 'undefined') { // 2nd condition avoids problems in Node
|
|
335
|
-
IDB.indexedDB
|
|
335
|
+
IDB.indexedDB ||= /** @type {IDBFactory} */ (
|
|
336
336
|
('webkitIndexedDB' in IDB && IDB.webkitIndexedDB) ||
|
|
337
337
|
('mozIndexedDB' in IDB && IDB.mozIndexedDB) ||
|
|
338
338
|
('oIndexedDB' in IDB && IDB.oIndexedDB) ||
|
|
339
|
-
('msIndexedDB' in IDB && IDB.msIndexedDB)
|
|
339
|
+
('msIndexedDB' in IDB && IDB.msIndexedDB)
|
|
340
|
+
);
|
|
340
341
|
}
|
|
341
342
|
|
|
342
343
|
// Detect browsers with known IndexedDB issues (e.g. Android pre-4.4)
|
|
343
|
-
|
|
344
|
-
if (
|
|
344
|
+
const poorIndexedDbSupport = (
|
|
345
345
|
typeof navigator !== 'undefined' &&
|
|
346
346
|
// Not apparently defined in React Native
|
|
347
347
|
navigator.userAgent &&
|
|
@@ -353,17 +353,15 @@ function setGlobalVars (idb, initialConfig) {
|
|
|
353
353
|
) ||
|
|
354
354
|
(
|
|
355
355
|
// Bad non-Safari iOS9 support (see <https://github.com/axemclion/IndexedDBShim/issues/252>)
|
|
356
|
-
(!navigator.userAgent.includes('Safari') || navigator.userAgent.includes('Chrome')) && // Exclude genuine Safari:
|
|
357
|
-
// Detect iOS:
|
|
358
|
-
// and detect version 9:
|
|
356
|
+
(!navigator.userAgent.includes('Safari') || navigator.userAgent.includes('Chrome')) && // Exclude genuine Safari: https://stackoverflow.com/a/7768006/271577
|
|
357
|
+
// Detect iOS: https://stackoverflow.com/questions/9038625/detect-if-device-is-ios/9039885#9039885
|
|
358
|
+
// and detect version 9: https://stackoverflow.com/a/26363560/271577
|
|
359
359
|
(/(iPad|iPhone|iPod).* os 9_/ui).test(navigator.userAgent) &&
|
|
360
360
|
(typeof window !== 'undefined' &&
|
|
361
361
|
!('MSStream' in window)) // But avoid IE11
|
|
362
362
|
)
|
|
363
363
|
)
|
|
364
|
-
)
|
|
365
|
-
poorIndexedDbSupport = true;
|
|
366
|
-
}
|
|
364
|
+
);
|
|
367
365
|
if (!CFG.DEFAULT_DB_SIZE) {
|
|
368
366
|
CFG.DEFAULT_DB_SIZE = (
|
|
369
367
|
( // Safari currently requires larger size: (We don't need a larger size for Node as node-websql doesn't use this info)
|
|
@@ -385,6 +383,7 @@ function setGlobalVars (idb, initialConfig) {
|
|
|
385
383
|
) {
|
|
386
384
|
IDB.shimIndexedDB.__useShim();
|
|
387
385
|
} else {
|
|
386
|
+
/* eslint-disable unicorn/logical-assignment-operators -- TS */
|
|
388
387
|
IDB.IDBDatabase = IDB.IDBDatabase ||
|
|
389
388
|
('webkitIDBDatabase' in IDB && IDB.webkitIDBDatabase);
|
|
390
389
|
IDB.IDBTransaction = IDB.IDBTransaction ||
|
|
@@ -393,6 +392,7 @@ function setGlobalVars (idb, initialConfig) {
|
|
|
393
392
|
('webkitIDBCursor' in IDB && IDB.webkitIDBCursor);
|
|
394
393
|
IDB.IDBKeyRange = IDB.IDBKeyRange ||
|
|
395
394
|
('webkitIDBKeyRange' in IDB && IDB.webkitIDBKeyRange);
|
|
395
|
+
/* eslint-enable unicorn/logical-assignment-operators -- TS */
|
|
396
396
|
}
|
|
397
397
|
return /** @type {ShimmedObject} */ (IDB);
|
|
398
398
|
}
|
package/src/util.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
/* eslint-disable new-cap -- ToString is how it is defined */
|
|
2
|
-
/* eslint-disable sonarjs/no-control-regex -- Needed */
|
|
3
2
|
import CFG from './CFG.js';
|
|
4
3
|
import expandsOnNFD from './unicode-regex.js';
|
|
5
4
|
|
|
@@ -12,11 +11,11 @@ import expandsOnNFD from './unicode-regex.js';
|
|
|
12
11
|
* @returns {string}
|
|
13
12
|
*/
|
|
14
13
|
function escapeUnmatchedSurrogates (arg) {
|
|
15
|
-
//
|
|
14
|
+
// https://stackoverflow.com/a/6701665/271577
|
|
16
15
|
return arg.replaceAll(
|
|
17
16
|
/([\uD800-\uDBFF])(?![\uDC00-\uDFFF])|(^|[^\uD800-\uDBFF])([\uDC00-\uDFFF])/gu,
|
|
18
17
|
function (_, unmatchedHighSurrogate, precedingLow, unmatchedLowSurrogate) {
|
|
19
|
-
// Could add a corresponding surrogate for compatibility with `node-sqlite3`:
|
|
18
|
+
// Could add a corresponding surrogate for compatibility with `node-sqlite3`: https://bugs.python.org/issue12569 and https://stackoverflow.com/a/6701665/271577
|
|
20
19
|
// but Chrome having problems
|
|
21
20
|
if (unmatchedHighSurrogate) {
|
|
22
21
|
return '^2' + unmatchedHighSurrogate.codePointAt()
|
|
@@ -33,14 +32,14 @@ function escapeUnmatchedSurrogates (arg) {
|
|
|
33
32
|
* @returns {string}
|
|
34
33
|
*/
|
|
35
34
|
function escapeNameForSQLiteIdentifier (arg) {
|
|
36
|
-
//
|
|
35
|
+
// https://stackoverflow.com/a/6701665/271577
|
|
37
36
|
return '_' + // Prevent empty string
|
|
38
37
|
escapeUnmatchedSurrogates(
|
|
39
38
|
arg.replaceAll('^', '^^') // Escape our escape
|
|
40
|
-
//
|
|
39
|
+
// https://www.sqlite.org/src/tktview?name=57c971fc74
|
|
41
40
|
.replaceAll('\0', '^0')
|
|
42
41
|
// We need to avoid identifiers being treated as duplicates based on SQLite's ASCII-only case-insensitive table and column names
|
|
43
|
-
// (For SQL in general, however, see
|
|
42
|
+
// (For SQL in general, however, see https://stackoverflow.com/a/17215009/271577
|
|
44
43
|
// See also https://www.sqlite.org/faq.html#q18 re: Unicode (non-ASCII) case-insensitive not working
|
|
45
44
|
.replaceAll(/([A-Z])/gu, '^$1')
|
|
46
45
|
);
|
|
@@ -52,7 +51,12 @@ function escapeNameForSQLiteIdentifier (arg) {
|
|
|
52
51
|
* @returns {string}
|
|
53
52
|
*/
|
|
54
53
|
function escapeSQLiteStatement (arg) {
|
|
55
|
-
|
|
54
|
+
const escaped = arg.replaceAll('^', '^^');
|
|
55
|
+
return escapeUnmatchedSurrogates(
|
|
56
|
+
CFG.escapeNULForSQLiteStatements === false
|
|
57
|
+
? escaped
|
|
58
|
+
: escaped.replaceAll('\0', '^0')
|
|
59
|
+
);
|
|
56
60
|
}
|
|
57
61
|
|
|
58
62
|
/**
|
|
@@ -60,7 +64,11 @@ function escapeSQLiteStatement (arg) {
|
|
|
60
64
|
* @returns {string}
|
|
61
65
|
*/
|
|
62
66
|
function unescapeSQLiteResponse (arg) {
|
|
63
|
-
|
|
67
|
+
const unescaped = unescapeUnmatchedSurrogates(arg);
|
|
68
|
+
if (CFG.escapeNULForSQLiteStatements === false) {
|
|
69
|
+
return unescaped.replaceAll('^^', '^');
|
|
70
|
+
}
|
|
71
|
+
return unescaped
|
|
64
72
|
.replaceAll(/(\^+)0/gu, (_, esc) => {
|
|
65
73
|
return esc.length % 2
|
|
66
74
|
? esc.slice(1) + '\0'
|
|
@@ -75,7 +83,7 @@ function unescapeSQLiteResponse (arg) {
|
|
|
75
83
|
*/
|
|
76
84
|
function sqlEscape (arg) {
|
|
77
85
|
// https://www.sqlite.org/lang_keywords.html
|
|
78
|
-
//
|
|
86
|
+
// https://stackoverflow.com/a/6701665/271577
|
|
79
87
|
// There is no need to escape ', `, or [], as
|
|
80
88
|
// we should always be within double quotes
|
|
81
89
|
// NUL should have already been stripped
|
|
@@ -114,7 +122,7 @@ function escapeDatabaseNameForSQLAndFiles (db) {
|
|
|
114
122
|
db = db.replace(
|
|
115
123
|
(CFG.databaseCharacterEscapeList
|
|
116
124
|
? new RegExp(CFG.databaseCharacterEscapeList, 'gu')
|
|
117
|
-
: /[\
|
|
125
|
+
: /[\u{0000}-\u{001F}\u{007F}"*/:<>?\\|]/gu), // eslint-disable-line no-control-regex -- Controls needed
|
|
118
126
|
function (n0) {
|
|
119
127
|
// eslint-disable-next-line unicorn/prefer-code-point -- Switch to `codePointAt`?
|
|
120
128
|
return '^1' + n0.charCodeAt(0).toString(16).padStart(2, '0');
|
|
@@ -302,7 +310,9 @@ function isBinary (obj) {
|
|
|
302
310
|
* @returns {boolean}
|
|
303
311
|
*/
|
|
304
312
|
function isIterable (obj) {
|
|
305
|
-
return isObj(obj) &&
|
|
313
|
+
return isObj(obj) &&
|
|
314
|
+
// eslint-disable-next-line unicorn/no-computed-property-existence-check -- May not be "own"
|
|
315
|
+
Symbol.iterator in obj &&
|
|
306
316
|
typeof obj[Symbol.iterator] === 'function';
|
|
307
317
|
}
|
|
308
318
|
|
|
@@ -398,7 +408,7 @@ function defineReadonlyProperties (obj, props, getter = null) {
|
|
|
398
408
|
props = typeof props === 'string' ? [props] : props;
|
|
399
409
|
props.forEach(function (prop) {
|
|
400
410
|
let o;
|
|
401
|
-
if (getter && prop
|
|
411
|
+
if (getter && Object.hasOwn(getter, prop)) {
|
|
402
412
|
o = getter[prop];
|
|
403
413
|
} else {
|
|
404
414
|
Object.defineProperty(obj, '__' + prop, {
|
|
@@ -438,7 +448,7 @@ function isIdentifier (item) {
|
|
|
438
448
|
// ID_Continue (includes Other_ID_Continue)
|
|
439
449
|
const UnicodeIDContinue = CFG.UnicodeIDContinue || '[$0-9A-Z_a-z]';
|
|
440
450
|
const IdentifierStart = '(?:' + UnicodeIDStart + '|[$_])';
|
|
441
|
-
const IdentifierPart = '(?:' + UnicodeIDContinue + '|[$_\
|
|
451
|
+
const IdentifierPart = '(?:' + UnicodeIDContinue + '|[$_\u{200C}\u{200D}])';
|
|
442
452
|
return (new RegExp('^' + IdentifierStart + IdentifierPart + '*$', 'u')).test(item);
|
|
443
453
|
}
|
|
444
454
|
|
|
@@ -462,7 +472,7 @@ function isValidKeyPathString (keyPathString) {
|
|
|
462
472
|
function isValidKeyPath (keyPath) {
|
|
463
473
|
return isValidKeyPathString(keyPath) || (
|
|
464
474
|
Array.isArray(keyPath) && Boolean(keyPath.length) &&
|
|
465
|
-
// Convert array from sparse to dense
|
|
475
|
+
// Convert array from sparse to dense https://www.2ality.com/2012/06/dense-arrays.html
|
|
466
476
|
// See also https://heycam.github.io/webidl/#idl-DOMString
|
|
467
477
|
[...keyPath].every((pathComponent) => {
|
|
468
478
|
return isValidKeyPathString(pathComponent);
|
|
@@ -547,6 +557,56 @@ function isNullish (v) {
|
|
|
547
557
|
return v === null || v === undefined;
|
|
548
558
|
}
|
|
549
559
|
|
|
560
|
+
/**
|
|
561
|
+
* Cursor/request continuation chains can call each other synchronously
|
|
562
|
+
* (e.g. walking a large prefetched buffer, or advancing many interleaved
|
|
563
|
+
* cursors in one transaction) which, for large enough record counts, can
|
|
564
|
+
* exceed the JS engine's call stack ("Maximum call stack size exceeded").
|
|
565
|
+
*
|
|
566
|
+
* This can't be fixed by deferring continuations to a microtask/macrotask:
|
|
567
|
+
* the transaction machinery synchronously checks (once the current call
|
|
568
|
+
* stack unwinds) whether there are any pending requests left in order to
|
|
569
|
+
* decide it's safe to commit; deferring a continuation opens a real gap in
|
|
570
|
+
* which that check runs first and the transaction completes prematurely,
|
|
571
|
+
* with the deferred continuation then acting on an already-finished
|
|
572
|
+
* transaction (a hang, since it can never resolve).
|
|
573
|
+
*
|
|
574
|
+
* Instead, this implements a true trampoline: the first call starts a
|
|
575
|
+
* synchronous work queue and drains it in a flat loop; any call made while
|
|
576
|
+
* already draining (i.e. a continuation triggering another continuation)
|
|
577
|
+
* is simply appended to that same queue and returns immediately instead of
|
|
578
|
+
* recursing. This keeps everything synchronous (so no completion-check
|
|
579
|
+
* race is introduced) while preventing the call stack from growing with
|
|
580
|
+
* each successive continuation.
|
|
581
|
+
*/
|
|
582
|
+
const continuationState = {
|
|
583
|
+
/** @type {Array<() => void>|null} */
|
|
584
|
+
queue: null
|
|
585
|
+
};
|
|
586
|
+
|
|
587
|
+
/**
|
|
588
|
+
* @param {() => void} fn
|
|
589
|
+
* @returns {void}
|
|
590
|
+
*/
|
|
591
|
+
function runContinuationSafely (fn) {
|
|
592
|
+
if (continuationState.queue) {
|
|
593
|
+
continuationState.queue.push(fn);
|
|
594
|
+
return;
|
|
595
|
+
}
|
|
596
|
+
const queue = [fn];
|
|
597
|
+
continuationState.queue = queue;
|
|
598
|
+
try {
|
|
599
|
+
while (queue.length) {
|
|
600
|
+
const next = /** @type {() => void} */ (queue.shift());
|
|
601
|
+
next();
|
|
602
|
+
}
|
|
603
|
+
} finally {
|
|
604
|
+
// Ensure a thrown exception can't leave the queue permanently
|
|
605
|
+
// stuck (which would silently swallow all future continuations).
|
|
606
|
+
continuationState.queue = null;
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
|
|
550
610
|
export {escapeSQLiteStatement, unescapeSQLiteResponse,
|
|
551
611
|
escapeDatabaseNameForSQLAndFiles, unescapeDatabaseNameForSQLAndFiles,
|
|
552
612
|
escapeStoreNameForSQL, escapeIndexNameForSQL, escapeIndexNameForSQLKeyColumn,
|
|
@@ -557,4 +617,4 @@ export {escapeSQLiteStatement, unescapeSQLiteResponse,
|
|
|
557
617
|
defineListenerProperties, defineReadonlyProperties,
|
|
558
618
|
isValidKeyPath, enforceRange,
|
|
559
619
|
convertToDOMString, convertToSequenceDOMString,
|
|
560
|
-
isNullish};
|
|
620
|
+
isNullish, runContinuationSafely};
|