Files
file-node/src/repl.ts
ashley zomo 832cecfe76 v1.1.0
translated to typescript and added .ts file support
2022-06-14 12:13:28 -05:00

53 lines
1.5 KiB
TypeScript

import * as repl from 'repl'
import { Context, createContext, runInContext } from 'vm'
import { readInput, SupportedLoader } from './build'
import { logv } from './util'
export function runRepl(
context: Context,
loader: SupportedLoader,
exported?: string[]
) {
if (exported) {
console.log(`Exports: ${exported.join(', ')}`)
}
console.log(`REPL Loader: ${loader.toUpperCase()}`)
const r = repl
.start({
useGlobal: true,
eval: (cmd, context, _filename, callback) => {
//add async wrapper
// context.__FILE_NODE__INTERNAL__ = callback
// cmd = `(async () => {
// ${cmd}
// })()`
let js = readInput(cmd, loader)
logv(`Transformed: ${js}`)
try {
let val = runInContext(js, context)
callback(null, val)
} catch (e) {
if (e instanceof Error) {
callback(e, null)
} else {
callback(new Error((e as any).toString()), null)
}
}
},
})
.on('close', () => process.exit(0))
Object.keys(context).forEach(key =>
Object.defineProperty(r.context, key, {
configurable: false,
enumerable: true,
value: context[key],
})
)
createContext(r.context)
}