@react-native-firebase/app 20.0.0 → 20.2.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/CHANGELOG.md +26 -0
- package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseVersion.java +1 -1
- package/ios/RNFBApp/RNFBVersion.m +1 -1
- package/lib/common/index.js +2 -0
- package/lib/index.d.ts +1 -0
- package/lib/internal/RNFBNativeEventEmitter.js +31 -6
- package/lib/internal/nativeModule.android.js +2 -0
- package/lib/internal/nativeModule.ios.js +2 -0
- package/lib/internal/nativeModule.js +4 -0
- package/lib/internal/nativeModuleAndroidIos.js +45 -0
- package/lib/internal/nativeModuleWeb.js +48 -0
- package/lib/internal/registry/app.js +2 -1
- package/lib/internal/registry/nativeModule.js +11 -15
- package/lib/internal/web/RNFBAppModule.js +266 -0
- package/lib/internal/web/firebaseApp.js +3 -0
- package/lib/internal/web/firebaseAppCheck.js +6 -0
- package/lib/internal/web/firebaseAuth.js +4 -0
- package/lib/internal/web/firebaseDatabase.js +4 -0
- package/lib/internal/web/firebaseFirestore.js +4 -0
- package/lib/internal/web/firebaseFunctions.js +4 -0
- package/lib/internal/web/firebaseInstallations.js +6 -0
- package/lib/internal/web/firebaseRemoteConfig.js +6 -0
- package/lib/internal/web/firebaseStorage.js +4 -0
- package/lib/internal/web/memidb/FDBCursor.js +503 -0
- package/lib/internal/web/memidb/FDBCursorWithValue.js +11 -0
- package/lib/internal/web/memidb/FDBDatabase.js +172 -0
- package/lib/internal/web/memidb/FDBFactory.js +256 -0
- package/lib/internal/web/memidb/FDBIndex.js +187 -0
- package/lib/internal/web/memidb/FDBKeyRange.js +71 -0
- package/lib/internal/web/memidb/FDBObjectStore.js +411 -0
- package/lib/internal/web/memidb/FDBOpenDBRequest.js +9 -0
- package/lib/internal/web/memidb/FDBRequest.js +33 -0
- package/lib/internal/web/memidb/FDBTransaction.js +216 -0
- package/lib/internal/web/memidb/FDBVersionChangeEvent.js +12 -0
- package/lib/internal/web/memidb/LICENSE +208 -0
- package/lib/internal/web/memidb/index.js +39 -0
- package/lib/internal/web/memidb/lib/Database.js +32 -0
- package/lib/internal/web/memidb/lib/FakeDOMStringList.js +72 -0
- package/lib/internal/web/memidb/lib/FakeEvent.js +38 -0
- package/lib/internal/web/memidb/lib/FakeEventTarget.js +110 -0
- package/lib/internal/web/memidb/lib/Index.js +157 -0
- package/lib/internal/web/memidb/lib/KeyGenerator.js +22 -0
- package/lib/internal/web/memidb/lib/ObjectStore.js +172 -0
- package/lib/internal/web/memidb/lib/RecordStore.js +141 -0
- package/lib/internal/web/memidb/lib/binarySearch.js +78 -0
- package/lib/internal/web/memidb/lib/canInjectKey.js +25 -0
- package/lib/internal/web/memidb/lib/cmp.js +77 -0
- package/lib/internal/web/memidb/lib/enforceRange.js +13 -0
- package/lib/internal/web/memidb/lib/errors.js +69 -0
- package/lib/internal/web/memidb/lib/extractKey.js +39 -0
- package/lib/internal/web/memidb/lib/scheduling.js +30 -0
- package/lib/internal/web/memidb/lib/types.js +1 -0
- package/lib/internal/web/memidb/lib/validateKeyPath.js +54 -0
- package/lib/internal/web/memidb/lib/valueToKey.js +62 -0
- package/lib/internal/web/memidb/lib/valueToKeyRange.js +19 -0
- package/lib/internal/web/structuredClone/index.js +222 -0
- package/lib/internal/web/utils.js +35 -0
- package/lib/utils/UtilsStatics.js +3 -2
- package/lib/version.js +1 -1
- package/package.json +9 -8
@@ -0,0 +1,54 @@
|
|
1
|
+
// http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#dfn-valid-key-path
|
2
|
+
const validateKeyPath = (keyPath, parent) => {
|
3
|
+
// This doesn't make sense to me based on the spec, but it is needed to pass the W3C KeyPath tests (see same
|
4
|
+
// comment in extractKey)
|
5
|
+
if (
|
6
|
+
keyPath !== undefined &&
|
7
|
+
keyPath !== null &&
|
8
|
+
typeof keyPath !== 'string' &&
|
9
|
+
keyPath.toString &&
|
10
|
+
(parent === 'array' || !Array.isArray(keyPath))
|
11
|
+
) {
|
12
|
+
keyPath = keyPath.toString();
|
13
|
+
}
|
14
|
+
if (typeof keyPath === 'string') {
|
15
|
+
if (keyPath === '' && parent !== 'string') {
|
16
|
+
return;
|
17
|
+
}
|
18
|
+
try {
|
19
|
+
// https://mathiasbynens.be/demo/javascript-identifier-regex for ECMAScript 5.1 / Unicode v7.0.0, with
|
20
|
+
// reserved words at beginning removed
|
21
|
+
const validIdentifierRegex =
|
22
|
+
// eslint-disable-next-line no-misleading-character-class
|
23
|
+
/^(?:[$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-\u08B2\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\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\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\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-\u13F4\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\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\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\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\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\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\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-\uAB5F\uAB64\uAB65\uABC0-\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])(?:[$0-9A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\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-\u08B2\u08E4-\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\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\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\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\u0D57\u0D60-\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\u1380-\u138F\u13A0-\u13F4\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-\u19D9\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\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\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\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\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\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA69D\uA69F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\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-\uAB5F\uAB64\uAB65\uABC0-\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-\uFE2D\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])*$/;
|
24
|
+
if (keyPath.length >= 1 && validIdentifierRegex.test(keyPath)) {
|
25
|
+
return;
|
26
|
+
}
|
27
|
+
} catch (err) {
|
28
|
+
throw new SyntaxError(err.message);
|
29
|
+
}
|
30
|
+
if (keyPath.indexOf(' ') >= 0) {
|
31
|
+
throw new SyntaxError(
|
32
|
+
'The keypath argument contains an invalid key path (no spaces allowed).',
|
33
|
+
);
|
34
|
+
}
|
35
|
+
}
|
36
|
+
if (Array.isArray(keyPath) && keyPath.length > 0) {
|
37
|
+
if (parent) {
|
38
|
+
// No nested arrays
|
39
|
+
throw new SyntaxError('The keypath argument contains an invalid key path (nested arrays).');
|
40
|
+
}
|
41
|
+
for (const part of keyPath) {
|
42
|
+
validateKeyPath(part, 'array');
|
43
|
+
}
|
44
|
+
return;
|
45
|
+
} else if (typeof keyPath === 'string' && keyPath.indexOf('.') >= 0) {
|
46
|
+
keyPath = keyPath.split('.');
|
47
|
+
for (const part of keyPath) {
|
48
|
+
validateKeyPath(part, 'string');
|
49
|
+
}
|
50
|
+
return;
|
51
|
+
}
|
52
|
+
throw new SyntaxError();
|
53
|
+
};
|
54
|
+
export default validateKeyPath;
|
@@ -0,0 +1,62 @@
|
|
1
|
+
import { DataError } from './errors.js';
|
2
|
+
// https://w3c.github.io/IndexedDB/#convert-value-to-key
|
3
|
+
const valueToKey = (input, seen) => {
|
4
|
+
if (typeof input === 'number') {
|
5
|
+
if (isNaN(input)) {
|
6
|
+
throw new DataError();
|
7
|
+
}
|
8
|
+
return input;
|
9
|
+
} else if (Object.prototype.toString.call(input) === '[object Date]') {
|
10
|
+
const ms = input.valueOf();
|
11
|
+
if (isNaN(ms)) {
|
12
|
+
throw new DataError();
|
13
|
+
}
|
14
|
+
return new Date(ms);
|
15
|
+
} else if (typeof input === 'string') {
|
16
|
+
return input;
|
17
|
+
} else if (
|
18
|
+
input instanceof ArrayBuffer ||
|
19
|
+
(typeof SharedArrayBuffer !== 'undefined' && input instanceof SharedArrayBuffer) ||
|
20
|
+
(typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView && ArrayBuffer.isView(input))
|
21
|
+
) {
|
22
|
+
let arrayBuffer;
|
23
|
+
let offset = 0;
|
24
|
+
let length = 0;
|
25
|
+
if (
|
26
|
+
input instanceof ArrayBuffer ||
|
27
|
+
(typeof SharedArrayBuffer !== 'undefined' && input instanceof SharedArrayBuffer)
|
28
|
+
) {
|
29
|
+
arrayBuffer = input;
|
30
|
+
length = input.byteLength;
|
31
|
+
} else {
|
32
|
+
arrayBuffer = input.buffer;
|
33
|
+
offset = input.byteOffset;
|
34
|
+
length = input.byteLength;
|
35
|
+
}
|
36
|
+
if (arrayBuffer.detached) {
|
37
|
+
return new ArrayBuffer(0);
|
38
|
+
}
|
39
|
+
return arrayBuffer.slice(offset, offset + length);
|
40
|
+
} else if (Array.isArray(input)) {
|
41
|
+
if (seen === undefined) {
|
42
|
+
seen = new Set();
|
43
|
+
} else if (seen.has(input)) {
|
44
|
+
throw new DataError();
|
45
|
+
}
|
46
|
+
seen.add(input);
|
47
|
+
const keys = [];
|
48
|
+
for (let i = 0; i < input.length; i++) {
|
49
|
+
const hop = Object.hasOwn(input, i);
|
50
|
+
if (!hop) {
|
51
|
+
throw new DataError();
|
52
|
+
}
|
53
|
+
const entry = input[i];
|
54
|
+
const key = valueToKey(entry, seen);
|
55
|
+
keys.push(key);
|
56
|
+
}
|
57
|
+
return keys;
|
58
|
+
} else {
|
59
|
+
throw new DataError();
|
60
|
+
}
|
61
|
+
};
|
62
|
+
export default valueToKey;
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import FDBKeyRange from '../FDBKeyRange.js';
|
2
|
+
import { DataError } from './errors.js';
|
3
|
+
import valueToKey from './valueToKey.js';
|
4
|
+
|
5
|
+
// http://w3c.github.io/IndexedDB/#convert-a-value-to-a-key-range
|
6
|
+
const valueToKeyRange = (value, nullDisallowedFlag = false) => {
|
7
|
+
if (value instanceof FDBKeyRange) {
|
8
|
+
return value;
|
9
|
+
}
|
10
|
+
if (value === null || value === undefined) {
|
11
|
+
if (nullDisallowedFlag) {
|
12
|
+
throw new DataError();
|
13
|
+
}
|
14
|
+
return new FDBKeyRange(undefined, undefined, false, false);
|
15
|
+
}
|
16
|
+
const key = valueToKey(value);
|
17
|
+
return FDBKeyRange.only(key);
|
18
|
+
};
|
19
|
+
export default valueToKeyRange;
|
@@ -0,0 +1,222 @@
|
|
1
|
+
const VOID = -1;
|
2
|
+
const PRIMITIVE = 0;
|
3
|
+
const ARRAY = 1;
|
4
|
+
const OBJECT = 2;
|
5
|
+
const DATE = 3;
|
6
|
+
const REGEXP = 4;
|
7
|
+
const MAP = 5;
|
8
|
+
const SET = 6;
|
9
|
+
const ERROR = 7;
|
10
|
+
const BIGINT = 8;
|
11
|
+
|
12
|
+
const env = typeof self === 'object' ? self : globalThis;
|
13
|
+
|
14
|
+
const deserializer = ($, _) => {
|
15
|
+
const as = (out, index) => {
|
16
|
+
$.set(index, out);
|
17
|
+
return out;
|
18
|
+
};
|
19
|
+
|
20
|
+
const unpair = index => {
|
21
|
+
if ($.has(index)) return $.get(index);
|
22
|
+
|
23
|
+
const [type, value] = _[index];
|
24
|
+
switch (type) {
|
25
|
+
case PRIMITIVE:
|
26
|
+
case VOID:
|
27
|
+
return as(value, index);
|
28
|
+
case ARRAY: {
|
29
|
+
const arr = as([], index);
|
30
|
+
for (const index of value) arr.push(unpair(index));
|
31
|
+
return arr;
|
32
|
+
}
|
33
|
+
case OBJECT: {
|
34
|
+
const object = as({}, index);
|
35
|
+
for (const [key, index] of value) object[unpair(key)] = unpair(index);
|
36
|
+
return object;
|
37
|
+
}
|
38
|
+
case DATE:
|
39
|
+
return as(new Date(value), index);
|
40
|
+
case REGEXP: {
|
41
|
+
const { source, flags } = value;
|
42
|
+
return as(new RegExp(source, flags), index);
|
43
|
+
}
|
44
|
+
case MAP: {
|
45
|
+
const map = as(new Map(), index);
|
46
|
+
for (const [key, index] of value) map.set(unpair(key), unpair(index));
|
47
|
+
return map;
|
48
|
+
}
|
49
|
+
case SET: {
|
50
|
+
const set = as(new Set(), index);
|
51
|
+
for (const index of value) set.add(unpair(index));
|
52
|
+
return set;
|
53
|
+
}
|
54
|
+
case ERROR: {
|
55
|
+
const { name, message } = value;
|
56
|
+
return as(new env[name](message), index);
|
57
|
+
}
|
58
|
+
case BIGINT:
|
59
|
+
return as(BigInt(value), index);
|
60
|
+
case 'BigInt':
|
61
|
+
return as(Object(BigInt(value)), index);
|
62
|
+
}
|
63
|
+
return as(new env[type](value), index);
|
64
|
+
};
|
65
|
+
|
66
|
+
return unpair;
|
67
|
+
};
|
68
|
+
|
69
|
+
/**
|
70
|
+
* @typedef {Array<string,any>} Record a type representation
|
71
|
+
*/
|
72
|
+
|
73
|
+
/**
|
74
|
+
* Returns a deserialized value from a serialized array of Records.
|
75
|
+
* @param {Record[]} serialized a previously serialized value.
|
76
|
+
* @returns {any}
|
77
|
+
*/
|
78
|
+
const deserialize = serialized => deserializer(new Map(), serialized)(0);
|
79
|
+
|
80
|
+
const EMPTY = '';
|
81
|
+
|
82
|
+
const { toString } = {};
|
83
|
+
const { keys } = Object;
|
84
|
+
|
85
|
+
const typeOf = value => {
|
86
|
+
const type = typeof value;
|
87
|
+
if (type !== 'object' || !value) return [PRIMITIVE, type];
|
88
|
+
|
89
|
+
const asString = toString.call(value).slice(8, -1);
|
90
|
+
switch (asString) {
|
91
|
+
case 'Array':
|
92
|
+
return [ARRAY, EMPTY];
|
93
|
+
case 'Object':
|
94
|
+
return [OBJECT, EMPTY];
|
95
|
+
case 'Date':
|
96
|
+
return [DATE, EMPTY];
|
97
|
+
case 'RegExp':
|
98
|
+
return [REGEXP, EMPTY];
|
99
|
+
case 'Map':
|
100
|
+
return [MAP, EMPTY];
|
101
|
+
case 'Set':
|
102
|
+
return [SET, EMPTY];
|
103
|
+
}
|
104
|
+
|
105
|
+
if (asString.includes('Array')) return [ARRAY, asString];
|
106
|
+
|
107
|
+
if (asString.includes('Error')) return [ERROR, asString];
|
108
|
+
|
109
|
+
return [OBJECT, asString];
|
110
|
+
};
|
111
|
+
|
112
|
+
const shouldSkip = ([TYPE, type]) =>
|
113
|
+
TYPE === PRIMITIVE && (type === 'function' || type === 'symbol');
|
114
|
+
|
115
|
+
const serializer = (strict, json, $, _) => {
|
116
|
+
const as = (out, value) => {
|
117
|
+
const index = _.push(out) - 1;
|
118
|
+
$.set(value, index);
|
119
|
+
return index;
|
120
|
+
};
|
121
|
+
|
122
|
+
const pair = value => {
|
123
|
+
if ($.has(value)) return $.get(value);
|
124
|
+
|
125
|
+
let [TYPE, type] = typeOf(value);
|
126
|
+
switch (TYPE) {
|
127
|
+
case PRIMITIVE: {
|
128
|
+
let entry = value;
|
129
|
+
switch (type) {
|
130
|
+
case 'bigint':
|
131
|
+
TYPE = BIGINT;
|
132
|
+
entry = value.toString();
|
133
|
+
break;
|
134
|
+
case 'function':
|
135
|
+
case 'symbol':
|
136
|
+
if (strict) throw new TypeError('unable to serialize ' + type);
|
137
|
+
entry = null;
|
138
|
+
break;
|
139
|
+
case 'undefined':
|
140
|
+
return as([VOID], value);
|
141
|
+
}
|
142
|
+
return as([TYPE, entry], value);
|
143
|
+
}
|
144
|
+
case ARRAY: {
|
145
|
+
if (type) return as([type, [...value]], value);
|
146
|
+
|
147
|
+
const arr = [];
|
148
|
+
const index = as([TYPE, arr], value);
|
149
|
+
for (const entry of value) arr.push(pair(entry));
|
150
|
+
return index;
|
151
|
+
}
|
152
|
+
case OBJECT: {
|
153
|
+
if (type) {
|
154
|
+
switch (type) {
|
155
|
+
case 'BigInt':
|
156
|
+
return as([type, value.toString()], value);
|
157
|
+
case 'Boolean':
|
158
|
+
case 'Number':
|
159
|
+
case 'String':
|
160
|
+
return as([type, value.valueOf()], value);
|
161
|
+
}
|
162
|
+
}
|
163
|
+
|
164
|
+
if (json && 'toJSON' in value) return pair(value.toJSON());
|
165
|
+
|
166
|
+
const entries = [];
|
167
|
+
const index = as([TYPE, entries], value);
|
168
|
+
for (const key of keys(value)) {
|
169
|
+
if (strict || !shouldSkip(typeOf(value[key])))
|
170
|
+
entries.push([pair(key), pair(value[key])]);
|
171
|
+
}
|
172
|
+
return index;
|
173
|
+
}
|
174
|
+
case DATE:
|
175
|
+
return as([TYPE, value.toISOString()], value);
|
176
|
+
case REGEXP: {
|
177
|
+
const { source, flags } = value;
|
178
|
+
return as([TYPE, { source, flags }], value);
|
179
|
+
}
|
180
|
+
case MAP: {
|
181
|
+
const entries = [];
|
182
|
+
const index = as([TYPE, entries], value);
|
183
|
+
for (const [key, entry] of value) {
|
184
|
+
if (strict || !(shouldSkip(typeOf(key)) || shouldSkip(typeOf(entry))))
|
185
|
+
entries.push([pair(key), pair(entry)]);
|
186
|
+
}
|
187
|
+
return index;
|
188
|
+
}
|
189
|
+
case SET: {
|
190
|
+
const entries = [];
|
191
|
+
const index = as([TYPE, entries], value);
|
192
|
+
for (const entry of value) {
|
193
|
+
if (strict || !shouldSkip(typeOf(entry))) entries.push(pair(entry));
|
194
|
+
}
|
195
|
+
return index;
|
196
|
+
}
|
197
|
+
}
|
198
|
+
|
199
|
+
const { message } = value;
|
200
|
+
return as([TYPE, { name: type, message }], value);
|
201
|
+
};
|
202
|
+
|
203
|
+
return pair;
|
204
|
+
};
|
205
|
+
|
206
|
+
function serialize(value, { json, lossy } = {}) {
|
207
|
+
const _ = [];
|
208
|
+
return serializer(!(json || lossy), !!json, new Map(), _)(value), _;
|
209
|
+
}
|
210
|
+
|
211
|
+
let sCloneAvailable = false;
|
212
|
+
export function makeStructuredCloneAvailable() {
|
213
|
+
if (sCloneAvailable) {
|
214
|
+
return;
|
215
|
+
}
|
216
|
+
if (!global.window) {
|
217
|
+
global.window = {};
|
218
|
+
}
|
219
|
+
if (!window.structuredClone) {
|
220
|
+
window.structuredClone = (any, options) => deserialize(serialize(any, options));
|
221
|
+
}
|
222
|
+
}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
import { DeviceEventEmitter } from 'react-native';
|
2
|
+
|
3
|
+
// A general purpose guard function to catch errors and return a structured error object.
|
4
|
+
export function guard(fn) {
|
5
|
+
return fn().catch(e => Promise.reject(getWebError(e)));
|
6
|
+
}
|
7
|
+
|
8
|
+
// Converts a thrown error to a structured error object
|
9
|
+
// required by RNFirebase native module internals.
|
10
|
+
export function getWebError(error) {
|
11
|
+
const obj = {
|
12
|
+
code: error.code || 'unknown',
|
13
|
+
message: error.message,
|
14
|
+
};
|
15
|
+
|
16
|
+
// Some modules send codes as PERMISSION_DENIED, which is not
|
17
|
+
// the same as the Firebase error code format.
|
18
|
+
obj.code = obj.code.toLowerCase();
|
19
|
+
// Replace _ with - in code
|
20
|
+
obj.code = obj.code.replace(/_/g, '-');
|
21
|
+
|
22
|
+
// Split out prefix, since we internally prefix all error codes already.
|
23
|
+
if (obj.code.includes('/')) {
|
24
|
+
obj.code = obj.code.split('/')[1];
|
25
|
+
}
|
26
|
+
|
27
|
+
return {
|
28
|
+
...obj,
|
29
|
+
userInfo: obj,
|
30
|
+
};
|
31
|
+
}
|
32
|
+
|
33
|
+
export function emitEvent(eventName, event) {
|
34
|
+
setImmediate(() => DeviceEventEmitter.emit('rnfb_' + eventName, event));
|
35
|
+
}
|
@@ -17,7 +17,7 @@
|
|
17
17
|
*/
|
18
18
|
|
19
19
|
import { NativeModules } from 'react-native';
|
20
|
-
import { stripTrailingSlash } from '../../lib/common';
|
20
|
+
import { stripTrailingSlash, isOther } from '../../lib/common';
|
21
21
|
|
22
22
|
const PATH_NAMES = [
|
23
23
|
'MAIN_BUNDLE',
|
@@ -60,6 +60,7 @@ function processPathConstants(nativeModule) {
|
|
60
60
|
export default {
|
61
61
|
SDK_VERSION: require('./../version'),
|
62
62
|
get FilePath() {
|
63
|
-
|
63
|
+
// We don't support path constants on non-native platforms.
|
64
|
+
return processPathConstants(isOther ? {} : NativeModules.RNFBUtilsModule);
|
64
65
|
},
|
65
66
|
};
|
package/lib/version.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
// Generated by genversion.
|
2
|
-
module.exports = '20.
|
2
|
+
module.exports = '20.2.0';
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@react-native-firebase/app",
|
3
|
-
"version": "20.
|
3
|
+
"version": "20.2.0",
|
4
4
|
"author": "Invertase <oss@invertase.io> (http://invertase.io)",
|
5
5
|
"description": "A well tested, feature rich Firebase implementation for React Native, supporting iOS & Android. Individual module support for Admob, Analytics, Auth, Crash Reporting, Cloud Firestore, Database, Dynamic Links, Functions, Messaging (FCM), Remote Config, Storage and more.",
|
6
6
|
"main": "lib/index.js",
|
@@ -57,11 +57,12 @@
|
|
57
57
|
"react-native": "*"
|
58
58
|
},
|
59
59
|
"dependencies": {
|
60
|
+
"firebase": "10.12.2",
|
60
61
|
"opencollective-postinstall": "^2.0.3",
|
61
62
|
"superstruct": "^0.6.2"
|
62
63
|
},
|
63
64
|
"devDependencies": {
|
64
|
-
"expo": "^50.0.
|
65
|
+
"expo": "^50.0.19"
|
65
66
|
},
|
66
67
|
"peerDependenciesMeta": {
|
67
68
|
"expo": {
|
@@ -73,7 +74,7 @@
|
|
73
74
|
},
|
74
75
|
"sdkVersions": {
|
75
76
|
"ios": {
|
76
|
-
"firebase": "10.
|
77
|
+
"firebase": "10.29.0",
|
77
78
|
"iosTarget": "11.0",
|
78
79
|
"macosTarget": "10.13"
|
79
80
|
},
|
@@ -81,12 +82,12 @@
|
|
81
82
|
"minSdk": 21,
|
82
83
|
"targetSdk": 34,
|
83
84
|
"compileSdk": 34,
|
84
|
-
"firebase": "33.
|
85
|
-
"firebaseCrashlyticsGradle": "3.0.
|
85
|
+
"firebase": "33.1.2",
|
86
|
+
"firebaseCrashlyticsGradle": "3.0.2",
|
86
87
|
"firebasePerfGradle": "1.4.2",
|
87
|
-
"gmsGoogleServicesGradle": "4.4.
|
88
|
-
"playServicesAuth": "21.
|
88
|
+
"gmsGoogleServicesGradle": "4.4.2",
|
89
|
+
"playServicesAuth": "21.2.0"
|
89
90
|
}
|
90
91
|
},
|
91
|
-
"gitHead": "
|
92
|
+
"gitHead": "82c50138d07e673213cd8dee5ce9a2f9b5656649"
|
92
93
|
}
|