babel / babel/babel-loader

[Bug]: `validateOptions is not a function` error

Open
#906 10 comments 0 reactions 0 assignees View on GitHub
Dominant language
JavaScript
Stars
4.8k
Forks
456
Avg merge
9h 19m
Merged PRs (30d)
2

Description

### 💻

- [ ] Would you like to work on a fix?

### How are you using Babel?

babel-loader (webpack)

### Input code
```js
const babelLoaderConfiguration = {
test: /\.(js|jsx)$/,
// Add every directory that needs to be compiled by Babel during the build.
include: [
path.resolve(__dirname, 'index.web.js'), // Entry to your application
path.resolve(__dirname, 'App.web.js'), // Change this to your main App file
path.resolve(__dirname, 'src'),
path.resolve(appDirectory, 'node_modules/react-native-uncompiled'),
path.resolve(appDirectory, 'node_modules/react-native-vector-icons'),
path.resolve(appDirectory, 'node_modules/native-base/node_modules/react-native-vector-icons'),
path.resolve(appDirectory, 'node_modules/react-native/Libraries/Components/TextInput/TextInputState.js'),

...compileNodeModules,
],
use: {
loader: 'babel-loader',
options: {
cacheDirectory: true,
presets: [
"@babel/preset-env"
],
plugins: ['react-native-web'],
},
},
};
```

### Configuration file name

_No response_

### Configuration

# webpack.config.js file content:
```js
const path = require('path');

const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');

const appDirectory = path.resolve(__dirname);
const {presets} = require(`${appDirectory}/babel.config.js`);

const compileNodeModules = [
'react-native-gesture-handler','react-native-video','react-native-typewriter','rn-persian-date-picker','react-native-stars','react-native-screens','react-native-ratings','react-native-picker-select','react-native-maps','react-native-keyboard-aware-scroll-view','react-native-ionicons','react-native-image-pan-zoom','react-native-elements','react-native-easy-grid','react-native-drawer','react-native-best-viewpager','native-base/node_modules/@codler/react-native-keyboard-aware-scroll-view','native-base-shoutem-theme','@react-native-picker','@react-native-community'
].map((moduleName) => path.resolve(appDirectory, `node_modules/${moduleName}`));

const babelLoaderConfiguration = {
test: /\.(js|jsx)$/,
// Add every directory that needs to be compiled by Babel during the build.
include: [
path.resolve(__dirname, 'index.web.js'), // Entry to your application
path.resolve(__dirname, 'App.web.js'), // Change this to your main App file
path.resolve(__dirname, 'src'),
path.resolve(appDirectory, 'node_modules/react-native-uncompiled'),
path.resolve(appDirectory, 'node_modules/react-native-vector-icons'),
path.resolve(appDirectory, 'node_modules/native-base/node_modules/react-native-vector-icons'),
path.resolve(appDirectory, 'node_modules/react-native/Libraries/Components/TextInput/TextInputState.js'),

...compileNodeModules,
],
use: {
loader: 'babel-loader',
options: {
cacheDirectory: true,
presets: [
"@babel/preset-env"
],
plugins: ['react-native-web'],
},
},
};

const svgLoaderConfiguration = {
test: /\.svg$/,
use: [
{
loader: '@svgr/webpack',
},
],
};

const imageLoaderConfiguration = {
test: /\.(gif|jpe?g|png)$/,
use: {
loader: 'url-loader',
options: {
name: '[name].[ext]',
limit:false
},
},
};

module.exports = {
entry: {
app: path.join(__dirname, 'index.web.js'),
},
output: {
path: path.resolve(appDirectory, 'dist'),
publicPath: '/',
filename: 'rnw_blogpost.bundle.js',
},
resolve: {
extensions: ['.web.tsx', '.web.ts', '.tsx', '.ts', '.web.js', '.js'],
alias: {
'react-native$': 'react-native-web',
},
},
externals: {
"react-native": true,
},
module: {
rules: [
babelLoaderConfiguration,
imageLoaderConfiguration,
svgLoaderConfiguration,
{
test: /\.(mp3|png|svg|jpg|gif)$/,
loader: 'file-loader',
options: {
name: '[path][name].[ext]'
},
include: [
path.resolve(appDirectory,'node_modules/react-native-video'),

...compileNodeModules,
]
}
],
},
plugins: [
new HtmlWebpackPlugin({
template: path.join(__dirname, 'index.html'),
}),
new webpack.HotModuleReplacementPlugin(),
new webpack.DefinePlugin({
// See: https://github.com/necolas/react-native-web/issues/349
__DEV__: JSON.stringify(true),
}),
]
};
```

### Current and expected behavior

I am using babel-loader with webpack in react-native . Now when I want to run the project with `npm run web` I got the below error:
```
`ERROR in ./index.web.js
Module build failed (from ./node_modules/babel-loader/lib/index.js):
TypeError: validateOptions is not a function
at Object. (D:\Myprj\node_modules\babel-loader\lib\index.js:72:5)2:5)`
```
Babel-loader configuration is in webpack.config.js which I put it in "Input code" section.

### Environment

System:
OS: Windows 10 10.0.10586
Binaries:
Node: 14.16.1 - C:\Program Files (x86)\nodejs\node.EXE
Yarn: 1.19.1 - C:\Program Files (x86)\Yarn\bin\yarn.CMD
npm: 7.11.2 - C:\Program Files (x86)\nodejs\npm.CMD
npmPackages:
@babel/core: ^7.7.2 => 7.14.0
@babel/runtime: ^7.7.2 => 7.14.0
babel-jest: ^24.9.0 => 24.9.0
babel-loader: ^8.2.2 => 8.2.2
babel-plugin-react-native-web: ^0.16.2 => 0.16.2
eslint: ^6.6.0 => 6.8.0
jest: ^24.9.0 => 24.9.0
metro-react-native-babel-preset: ^0.57.0 => 0.57.0
react-native: ^0.64.1 => 0.64.1
webpack: ^5.36.2 => 5.36.2

### Possible solution

_No response_

### Additional context

_No response_

Contributor guide

Open the contributing guide

Research direction

Start with babel-loader/lib/index.js around line 72 and the babel-loader rule in webpack.config.js, then run npm run web using the provided package versions and entry point index.web.js. Trace why validateOptions is unavailable and verify that the web build completes without the reported Module build failed error.

Written by the indexing model from the issue text.

Assessment

Tech stack
javascript, react-native, webpack
Domain
build-system
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.