rerumaccusamus
Version:
The meta-framework suite designed from scratch for frontend-focused modern web development.
50 lines (42 loc) • 1.4 kB
text/typescript
import path from 'path';
import { createDebugger } from '@modern-js/utils';
import { Plugin as RollupPlugin } from 'rollup';
import resolve from 'enhanced-resolve';
import { IAppContext, NormalizedConfig } from '@modern-js/core';
import { DEFAULT_EXTENSIONS, BARE_SPECIFIER_REGEX } from '../constants';
const debug = createDebugger('esm:resolve');
const resolveExtensions = resolve.create.sync({
extensions: DEFAULT_EXTENSIONS,
symlinks: true,
});
export const resolvePlugin = (
_config: NormalizedConfig,
{ appDirectory }: IAppContext,
): RollupPlugin => ({
name: 'esm-resolve-extensions',
resolveId(id, importer = appDirectory) {
// relative imports( starts with '.')
if (id.startsWith('.') || BARE_SPECIFIER_REGEX.test(id)) {
const resolved = resolveExtensions(importer, id);
debug(`resolve id: ${id} -> ${resolved.toString()}`);
if (resolved) {
return resolved;
}
}
// absolute url path
if (path.isAbsolute(id)) {
let resolved: string | false = false;
try {
// try resolve absolute fs path
resolved = resolveExtensions(importer, id);
} catch (err) {
// resolve path based on importer
resolved = resolveExtensions(importer, `.${id}`);
}
debug(`resolve id: ${id} -> ${resolved.toString()}`);
if (resolved) {
return resolved;
}
}
},
});