[Bug]: `validateOptions is not a function` error
- 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
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