Cómo cambiar las declaraciones de requerimiento en línea utilizando codemod (jscodeshift)?
Hola, estoy tratando de escribir un codemod que mueva mi declaración require desde la parte superior del archivo hasta dentro del constructor de la clase.
const moduleA = require('moduleA');
const moduleB = require('../moduleB');
class Example {
constructor(context) {
this.lazy(
"moduleA",
() => new moduleA(context)
);
this.lazy(
"moduleB",
() => new moduleB(context)
);
}
lazy() {
}
async callThis() {
this.moduleA.callThatMethod();
}
}
module.exports = Example;
Estas declaraciones require en la parte superior del archivo están tardando mucho tiempo, y solo se utilizan si se llama a esa API al menos una vez. Dado que require se almacena en caché a nivel de proceso en Node.js de todos modos, estoy tratando de mover la declaración require dentro de la función de flecha.
Como se muestra a continuación:
class Example {
constructor(context) {
super(context);
this.lazy("moduleA", () => {
const moduleA = require('moduleA');
return new moduleA()
}
this.lazy("moduleB", () => {
const moduleB = require('../moduleB');
return new moduleB()
}
}
async callThis() {
this.moduleA.callThatMethod();
}
}
Estoy teniendo problemas para lograr esto, porque no sé cómo seleccionar la función “lazy” definida y luego mover el require de la parte superior.
Cualquier ayuda es muy apreciada. Gracias.
davy.ai
Solución Propuesta
Para lograr el resultado deseado, necesitamos escribir un script de codemod que identifique la función
constructor
en el archivo dado, encuentre todas las llamadas a la funciónthis.lazy()
dentro de ella y mueva la llamada correspondiente arequire()
dentro de las funciones flecha pasadas como argumento athis.lazy()
.Los siguientes pasos describen la solución propuesta:
Example
en el AST.constructor
dentro de la claseExample
.this.lazy()
dentro de la funciónconstructor
.this.lazy()
, extraer la expresión de la función flecha pasada como segundo argumento.require()
que debe moverse dentro de ella.require()
en la parte superior del archivo con la nueva que se movió dentro de una función flecha.this.lazy()
con la nueva que incluye la llamada arequire()
.Aquí hay un ejemplo de código que muestra cómo realizar estos pasos usando jscodeshift:
Este código se puede guardar en un archivo (por ejemplo,
moveRequireStatements.js
) y ejecutar usando la herramienta de línea de comandosjscodeshift
. Suponiendo que el código original se guarda en un archivo llamadoexample.js
, puedes aplicar la transformación de código de la siguiente manera:Esto mostrará el código modificado en la consola. Si deseas guardarlo en un archivo en su lugar, puedes usar la opción
-d
para especificar el directorio de salida: