UNPKG

slavery-js

Version:

A simple clustering app that allows you to scale an application on multiple thread, containers or machines

1 lines 4.82 kB
{"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"]}