1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 | 2× 982× 982× 982× 2896× 2896× 2896× 982× 2× 68× 68× 68× 66× 66× 66× 68× 2× 2982× 2982× 246× 2736× 2× 2734× 2× 2732× 2732× 1946× 786× 10× 776× 776× 2× 774× 250× 524× 264× 260× 2× 3701× 3693× 3693× 13761× 3701× 2× 6× 6× 6× 6× 2× 13761× 13761× 1370× 12391× 8233× 4158× 6× 4152× 1388× 2764× 6× 2758× 1376× 1382× 1382× | /** * @flow */ import DocumentReference from '../DocumentReference'; import { DOCUMENT_ID } from '../FieldPath'; import { DELETE_FIELD_VALUE, SERVER_TIMESTAMP_FIELD_VALUE, } from '../FieldValue'; import GeoPoint from '../GeoPoint'; import Path from '../Path'; import { typeOf } from '../../../utils'; import type Firestore from '../'; import type { NativeTypeMap } from '../types'; /* * Functions that build up the data needed to represent * the different types available within Firestore * for transmission to the native side */ export const buildNativeMap = (data: Object): { [string]: NativeTypeMap } => { const nativeData = {}; Eif (data) { Object.keys(data).forEach(key => { const typeMap = buildTypeMap(data[key]); Eif (typeMap) { nativeData[key] = typeMap; } }); } return nativeData; }; export const buildNativeArray = (array: Object[]): NativeTypeMap[] => { const nativeArray = []; Eif (array) { array.forEach(value => { const typeMap = buildTypeMap(value); Eif (typeMap) { nativeArray.push(typeMap); } }); } return nativeArray; }; export const buildTypeMap = (value: any): NativeTypeMap | null => { const type = typeOf(value); if (value === null || value === undefined || Number.isNaN(value)) { return { type: 'null', value: null, }; } else if (value === DELETE_FIELD_VALUE) { return { type: 'fieldvalue', value: 'delete', }; } else if (value === SERVER_TIMESTAMP_FIELD_VALUE) { return { type: 'fieldvalue', value: 'timestamp', }; } else Iif (value === DOCUMENT_ID) { return { type: 'documentid', value: null, }; } else if (type === 'boolean' || type === 'number' || type === 'string') { return { type, value, }; } else if (type === 'array') { return { type, value: buildNativeArray(value), }; } else Eif (type === 'object') { if (value instanceof DocumentReference) { return { type: 'reference', value: value.path, }; } else if (value instanceof GeoPoint) { return { type: 'geopoint', value: { latitude: value.latitude, longitude: value.longitude, }, }; } else if (value instanceof Date) { return { type: 'date', value: value.getTime(), }; } return { type: 'object', value: buildNativeMap(value), }; } console.warn(`Unknown data type received ${type}`); return null; }; /* * Functions that parse the received from the native * side and converts to the correct Firestore JS types */ export const parseNativeMap = ( firestore: Firestore, nativeData: { [string]: NativeTypeMap } ): Object | void => { let data; if (nativeData) { data = {}; Object.keys(nativeData).forEach(key => { data[key] = parseTypeMap(firestore, nativeData[key]); }); } return data; }; const parseNativeArray = ( firestore: Firestore, nativeArray: NativeTypeMap[] ): any[] => { const array = []; Eif (nativeArray) { nativeArray.forEach(typeMap => { array.push(parseTypeMap(firestore, typeMap)); }); } return array; }; const parseTypeMap = (firestore: Firestore, typeMap: NativeTypeMap): any => { const { type, value } = typeMap; if (type === 'null') { return null; } else if (type === 'boolean' || type === 'number' || type === 'string') { return value; } else if (type === 'array') { return parseNativeArray(firestore, value); } else if (type === 'object') { return parseNativeMap(firestore, value); } else if (type === 'reference') { return new DocumentReference(firestore, Path.fromName(value)); } else if (type === 'geopoint') { return new GeoPoint(value.latitude, value.longitude); } else Eif (type === 'date') { return new Date(value); } console.warn(`Unknown data type received ${type}`); return value; }; |