(
node: JavaScriptNode,
{id, path, params, mode, resolveImport, resolveFile}: TranspileOptions
)
| 29 | } |
| 30 | |
| 31 | export function transpileJavaScript( |
| 32 | node: JavaScriptNode, |
| 33 | {id, path, params, mode, resolveImport, resolveFile}: TranspileOptions |
| 34 | ): string { |
| 35 | let async = node.async; |
| 36 | const inputs = Array.from(new Set<string>(node.references.map((r) => r.name))); |
| 37 | const outputs = Array.from(new Set<string>(node.declarations?.map((r) => r.name))); |
| 38 | const display = node.expression && !inputs.includes("display") && !inputs.includes("view"); |
| 39 | if (display) inputs.push("display"), (async = true); |
| 40 | if (hasImportDeclaration(node.body)) async = true; |
| 41 | const output = new Sourcemap(node.input).trim(); |
| 42 | if (params) rewriteParams(output, node.body, params, node.input); |
| 43 | rewriteImportDeclarations(output, node.body, resolveImport); |
| 44 | rewriteImportExpressions(output, node.body, resolveImport, resolveFile); |
| 45 | rewriteFileExpressions(output, node.files, path); |
| 46 | if (display) output.insertLeft(0, "display(await(\n").insertRight(node.input.length, "\n))"); |
| 47 | output.insertLeft(0, `, body: ${async ? "async " : ""}(${inputs}) => {\n`); |
| 48 | if (outputs.length) output.insertLeft(0, `, outputs: ${JSON.stringify(outputs)}`); |
| 49 | if (inputs.length) output.insertLeft(0, `, inputs: ${JSON.stringify(inputs)}`); |
| 50 | if (mode && mode !== "block") output.insertLeft(0, `, mode: ${JSON.stringify(mode)}`); |
| 51 | output.insertLeft(0, `define({id: ${JSON.stringify(id)}`); |
| 52 | if (outputs.length) output.insertRight(node.input.length, `\nreturn {${outputs}};`); |
| 53 | output.insertRight(node.input.length, "\n}});\n"); |
| 54 | return String(output); |
| 55 | } |
| 56 | |
| 57 | export interface TranspileModuleOptions { |
| 58 | root: string; |
nothing calls this directly
no test coverage detected