esm-loader-import-alias
Advanced tools
Comparing version
import createLoader from 'create-esm-loader'; | ||
import escape from 'escape-string-regexp'; | ||
import esquery from 'esquery'; | ||
import { generate } from 'astring'; | ||
import { parse } from 'meriyah'; | ||
const NAME = 'esm-loader-import-alias'; | ||
const importTypes = [ | ||
'ImportDeclaration', | ||
'ExportAllDeclaration', | ||
'ExportNamedDeclaration', | ||
]; | ||
const parseOpts = { module: true, next: true, webcompat: true }; | ||
// create-esm-loader config | ||
@@ -8,26 +16,20 @@ const config = { | ||
const { url, aliases } = options; | ||
let sourceStr = String(source); | ||
const aliasKeys = Object.keys(aliases || {}); | ||
const sourceStr = String(source); | ||
if (!aliases || | ||
!Object.keys(aliases).some((before) => sourceStr.includes(before))) | ||
!aliasKeys.some((alias) => sourceStr.includes(alias))) | ||
return undefined; | ||
if (options.debug) | ||
console.log(`[${NAME}] transform: ${url}`); | ||
// @TODO use AST to be safer | ||
for (const [before, after] of Object.entries(aliases)) { | ||
const imports = [ | ||
...[ | ||
...sourceStr.matchAll(new RegExp(`import .*['"\`](${escape(before)}).*?['"\`]`, 'g')), | ||
], | ||
...[ | ||
...sourceStr.matchAll(new RegExp(`export .*from.*['"\`](${escape(before)}).*?['"\`]`, 'g')), | ||
], | ||
]; | ||
imports.forEach((statement) => { | ||
if (!sourceStr.includes(statement[0])) | ||
return; | ||
const reImport = statement[0].replace(statement[1], after); | ||
sourceStr = sourceStr.replace(statement[0], reImport); | ||
const ast = parse(sourceStr, parseOpts); | ||
const imports = esquery(ast, `:matches(${importTypes.join(',')})`); | ||
imports.forEach((importer) => { | ||
const value = importer.source.value; | ||
aliasKeys.forEach((alias) => { | ||
if (value.includes(alias)) | ||
importer.source.value = value.replace(alias, aliases[alias]); | ||
}); | ||
} | ||
return { source: sourceStr }; | ||
}); | ||
const newSource = generate(ast); | ||
return { source: newSource }; | ||
}, | ||
@@ -34,0 +36,0 @@ }; |
{ | ||
"name": "esm-loader-import-alias", | ||
"version": "1.0.2", | ||
"version": "1.0.3", | ||
"description": "Chainable ESModule Loader for import path aliases", | ||
@@ -18,4 +18,6 @@ "homepage": "https://github.com/brev/esm-loaders/tree/main/packages/esm-loader-import-alias#readme", | ||
"dependencies": { | ||
"astring": "^1.8.1", | ||
"create-esm-loader": "^0.1.1", | ||
"escape-string-regexp": "^5.0.0" | ||
"esquery": "^1.4.0", | ||
"meriyah": "^4.2.0" | ||
}, | ||
@@ -22,0 +24,0 @@ "devDependencies": { |
7473
0.17%55
3.77%4
100%+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
- Removed
- Removed