{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-tom/demos/tom/Events.js"],"names":["excludedProperties","Event","constructor","type","data","position","changes","hasChanges","__type__","addChange","changeEvent","push","apply","ast","change","visit","object","visitEvent","ErrorEvent","arguments","visitErrorEvent","ASTChangeEvent","id","propertyName","oldValue","newValue","objectID","getNode","astNode","isSearchedNode","value","traceID","undefined","nodeID","keys","Object","filter","key","includes","Array","isArray","entry","node","resolve","copy","isTraceID","result","arrayProperty","visitASTChangeEvent","eventTypes"],"mappings":"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","file":"Events.js","sourcesContent":["const excludedProperties = ['end', 'loc', 'start', 'traceID', 'type'];\n\nexport class Event {\n    constructor(type, data, position) {\n        this.type = type;\n        this.position = position;\n        this.data = data;\n\n        this.changes = [];\n        this.hasChanges = false;\n\n        this.__type__ = 'Event';\n    }\n\n    addChange(changeEvent) {\n        this.hasChanges = true;\n        this.changes.push(changeEvent);\n    }\n\n    apply(ast) {\n        for (const change of this.changes) {\n            change.apply(ast);\n        }\n    }\n\n    visit(object) {\n        object.visitEvent(this);\n    }\n}\n\nexport class ErrorEvent extends Event {\n    constructor() {\n        super(...arguments);\n        this.__type__ = 'ErrorEvent';\n    }\n    \n    visit(object) {\n        object.visitErrorEvent(this);\n    }\n}\n\nexport class ASTChangeEvent {\n    constructor(id, propertyName, oldValue, newValue) {\n        this.type = 'astChangeEvent';\n        this.objectID = id;\n        this.propertyName = propertyName;\n        this.oldValue = oldValue;\n        this.newValue = newValue;\n\n        this.__type__ = 'ASTChangeEvent';\n    }\n\n    getNode(id, astNode) {\n        if (astNode && astNode.type) {\n            const isSearchedNode = value => value && value.traceID !== undefined && value.traceID.nodeID === id.nodeID;\n\n            if (isSearchedNode(astNode)) {\n                return astNode;\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                        const node = this.getNode(id, entry)\n                        if (isSearchedNode(node)) {\n                            return node;\n                        }\n                    }\n\n                    continue;\n                }\n\n                if (!value) {\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                        const node = this.getNode(id, value)\n                        if (isSearchedNode(node)) {\n                            return node;\n                        }\n                        break;\n                    default:\n                        // ignore value\n                }\n            }\n        }\n    }\n    \n    resolve(copy, ast) {\n        if (!copy) {\n            return copy;\n        }\n        \n        // Todo: optimize by caching: traceID -> ASTNode\n        if(copy.isTraceID) {\n            return this.getNode(copy, ast);\n        } else if(Array.isArray(copy)) {\n            const result = [];\n            for(const entry of copy) {\n                result.push(this.resolve(entry, ast));\n            }\n            return result;\n        } else if(copy.traceID) { // is astNode\n            const result = {};\n            \n            for(const key in copy) {\n                // do not expand the reference of the object itself\n                if(key === 'traceID') {\n                    result[key] = copy[key];\n                    continue;\n                }\n                result[key] = this.resolve(copy[key], ast);\n            }\n            \n            return result;\n        } else {\n            return copy;\n        }\n    }\n\n    apply(ast) {\n        let astNode = this.getNode(this.objectID, ast);\n        if (this.arrayProperty) {\n            astNode = astNode[this.arrayProperty];\n        }\n        astNode[this.propertyName] = this.resolve(this.newValue, ast);\n    }\n\n    visit(object) {\n        object.visitASTChangeEvent(this);\n    }\n}\n\nexport const eventTypes = {\n    ASTChangeEvent: ASTChangeEvent,\n    Event: Event,\n    ErrorEvent: ErrorEvent\n};"]}