Expose the default module resolver in a package
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- JavaScript
- Estrellas
- 122k
- Forks
- 37.3k
- Merge medio
- 4 d 2 h
- PR fusionados (30 d)
- 283
Descripción
Currently we can access the default resolver when in a --loader loader. However we can't access this loader from a regular program. I'd like to propose exposing this function as a regular function that can be imported at runtime for use with vm.SourceTextModule to create in-process loaders.
For example:
import vm from 'vm';
import process from 'process';
import url from 'url';
import { resolver } from 'module';
const cwd = url.pathToFileURL(process.cwd() + '/');
class TestLoader {
#cache = new Map();
#realm = vm.createContext({});
async #loadModule(url) {
return new vm.SourceTextModule(await fsp.readFile(resolvedUrl, 'utf8'), {
url: resolvedUrl,
context: this.#realm,
});
}
async #linker(module, specifier) {
// --- Use node's resolution algorithm ---
const resolvedUrl = resolver(module.url, specifier);
if (this.#cache.has(resolvedUrl)) {
return this.#cache.get(resolvedUrl);
}
const module = this.#loadModule(resolvedUrl);
this.#cache.set(resolvedUrl, module);
return module;
}
constructor() {
// Setup test environment
this.#realm.evaluate(`function deepEqual(a, b) { /* ... */ }`);
}
async runTest(file) {
const module = this.#loadModule(resolver(cwd, file));
await module.link((...args) => this.#linker(...args));
module.instantiate();
try {
await module.evaluate();
return { passed: true };
} catch (error) {
return { passed: false, error };
}
}
}
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza revisando el resolver existente disponible para --loader loaders y el flujo de vinculación de vm.SourceTextModule mostrado en el ejemplo. Determina la API de ejecución y el punto de entrada del módulo necesarios para importar el resolver predeterminado y, después, verifica que admita la resolución de loaders en proceso tal como se demuestra.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- javascript, node.js
- Área
- backend
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Estado de actividad
- Tranquilo
- Claridad
- Bastante claro
- Aptitud para principiantes
- 42/100