@hanseltime/swc-plugin-node-globals-inject
v1.0.0
Published
Transform plugin for js/ts projects that use node globals like __dirname and __filename and want to compile to esm
Readme
node_globals_inject plugin
This plugin supports commonjs -> esm syntax for commonjs node constants like __filename and __dirname.
In effect, this plugin will add the following declarations to any file where we find __filename or __dirname.
import { fileURLToPath } from "url"
import { dirname } from "path"
const __dirname = dirname(fileURLToPath(import.meta.url))
const __filename = fileURLToPath(import.meta.url)Usage
Configuration
plugins: [
[
"@swc/plugin-relay",
{
// Optional - This will change how we do function imports (only change this is you need to avoid name collisions from the default - see below)
"funcAliasPrefix": "__from_plugin_",
},
],
],Design Details
This plugin will:
- Scan each file to determine if
__dirnameor__filenameare used in the file - For files with those usages, it will inject the necessary library imports and const declations:
Examples of injection
- If both
dirnameandfileURLToPathare imported, it will inject the declarations right after the last importimport something from 'something'; import { fileURLToPath } from 'url'; import else from 'else'; import { dirname } from 'path'; // Injected here const __dirname = dirname(fileURLToPath(import.meta.url)) const __filename = fileURLToPath(import.meta.url) - If only 1 function is imported, it will inject an aliased import of the other function and then the declarations after that import
import something from 'something'; import { fileURLToPath } from 'url'; // injected here import { dirname as __swc_shim_dirname } from 'path'; const __dirname = __swc_shim_dirname(fileURLToPath(import.meta.url)) const __filename = fileURLToPath(import.meta.url) import else from 'else'; - If star imports (
* as foo from 'path') are used, it will use the star object notation and just inject the declarationsimport something from 'something'; import * as url from 'url'; import else from 'else'; import { dirname } from 'path'; // Injected here const __dirname = dirname(url.fileURLToPath(import.meta.url)) const __filename = url.fileURLToPath(import.meta.url) - If no imports already exists, it will inject aliased imports and then the declarations
// Injected here import { dirname as __swc_shim_dirname } from 'path'; import { fileURLToPath as __swc_shim_fileURLToPath } from 'path'; const __dirname = __swc_shim_dirname(__swc_shim_fileURLToPath(import.meta.url)) const __filename = __swc_shim_fileURLToPath(import.meta.url) import something from 'something'; import else from 'else';
