{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-tom/demos/tom/wrapAST.js"],"names":["Trace","copyAndWrapUnkownSubtree","wrapAST","wrapCurrentASTNode","wrappedArray","createObservingAccessorsOn","excludedProperties","object","propertyName","observer","newPropertyName","Object","defineProperty","get","set","value","notify","traceID","handler","nodeID","key","obj","prop","Number","isInteger","parseInt","Reflect","array","Proxy","astNode","window","traceIdentifierName","createTraceID","keys","filter","includes","Array","isArray","onlyUnknownNodes","type","entry"],"mappings":"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","file":"wrapAST.js","sourcesContent":["import Trace from 'demos/tom/trace.js';\nimport copyAndWrapUnkownSubtree from 'demos/tom/copyAST.js';\n\nexport const excludedProperties = ['end', 'loc', 'start', 'traceID', 'type'];\n\nfunction createObservingAccessorsOn(object, propertyName, observer) {\n    const newPropertyName = '_' + propertyName;\n    object[newPropertyName] = object[propertyName];\n    Object.defineProperty(object, propertyName, {\n        get() { return object[newPropertyName]; },\n        set(value) {\n            observer.notify(object.traceID, \n                            propertyName, \n                            copyAndWrapUnkownSubtree(object[newPropertyName], observer), \n                            copyAndWrapUnkownSubtree(value, observer));\n            object[newPropertyName] = value;\n        }\n    })\n}\n\nconst handler = (nodeID, observer, key) => {\n    return {\n        set: function(obj, prop, value) {\n            // notify only on array entry change\n            if (Number.isInteger(Number.parseInt(prop))) {\n                observer.notify(nodeID, \n                                prop, \n                                copyAndWrapUnkownSubtree(obj[prop], observer), \n                                copyAndWrapUnkownSubtree(value, observer), \n                                key);\n            }\n            \n            return Reflect.set(obj, prop, value);\n        }\n    }\n};\n\nfunction wrappedArray(array, nodeID, observer, key) {\n    return new Proxy(array, handler(nodeID, observer, key));\n}\n\n\n// Wraps only the current ASTNode so the observer gets notified if\n// changes are applied to it. Ignores children of ASTNode\nexport function wrapCurrentASTNode(astNode, observer) {\n    if (astNode.traceID) {\n        return;\n    } else {\n        astNode.traceID = window[Trace.traceIdentifierName].createTraceID();\n    }\n\n    const keys = Object.keys(astNode).filter(key => !excludedProperties.includes(key));\n    for (const key of keys) {\n        const value = astNode[key];\n\n\n        if (Array.isArray(value)) {\n            astNode[key] = wrappedArray(value, astNode.traceID, observer, key);\n\n            // notify if the array is replaced\n            createObservingAccessorsOn(astNode, key, observer);\n\n            continue;\n        }\n\n        if (!value) {\n            createObservingAccessorsOn(astNode, key, observer);\n            continue;\n        }\n\n        switch (typeof value) {\n            case 'function':\n                // ignore functions\n                break;\n            default:\n                createObservingAccessorsOn(astNode, key, observer);\n        }\n    }\n}\n\n// Wraps the current ASTNode and all its children so the observer gets notified if\n// changes are applied to it\nexport default function wrapAST(astNode, observer, onlyUnknownNodes) {\n    // simply check if the object is an astNode\n    if (astNode && astNode.type) {\n        if (onlyUnknownNodes) {\n            if (astNode.traceID) {\n                return;\n            } else {\n                astNode.traceID = window[Trace.traceIdentifierName].createTraceID();\n            }\n        }\n\n        const keys = Object.keys(astNode).filter(key => !excludedProperties.includes(key));\n        for (const key of keys) {\n            const value = astNode[key];\n\n\n            if (Array.isArray(value)) {\n                for (const entry of value) {\n                    wrapAST(entry, observer, onlyUnknownNodes);\n                }\n\n                astNode[key] = wrappedArray(value, astNode.traceID, observer, key);\n\n                // notify if the array is replaced\n                createObservingAccessorsOn(astNode, key, observer);\n\n                continue;\n            }\n\n            if (!value) {\n                createObservingAccessorsOn(astNode, key, observer);\n                continue;\n            }\n\n            switch (typeof value) {\n                case 'function':\n                    // ignore functions\n                    break;\n                case 'object':\n                    // assume it is an astNode\n                    wrapAST(value, observer, onlyUnknownNodes);\n                    // fallthrough as we want to know if a node is replaced\n                default:\n                    createObservingAccessorsOn(astNode, key, observer);\n            }\n        }\n    }\n}\n"]}