UNPKG

13.1 kBSource Map (JSON)View Raw
1{"version":3,"sources":["Object.observe.ion"],"names":["clone",{"type":"Identifier","name":"clone","loc":{"start":{"line":2,"column":6,"fixed":true,"source":"ion/es6/Object.observe.ion"},"end":{"line":2,"column":11,"fixed":true,"source":"ion/es6/Object.observe.ion"}}},"object","properties","key","value","createShim","map","Map","observe","callback","property","meta","get","all","callbacks","set","push","unobserve","remove","length","delete","getChanges","oldValue","newValue","changes","change","type","name","checkForChange","constructor","Object","hasOwnProperty","oldPropertyValue","newPropertyValue","is","checkForChanges","maxCycles","i","totalChanges","pendingChanges","forEach","slice","Error","test","a","b","c","d","handler","JSON","stringify","global","console","warn"],"mappings":"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","sourcesContent":["\nconst clone = (object, properties) ->\n if properties?\n return {}\n for key of properties\n [key]: object[key]\n else\n return {}\n for key, value of object\n [key]: value\n\nexport const createShim = ->\n # multiple callbacks on same object.\n let map = new Map()\n\n let observe = (object, callback, property) ->\n # console.log('+observe', property)\n let meta = map.get(object)\n if not meta?\n meta =\n object: object\n properties: {}\n all: 0\n clone: clone(object, property ? {[property]:0} : null)\n callbacks: []\n map.set(object, meta)\n if property?\n meta.properties[property] ?= 0\n meta.properties[property]++\n else\n meta.all++\n meta.callbacks.push(callback)\n let unobserve = (object, callback, property) ->\n # console.log('-unobserve', object, callback)\n let meta = map.get(object)\n if meta?\n meta.callbacks.remove(callback)\n if meta.callbacks.length is 0\n # remove no longer observed objects\n map.delete(object)\n if property?\n meta.properties[property]--\n if meta.properties[property] is 0\n delete meta.properties[property]\n else\n meta.all--\n\n let getChanges = (oldValue, newValue, properties) ->\n let changes = null\n let change = (type, name, oldValue, object) ->\n changes ?= []\n changes.push({type,name,oldValue,object})\n # console.log('change', type, name)\n let checkForChange = (property) ->\n # we only check add/delete on plain old javascript objects\n if newValue.constructor is Object\n if oldValue.hasOwnProperty(name)\n let oldPropertyValue = oldValue[name]\n if not newValue.hasOwnProperty(name)\n if oldPropertyValue isnt undefined\n change(\"delete\", name, oldPropertyValue, newValue)\n else\n let newPropertyValue = newValue[name]\n # must use Object.is because NaN != NaN\n if not Object.is(newPropertyValue, oldPropertyValue)\n change(\"update\", name, oldPropertyValue, newValue)\n else if newValue.hasOwnProperty(name)\n change(\"add\", name, undefined, newValue)\n else\n # for everything else, we only check current property values\n let oldPropertyValue = oldValue[name]\n let newPropertyValue = newValue[name]\n # must use Object.is because NaN != NaN\n if not Object.is(newPropertyValue, oldPropertyValue)\n change(\"update\", name, oldPropertyValue, newValue)\n\n if properties?\n for name of properties\n checkForChange(name)\n else\n for name of oldValue\n checkForChange(name)\n for name of newValue\n if not oldValue.hasOwnProperty(name)\n checkForChange(name)\n return changes\n observe.checkForChanges = ->\n let maxCycles = 10\n # we have to run multiple cycles in case callbacks cause further change propagation\n for let i = 0; i < maxCycles; i++\n let totalChanges = 0\n let pendingChanges = []\n # traverse all objects and find changes\n map.forEach(\n (meta, key) ->\n let properties = meta.all > 0 ? null : meta.properties\n let changes = getChanges(meta.clone, meta.object, properties)\n if changes?\n totalChanges++\n meta.clone = clone(meta.object, properties)\n # callbacks must be deferred until after ALL changes have been found\n pendingChanges.push([changes, meta.callbacks.slice(0), meta])\n )\n if totalChanges is 0\n return\n for [changes, callbacks] in pendingChanges\n # console.log(i, changes)\n for callback in callbacks\n callback(changes)\n\n # we have hit max cycles, indicates a circular dependency error\n throw new Error(\"Circular Object.observe dependency\")\n\n return {observe,unobserve}\n\nexport const test = ->\n let {observe,unobserve} = createShim()\n let object =\n a: 1\n b:\n c: 2\n d: 3\n let changes\n let handler = (c) ->\n changes = c\n observe(object, handler)\n object.a = 2\n delete object.b\n object.c = 5\n observe.checkForChanges()\n assert JSON.stringify(changes) is JSON.stringify([{\"type\":\"update\",\"name\":\"a\",\"oldValue\":1,\"object\":{\"a\":2,\"c\":5}},{\"type\":\"delete\",\"name\":\"b\",\"oldValue\":{\"c\":2,\"d\":3},\"object\":{\"a\":2,\"c\":5}},{\"type\":\"add\",\"name\":\"c\",\"object\":{\"a\":2,\"c\":5}}])\n unobserve(object, handler)\n\nif not Object.observe? and global.Map?\n console.warn('Shimming Object.observe')\n for key, value of createShim()\n Object[key] = value\n"]}
\No newline at end of file