javascript - Jest falla al importar con Typescript (SyntaxError: No se puede usar la declaración import fuera de un módulo)
Cuando ejecuto pruebas de Jest con Typescript, obtengo el siguiente error en una importación de un archivo TS externo llamado en una librería node_modules:
SyntaxError: Cannot use import statement outside a module
Estoy seguro de que me falta una configuración, ¿pero cuál es? Gracias por tu ayuda.
Aquí está mi configuración:
tsconfig.json
{
"compilerOptions": {
"sourceMap": true,
"module": "commonjs",
"moduleResolution": "node",
"esModuleInterop": true,
"allowJs": true,
"jsx": "react",
"target": "es5",
"lib": ["dom", "dom.iterable", "esnext"],
"baseUrl": "./",
"paths": {
"*": ["src/*"]
}
},
"strict": true,
"module": "node",
"compileOnSave": false,
"include": ["src", "tests"]
}
jest.config.js
module.exports = {
roots: ['<rootDir>'],
preset: 'ts-jest',
testRegex: 'tests/.*\\.test.(js|jsx|ts|tsx)$',
transform: {
'^.+\\.tsx?$': 'ts-jest',
},
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
moduleDirectories: ['node_modules', 'src'],
setupFilesAfterEnv: ['<rootDir>/tests/jest.setup.ts'],
collectCoverage: true,
collectCoverageFrom: ['src/**/*.{js{,x},ts{,x}}', '!src/index.tsx'],
}
webpack.config.js
/* eslint-disable @typescript-eslint/no-var-requires */
const path = require('path')
const webpack = require('webpack')
module.exports = {
entry: './src/index.tsx',
mode: 'development',
module: {
rules: [
{
test: /\.jsx?$/,
exclude: /node_modules/,
loader: 'babel-loader',
options: { presets: ['@babel/env'] },
},
{
test: /\.tsx?$/,
exclude: /node_modules/,
loader: 'ts-loader',
},
{
test: /\.css$/,
exclude: /node_modules/,
use: ['style-loader', 'css-loader'],
},
],
},
resolve: {
extensions: ['.js', '.jsx', '.ts', '.tsx'],
alias: { 'react-dom': '@hot-loader/react-dom' },
},
output: {
path: path.resolve(__dirname, 'dist/'),
publicPath: '/dist/',
filename: 'app.js',
},
devServer: {
contentBase: path.join(__dirname, 'public/'),
port: 3000,
publicPath: 'http://localhost:3000/dist/',
hotOnly: true,
},
plugins: [new webpack.HotModuleReplacementPlugin()],
}
Respuesta #1
Tuve el mismo problema, por favor verifica si todas las rutas en tus importaciones son correctas, en mi caso tenía import NavbarCollapse from "react-bootstrap/esm/NavbarCollapse"; en lugar de import NavbarCollapse from "react-bootstrap/NavbarCollapse";
Respuesta #2
Creo que el problema está con el
"module": "node",
línea en tu tsconfig.json. Elimínala. Tienes la especificación de módulo correcta (commonjs) dentro de tu sección compilerOptions.
