es-module-traversal

Traverse the ES module graph

Usage no npm install needed!

<script type="module">
  import esModuleTraversal from 'https://cdn.skypack.dev/es-module-traversal';
</script>

README

es-module-traversal

Gather all imported files from some ES modules entrypoints,

You can also customize the resolver and read functions to traverse the import graph from a static server

npm install es-module-traversal

Benchmarks

Run the benchmarks with the yarn test:bench command

It traverses the graph of 780 modules in about 0.30 seconds, most of the time is spent by es-module-lexer (this means that the time will increase with the size of the javascript modules)

It takes about 5 seconds to traverse the graph of a big typescript app with 3900 files of 30 lines each, the overhead here is given by the time vite takes to transform the typescript files

Example

import path from 'path'
import { traverseEsModules } from 'es-module-traversal'

const res = await traverseEsModules({
    entryPoints: [path.resolve(__dirname, __filename)],
    onEntry: (path) => {
        console.log('traversed ' + path)
    },
})

console.log(res)
// [{
//     importPath: './someImport',
//     resolvedImportPath: '/path/to/file',
//     importer: '/path/to/importer'
// }, ...]

Fetching from a static server

// customize resolution to use a server instead of disk
import path from 'path'
import {
    traverseEsModules,
    urlResolver,
    readFromUrlOrPath,
} from 'es-module-traversal'

const port = '3000'
const res = await traverseEsModules({
    entryPoint: `http://localhost:${port}/main.tsx`,
    // like require.resolve but support urls and paths
    resolver: urlResolver({
        root: __dirname,
        baseUrl: `http://localhost:${port}/`,
    }),
    onEntry: (path) => {
        console.log('traversed ' + path)
    },
})
console.log(JSON.stringify(res, null, 4))

// [
//     {
//         importPath: '/firstLevel.js',
//         importer: 'http://localhost:9000/deep/file.js',
//         resolvedImportPath: 'http://localhost:9000/firstLevel.js',
//     },
//     ...
// ]