{"version":3,"sources":["../../src/app/extractFunctions.ts"],"sourcesContent":["import * as esprima from 'esprima';\n\ntype ParsedFunction = {\n    outer_function: Function\n    inner_functions: { name: string; fn: Function }[];\n};\n\nfunction extractFunctions(code: string): ParsedFunction {\n    const ast = esprima.parseScript(code, { range: true });\n    let outer = '';\n    const inner: { name: string; fn: string }[] = [];\n\nfor (const node of ast.body) {\n    if (node.type === 'FunctionDeclaration' && node.id?.name === 'hello') {\n        // Get outer function source code\n        const [start, end] = node.range!;\n        const outerSource = code.slice(start, end);\n\n        // Filter out inner functions from the body\n        const innerRanges: [number, number][] = [];\n\n        for (const stmt of node.body.body) {\n            if (stmt.type === 'FunctionDeclaration') {\n                const innerCode = code.slice(stmt.range![0], stmt.range![1]);\n                inner.push({ name: stmt.id!.name, fn: innerCode });\n                innerRanges.push([stmt.range![0], stmt.range![1]]);\n            }\n\n            // Variable declarations like: let fn = function(...) { ... }\n            if (\n                stmt.type === 'VariableDeclaration'\n            ) {\n                for (const decl of stmt.declarations) {\n                    if (\n                        decl.init &&\n                        (decl.init.type === 'FunctionExpression' ||\n                         decl.init.type === 'ArrowFunctionExpression')\n                    ) {\n                        const fnName = (decl.id as any).name;\n                        const fnCode = code.slice(stmt.range![0], stmt.range![1]);\n\n                        // Convert to \"function name(args) { ... }\" format\n                        const args = decl.init.params.map((p) => code.slice(p.range![0], p.range![1])).join(', ');\n                        const bodyCode = code.slice(decl.init.body.range![0], decl.init.body.range![1]);\n                        const formattedFn = `function ${fnName}(${args}) ${bodyCode}`;\n\n                        inner.push({ name: fnName, fn: formattedFn });\n                        innerRanges.push([stmt.range![0], stmt.range![1]]);\n                    }\n                }\n            }\n        }\n\n        // Remove inner function code from outer function body\n        let cleanedBody = code.slice(node.body.range![0] + 1, node.body.range![1] - 1);\n        for (const [start, end] of innerRanges) {\n            const innerCode = code.slice(start, end);\n            cleanedBody = cleanedBody.replace(innerCode, '');\n        }\n\n        outer = `${code.slice(node.range![0], node.body.range![0] + 1)}${cleanedBody}\\n}`;\n}\n}\n    // create the functions objects\n    let outer_function = new Function(outer);\n    let inner_functions = inner.map((fn) => ({ name: fn.name, fn: new Function(fn.fn) }));\n    // return\n    return { outer_function, inner_functions };\n}\n\n\n\nexport default extractFunctions;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAyB;AAOzB,SAAS,iBAAiB,MAA8B;AACpD,QAAM,MAAM,QAAQ,YAAY,MAAM,EAAE,OAAO,KAAK,CAAC;AACrD,MAAI,QAAQ;AACZ,QAAM,QAAwC,CAAC;AAEnD,aAAW,QAAQ,IAAI,MAAM;AACzB,QAAI,KAAK,SAAS,yBAAyB,KAAK,IAAI,SAAS,SAAS;AAElE,YAAM,CAAC,OAAO,GAAG,IAAI,KAAK;AAC1B,YAAM,cAAc,KAAK,MAAM,OAAO,GAAG;AAGzC,YAAM,cAAkC,CAAC;AAEzC,iBAAW,QAAQ,KAAK,KAAK,MAAM;AAC/B,YAAI,KAAK,SAAS,uBAAuB;AACrC,gBAAM,YAAY,KAAK,MAAM,KAAK,MAAO,CAAC,GAAG,KAAK,MAAO,CAAC,CAAC;AAC3D,gBAAM,KAAK,EAAE,MAAM,KAAK,GAAI,MAAM,IAAI,UAAU,CAAC;AACjD,sBAAY,KAAK,CAAC,KAAK,MAAO,CAAC,GAAG,KAAK,MAAO,CAAC,CAAC,CAAC;AAAA,QACrD;AAGA,YACI,KAAK,SAAS,uBAChB;AACE,qBAAW,QAAQ,KAAK,cAAc;AAClC,gBACI,KAAK,SACJ,KAAK,KAAK,SAAS,wBACnB,KAAK,KAAK,SAAS,4BACtB;AACE,oBAAM,SAAU,KAAK,GAAW;AAChC,oBAAM,SAAS,KAAK,MAAM,KAAK,MAAO,CAAC,GAAG,KAAK,MAAO,CAAC,CAAC;AAGxD,oBAAM,OAAO,KAAK,KAAK,OAAO,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,MAAO,CAAC,GAAG,EAAE,MAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI;AACxF,oBAAM,WAAW,KAAK,MAAM,KAAK,KAAK,KAAK,MAAO,CAAC,GAAG,KAAK,KAAK,KAAK,MAAO,CAAC,CAAC;AAC9E,oBAAM,cAAc,YAAY,MAAM,IAAI,IAAI,KAAK,QAAQ;AAE3D,oBAAM,KAAK,EAAE,MAAM,QAAQ,IAAI,YAAY,CAAC;AAC5C,0BAAY,KAAK,CAAC,KAAK,MAAO,CAAC,GAAG,KAAK,MAAO,CAAC,CAAC,CAAC;AAAA,YACrD;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAGA,UAAI,cAAc,KAAK,MAAM,KAAK,KAAK,MAAO,CAAC,IAAI,GAAG,KAAK,KAAK,MAAO,CAAC,IAAI,CAAC;AAC7E,iBAAW,CAACA,QAAOC,IAAG,KAAK,aAAa;AACpC,cAAM,YAAY,KAAK,MAAMD,QAAOC,IAAG;AACvC,sBAAc,YAAY,QAAQ,WAAW,EAAE;AAAA,MACnD;AAEA,cAAQ,GAAG,KAAK,MAAM,KAAK,MAAO,CAAC,GAAG,KAAK,KAAK,MAAO,CAAC,IAAI,CAAC,CAAC,GAAG,WAAW;AAAA;AAAA,IACpF;AAAA,EACA;AAEI,MAAI,iBAAiB,IAAI,SAAS,KAAK;AACvC,MAAI,kBAAkB,MAAM,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,IAAI,IAAI,SAAS,GAAG,EAAE,EAAE,EAAE;AAEpF,SAAO,EAAE,gBAAgB,gBAAgB;AAC7C;AAIA,IAAO,2BAAQ;","names":["start","end"]}