esbuild plugin that imports modules based on wildcard patterns.
Attempts to improve upon the ergonomics of esbuild-plugin-import-glob.
Install the dependency:
npm install esbuild-plugin-import-pattern --save-devConfigure esbuild:
const esbuild = require('esbuild')
const { importPatternPlugin } = require('esbuild-plugin-import-pattern')
esbuild.build({
...
bundle: true,
plugins: [importPatternPlugin()]
})Import something using a wildcard pattern:
import { entries } from './files/*.js'
console.log(entries)This will produce an array of tuples, each containing the path to an imported file and its exports:
[
['./files/one.js', { // Source:
default: 'one' // export default 'one'
}],
['./files/two.js', { // Source:
default: 2, // export default 2
noun: 'two' // export const noun = 'two'
}],
...
]If you're only interested in the exports, import modules instead of entries.
Similarly, you can choose to import paths.
If you want to look modules up by their path, you can feed entries directly
into Object.fromEntries(entries) or new Map(entries).
To use multiple imports in the same module, be sure to rename them using the
as keyword:
import { entries as cats } from './cats/*.js'
import { entries as dogs } from './dogs/*.js'Other than *, you can also use any pattern supported by
fast-glob. However, the pattern needs
to contain at least one * character.
By default, each matching import will expose all of its exports. Currently, this makes esbuild produce some unnecessary code. If bundle size is a concern, you will want to avoid this.
As long as all imports export the same name(s), you can tell the plugin to only import those. You do this by appending a hash symbol to the pattern, followed by the names, separated by commas.
For example, to only get the default exports from files/*.js, you would write:
import { modules } from './files/*.js#default'
console.log('Default exports:', modules.map((module) => module.default))Note that omitting #default will not change the behavior of this script.
However, the generated bundle will be bigger.
MIT