From 7bf64b6586633d9354b782328a45738babfdf9fa Mon Sep 17 00:00:00 2001 From: Orion Reed Date: Mon, 2 Dec 2024 17:14:51 -0500 Subject: [PATCH] log property access from function body for from/to --- package.json | 3 ++- src/folk-event-propagator.ts | 43 ++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 48fe33b..6548770 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "preview": "vite build && vite preview" }, "dependencies": { + "@babel/parser": "^7.26.2", "leaflet": "^1.9.4", "perfect-arrows": "^0.3.7", "perfect-freehand": "^1.2.2" @@ -19,4 +20,4 @@ "typescript": "^5.7.2", "vite": "^6.0.0" } -} +} \ No newline at end of file diff --git a/src/folk-event-propagator.ts b/src/folk-event-propagator.ts index 6bac363..2079e5e 100644 --- a/src/folk-event-propagator.ts +++ b/src/folk-event-propagator.ts @@ -1,5 +1,6 @@ import { css } from './common/tags.ts'; import { FolkRope } from './folk-rope.ts'; +import * as parser from '@babel/parser'; const styles = new CSSStyleSheet(); styles.replaceSync(css` @@ -90,6 +91,8 @@ export class FolkEventPropagator extends FolkRope { const functionBody = codeLines.join('\n'); try { + parseAst(functionBody); + this.#function = new Function('from', 'to', 'event', functionBody); } catch (error) { console.warn('Failed to parse expression:', error, functionBody); @@ -208,3 +211,43 @@ export class FolkEventPropagator extends FolkRope { } }; } + +function parseAst(functionBody: string) { + const ast = parser.parse(functionBody, { + sourceType: 'script', + }); + + const toProps = new Set(); + const fromProps = new Set(); + + function walkAst(node: any) { + if (!node || typeof node !== 'object') return; + + if (node.type === 'MemberExpression' && node.object?.type === 'Identifier') { + const objName = node.object.name; + if (objName !== 'to' && objName !== 'from') return; + + const propSet = objName === 'to' ? toProps : fromProps; + + if (node.property?.type === 'Identifier') { + propSet.add(node.property.name); + } else if (node.property?.type === 'StringLiteral') { + propSet.add(node.property.value); + } + } + + // Recursively walk through all properties + for (const key in node) { + if (Array.isArray(node[key])) { + node[key].forEach(walkAst); + } else if (node[key] && typeof node[key] === 'object') { + walkAst(node[key]); + } + } + } + + walkAst(ast); + + console.log('Properties accessed on to:', Array.from(toProps)); + console.log('Properties accessed on from:', Array.from(fromProps)); +}