1.0.1 • Published 2 years ago

estree-util-module-to-function v1.0.1

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

estree-util-module-to-function

github actions npm codecov prettier

Convert an estree module into a function body.

Installation

npm install estree-util-module-to-function

Usage

Typically you’ll get an AST from acorn, then process it.

import { parse } from 'acorn'
import { moduleToFunction } from 'estree-util-module-to-function'

const ast = parse(source, { ecmaVersion: 'latest', sourceType: 'module' })
moduleToFunction(ast)

console.dir(ast)

API

This module exports a single function named moduleToFunction.

moduleToFunction(ast, options?)

Convert an estree module into a function body. This modifies the input AST.

Options

  • importName: A custom name for the import. By default, import() expressions are used. If this option is given, import expressions and import meta properties are transformed into identifiers using this name. (type: string)

Examples

The following example shows how to read the home directory in Node.js by using ESM code from a string.

import { parse } from 'acorn'
import { generate } from 'astring'
import { moduleToFunction } from 'estree-util-module-to-function'

const AsyncFunction = Object.getPrototypeOf(async () => {}).constructor

const source = `
import { readdir } from 'fs/promises'
import { homedir } from 'os'

const home = homedir()
export default home
export const files = await readdir(homedir())
`

const ast = parse(source, { ecmaVersion: 'latest', sourceType: 'module' })
moduleToFunction(ast)
const transformed = generate(ast)
const fn = new AsyncFunction(transformed)

const result = await fn()
console.dir(result)

The following example is derived from the above. It injects a custom import function, which stubs actual import behaviour.

import { parse } from 'acorn'
import { generate } from 'astring'
import { moduleToFunction } from 'estree-util-module-to-function'

const AsyncFunction = Object.getPrototypeOf(async () => {}).constructor

function customImport(name) {
  if (name === 'fs/promises') {
    return {
      readdir: () => ['foo.txt'],
    }
  }
  if (name === 'os') {
    return {
      homedir: () => '/home/fakeuser',
    }
  }
}

const source = `
import { readdir } from 'fs/promises'
import { homedir } from 'os'

const home = homedir()
export default home
export const files = await readdir(homedir())
`

const importName = '__import__'
const ast = parse(source, { ecmaVersion: 'latest', sourceType: 'module' })
moduleToFunction(ast, { importName })
const transformed = generate(ast)
const fn = new AsyncFunction(importName, transformed)

const result = await fn(customImport)
console.dir(result)

Security

Warning This package only transforms the AST input, which is safe to use on its own. However, it was created with the use case in mind to evaluate an ECMASscript module. Evaluating user input is dangerous and should be avoided whenever possible.

License

MIT @ Remco Haszing