use-m
Version:
use-m: dynamically import any JavaScript module
71 lines (62 loc) • 2.22 kB
JavaScript
// loader.js
// import { resolve, extname } from 'path';
import { pathToFileURL } from 'url';
import { resolvers } from './use.mjs';
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
// The `resolve` hook customizes how module URLs are resolved
export async function resolve(specifier, context, defaultResolve) {
// const { parentURL } = context;
// // You can add custom logic here to modify how modules are resolved
// if (specifier.startsWith('custom:')) {
// // Replace "custom:" specifiers with an actual path or URL
// const resolvedUrl = new URL(specifier.replace('custom:', ''), parentURL).href;
// return { url: resolvedUrl };
// }
let defaultResolveError;
try {
const resolution = await defaultResolve(specifier, context, defaultResolve);
if (resolution && resolution.url) {
return resolution;
}
} catch (error) {
defaultResolveError = error;
}
try {
const { npm } = resolvers;
const resolvedUrl = await npm(specifier, require.resolve);
return { url: pathToFileURL(resolvedUrl).href };
} catch (error) {
if (defaultResolveError) {
console.error(error);
throw defaultResolveError;
} else {
throw error;
}
}
}
// The `load` hook customizes how module code is loaded
export async function load(url, context, defaultLoad) {
// // Handle specific file extensions (e.g., custom logic for `.custom` files)
// if (extname(url) === '.custom') {
// // Return custom source code for `.custom` files
// return {
// format: 'module',
// source: `export default 'This is a .custom file';`,
// };
// }
// Fallback to default loading
return defaultLoad(url, context, defaultLoad);
}
// Optional: Transform the source code of loaded modules
export async function transformSource(source, context, defaultTransformSource) {
// const { url } = context;
// // Example: Add a comment to all JavaScript modules
// if (url.endsWith('.js')) {
// return {
// source: `// Transformed by loader.js\n${source}`,
// };
// }
// Fallback to default transformation
return defaultTransformSource(source, context, defaultTransformSource);
}