Press n or j to go to the next uncovered block, b, p or k for the previous block.
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 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | /** * API Serialization for Coherent.js * @fileoverview Utilities for serializing complex data types */ /** * Serialize a Date object to ISO string * @param {Date} date - Date to serialize * @returns {string} ISO date string */ function serializeDate(date) { if (!(date instanceof Date)) { throw new Error('Expected Date object'); } return date.toISOString(); } /** * Deserialize an ISO date string to Date object * @param {string} dateString - ISO date string * @returns {Date} Date object */ function deserializeDate(dateString) { const date = new Date(dateString); if (isNaN(date.getTime())) { throw new Error('Invalid date string'); } return date; } /** * Serialize a Map to plain object * @param {Map} map - Map to serialize * @returns {Object} Plain object */ function serializeMap(map) { if (!(map instanceof Map)) { throw new Error('Expected Map object'); } const obj = {}; for (const [key, value] of map) { obj[key] = value; } return obj; } /** * Deserialize a plain object to Map * @param {Object} obj - Plain object * @returns {Map} Map object */ function deserializeMap(obj) { if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) { throw new Error('Expected plain object'); } return new Map(Object.entries(obj)); } /** * Serialize a Set to array * @param {Set} set - Set to serialize * @returns {Array} Array */ function serializeSet(set) { if (!(set instanceof Set)) { throw new Error('Expected Set object'); } return Array.from(set); } /** * Deserialize an array to Set * @param {Array} arr - Array * @returns {Set} Set object */ function deserializeSet(arr) { if (!Array.isArray(arr)) { throw new Error('Expected array'); } return new Set(arr); } /** * Create serialization middleware * @param {Object} options - Serialization options * @param {boolean} [options.enableDate=true] - Include Date helpers * @param {boolean} [options.enableMap=true] - Include Map helpers * @param {boolean} [options.enableSet=true] - Include Set helpers * @param {Object} [options.custom] - Custom serializer/deserializer overrides * @param {(d: Date) => any} [options.custom.serializeDate] * @param {(v: any) => Date} [options.custom.deserializeDate] * @param {(m: Map) => any} [options.custom.serializeMap] * @param {(v: any) => Map} [options.custom.deserializeMap] * @param {(s: Set) => any} [options.custom.serializeSet] * @param {(v: any) => Set} [options.custom.deserializeSet] * @returns {Function} Middleware function */ function withSerialization(options = {}) { const { enableDate = true, enableMap = true, enableSet = true, custom = {} } = options; return (req, res, next) => { // Build serialization helpers, honoring options/custom overrides res.serialize = {}; req.deserialize = {}; if (enableDate) { res.serialize.date = custom.serializeDate || serializeDate; req.deserialize.date = custom.deserializeDate || deserializeDate; } if (enableMap) { res.serialize.map = custom.serializeMap || serializeMap; req.deserialize.map = custom.deserializeMap || deserializeMap; } if (enableSet) { res.serialize.set = custom.serializeSet || serializeSet; req.deserialize.set = custom.deserializeSet || deserializeSet; } next(); }; } /** * Serialize complex data for JSON * @param {any} data - Data to serialize * @returns {any} Serialized data */ function serializeForJSON(data) { if (data instanceof Date) { return serializeDate(data); } if (data instanceof Map) { return serializeMap(data); } if (data instanceof Set) { return serializeSet(data); } if (Array.isArray(data)) { return data.map(item => serializeForJSON(item)); } if (typeof data === 'object' && data !== null) { const serialized = {}; for (const [key, value] of Object.entries(data)) { serialized[key] = serializeForJSON(value); } return serialized; } return data; } // Export serialization utilities export { serializeDate, deserializeDate, serializeMap, deserializeMap, serializeSet, deserializeSet, withSerialization, serializeForJSON }; export default { serializeDate, deserializeDate, serializeMap, deserializeMap, serializeSet, deserializeSet, withSerialization, serializeForJSON }; |