{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-tom/demos/tom/ASTTraverser.js"],"names":["excludedProperties","visitorMethodNames","ASTTraverser","constructor","config","shouldStop","name","traverse","astNode","type","onCurrentNode","keys","Object","filter","key","includes","value","Array","isArray","onArray","onEmpty","onFunction","onObject","onPrimitive"],"mappings":";;;;;;;;AAAA,kBAAMA,qBAAqB,CAAC,KAAD,EAAQ,KAAR,EAAe,OAAf,EAAwB,SAAxB,EAAmC,MAAnC,CAA3B;;;;;;;;;;;;;;AACA,kBAAMC,qBAAqB,CAAC,eAAD,EAAkB,SAAlB,EAA6B,SAA7B,EAAwC,YAAxC,EAAsD,UAAtD,EAAkE,aAAlE,CAA3B;;;;;;;;;;;;;;;AAEe,kBAAMC,YAAN,CAAmB;AAC9BC,4BAAYC,MAAZ,EAAoB;AAChB,yBAAKC,UAAL,GAAkB,KAAlB;;AAEA,yBAAK,MAAMC,IAAX,IAAmBL,kBAAnB,EAAuC;AACnC,6BAAKK,IAAL,IAAaF,OAAOE,IAAP,KAAgB,YAAU,CAAE,CAAzC;AACH;AACJ;;AAEDC,yBAASC,OAAT,EAAkB;AACd;AACA,wBAAIA,WAAWA,QAAQC,IAAvB,EAA6B;AACzB,6BAAKC,aAAL,CAAmBF,OAAnB;;AAEA,8BAAMG,OAAOC,OAAOD,IAAP,CAAYH,OAAZ,EAAqBK,MAArB,CAA4BC,OAAO,CAACd,mBAAmBe,QAAnB,CAA4BD,GAA5B,CAApC,CAAb;AACA,6BAAK,MAAMA,GAAX,IAAkBH,IAAlB,EAAwB;AACpB,gCAAG,KAAKN,UAAR,EAAoB;AAChB;AACH;;AAED,kCAAMW,QAAQR,QAAQM,GAAR,CAAd;;AAGA,gCAAIG,MAAMC,OAAN,CAAcF,KAAd,CAAJ,EAA0B;AACtB,qCAAKG,OAAL,CAAaH,KAAb,EAAoBR,OAApB,EAA6BM,GAA7B;AACA;AACH;;AAED,gCAAIE,UAAU,IAAd,EAAoB;AAChB,qCAAKI,OAAL,CAAaJ,KAAb,EAAoBR,OAApB,EAA6BM,GAA7B;AACA;AACH;;AAED,oCAAQ,OAAOE,KAAf;AACI,qCAAK,UAAL;AACI,yCAAKK,UAAL,CAAgBL,KAAhB,EAAuBR,OAAvB,EAAgCM,GAAhC;AACA;AACJ,qCAAK,QAAL;AACI,yCAAKQ,QAAL,CAAcN,KAAd,EAAqBR,OAArB,EAA8BM,GAA9B;AACA;AACJ;AACI,yCAAKS,WAAL,CAAiBP,KAAjB,EAAwBR,OAAxB,EAAiCM,GAAjC;AARR;AAUH;AACJ;AACJ;AA7C6B;;+BAAbZ,Y","file":"ASTTraverser.js","sourcesContent":["const excludedProperties = ['end', 'loc', 'start', 'traceID', 'type'];\nconst visitorMethodNames = ['onCurrentNode', 'onArray', 'onEmpty', 'onFunction', 'onObject', 'onPrimitive'];\n\nexport default class ASTTraverser {\n    constructor(config) {\n        this.shouldStop = false;\n        \n        for (const name of visitorMethodNames) {\n            this[name] = config[name] || function(){};\n        }\n    }\n\n    traverse(astNode) {\n        // simply check if the object is an astNode\n        if (astNode && astNode.type) {\n            this.onCurrentNode(astNode);\n\n            const keys = Object.keys(astNode).filter(key => !excludedProperties.includes(key));\n            for (const key of keys) {\n                if(this.shouldStop) {\n                    return;\n                }\n                \n                const value = astNode[key];\n\n\n                if (Array.isArray(value)) {\n                    this.onArray(value, astNode, key);\n                    continue;\n                }\n\n                if (value === null) {\n                    this.onEmpty(value, astNode, key);\n                    continue;\n                }\n\n                switch (typeof value) {\n                    case 'function':\n                        this.onFunction(value, astNode, key);\n                        break;\n                    case 'object':\n                        this.onObject(value, astNode, key);\n                        // fallthrough as we want to know when a node gets replaced\n                    default:\n                        this.onPrimitive(value, astNode, key);\n                }\n            }\n        }\n    }\n}\n"]}