jestjs - Prevenir la duplicación de configuraciones de rutas de TypeScript en Monorepo
Esencia
Me gusta seguir el principio "DRY" (no te repitas). Pero actualmente tengo casi la misma configuración de ruta en tres lugares diferentes:
1. Archivo de configuración de Typescript
Tengo un monorepo con múltiples paquetes de Typescript de Bazel, y por lo tanto necesito referenciarlos con rutas como esta dentro de tsconfig.json
"paths": {
"@cents-ideas/enums": ["./packages/enums"],
"@cents-ideas/utils": ["./packages/utils"],
"@cents-ideas/event-sourcing": ["./packages/event-sourcing"],
"@cents-ideas/models": ["./packages/models"]
},
2. Archivo de paquete de Node
Para el desarrollo con ts-node también necesito agregar las rutas al package.json para que Node.Js pueda reconocer los alias de Typescript. (Estoy usando un paquete llamado module-alias para esto).
"_moduleAliases": {
"@cents-ideas/enums": "./packages/enums",
"@cents-ideas/utils": "./packages/utils",
"@cents-ideas/event-sourcing": "./packages/event-sourcing",
"@cents-ideas/models": "./packages/models"
}
3. Archivo de configuración de Jest
Finalmente, también necesito agregar esas rutas a mi configuración de Jest, para que las pruebas puedan encontrar las rutas:
moduleNameMapper: {
'^@cents-ideas/utils(.*)$': '<rootDir>/packages/utils$1',
'^@cents-ideas/event-sourcing(.*)$': '<rootDir>/packages/event-sourcing$1',
'^@cents-ideas/enums(.*)$': '<rootDir>/packages/enums$1',
'^@cents-ideas/models(.*)$': '<rootDir>/packages/models$1',
},
Meta
Mi objetivo es tener un lugar común donde pueda poner las rutas y todos los demás lugares se actualizarán automáticamente.
Por si necesitas más información sobre el proyecto, puedes consultarlo aquí: https://github.com/flolude/cents-ideas
Respuesta #1
Archivo de configuración de Typescript
"paths": {
"@cents-ideas/*": ["./packages/*"]
},
Archivo de paquete de nodo
const moduleAlias = require('module-alias');
const registerAliases = () => {
if (process.env.ENV === 'dev') {
const fs = require('fs');
const paths: string[] = fs.readdirSync('./packages');
paths.forEach(addPackageAlias);
}
};
const addPackageAlias = (name: string) => {
moduleAlias.addAlias(`@cents-ideas/${name}`, `${__dirname}../../../packages/${name}`);
};
registerAliases();
Archivo de configuración de Jest
Arreglado con la ayuda de Bazel. Pero estoy seguro de que Jest admite comodines similares a los de la configuración de Typescript.
Respuesta #2
Estás usando yarn, así que probablemente deberías echar un vistazo a los espacios de trabajo de yarn. Deberías poder agregar
{
//...
"workspaces": [
"packages/*
]
}
Y ejecuta yarn que creará enlaces simbólicos en node_modules y deberías poder eliminar las tres configuraciones anteriores
