eslint: TypeError: Cannot read property 'type' of undefined with babel-eslint@8.1.2

Tell us about your environment

  • ESLint Version: 4.14.0
  • Node Version: v8.9.1
  • npm Version: 5.6.0

What parser (default, Babel-ESLint, etc.) are you using? Babel-ESLint@8.1.2

Please show your full configuration:

Configuration
extends: airbnb
parser: 'babel-eslint'
rules:
  indent:
    - error
    - 2
  linebreak-style:
    - error
    - unix
  quotes:
    - error
    - single
  semi:
    - error
    - never
  no-unused-expressions:
    - off
  no-unused-vars:
    - warn

What did you do? Please include the actual source code causing the issue, as well as the command that you used to run ESLint.

src/pages/basic/ForgetPassWord.jsx


import React from 'react'
import { observer, inject } from 'mobx-react'
import { Steps, Form, Radio, Input, Button, message } from 'antd'
import _ from 'lodash'

import xingyeLogo from '../../assets/images/xingyeyinhang.png'
import school from '../../assets/images/educloud-logo.png'
import { SYSTEM_CODE, VERIFY_CODE } from '../../../../educloud-common/consts/consts.system'
import { encrypt } from '../../utils/helper'
import './ForgetPassWord.css'

const Step = Steps.Step
const FormItem = Form.Item
const RadioGroup = Radio.Group
const FormItemLayout = {
	labelCol: { span: 5 },
	wrapperCol: { span: 15 },
}

@inject(['forgetPassWord'])
@observer
class ForgetPassWord extends React.Component {
	constructor(props) {
		super(props);
		this.store = this.props.forgetPassWord
    this.state = {
      current: 0,
    };
	}
	render() {
		const { current } = this.state
		return (
			<div
			style={{overflowY: 'auto', height: '100%', background: '#ecf0f5'}}
			className='common-scroll'>
				<div style={{background: '#e8e8e8', padding: '25px 30px', display: 'flex', alignItems: 'center'}}>
					<img src={xingyeLogo} alt="兴业银行" />
					<img style={{margin: '0 10px 0 10px'}} src={school} alt="学校" />
					<span style={{fontSize: 18, fontWeight: 'bold'}}>教育云平台</span>
				</div>
				<div style={{width: 860, margin: '35px auto 0 auto'}}>
					<Steps style={{background: '#ecf0f5'}} current={current}>
						<Step title="证件检查" />
						<Step title="重置登陆密码" />
						<Step title="完成" />
					</Steps>
				</div>
				<div
					style={{
						width: 820,
						margin: '25px auto 0 auto',
						padding: '0 30px 35px 30px',
						border: '2px solid #eee',
						background: '#fff',
						borderTop: '3px solid #3c8dbc'}}>
						<h3 style={{
							fontSize: 16,
							padding: 10,
							borderBottom: '2px solid #eee',
							marginBottom: 15
						}}>
							重置密码
						</h3>
					{this.StepPage()}
				</div>
			</div>
		)
	}

	next = () => {
		this.setState({
			current: ++this.state.current
		})
	}

	StepPage = () => {
		const { current } = this.state;
		switch (current) {
			case 0:
				return <CertCheck next={this.next} store={this.store} />
			case 1:
				return <ResetPassWord next={this.next} store={this.store} />
			case 2:
				return <Done {...this.props} />
			default:
				return
		}
	}
}

//证件检查块
@observer
class CertCheckBlock extends React.Component {
	constructor(props) {
		super(props)
	}

	// 手机号验证
  checkPhone = (rule, value, callback) => {
		if (!value) {
			callback('不能为空')
			return
		}
		const length = value.length;
    const isPhone = /^1\d{10}$/.test(value);
		const isLength = _.isEqual(length, 11);
		if (!length) {
      callback();
    } else if (length !== 11) {
      callback('手机号格式不正确,请输入11位手机号!');
    } else if (!isPhone) {
      callback('手机号格式不正确,请输入11位手机号!');
    } else if (!isLength) {
      callback('手机号格式不正确,请输入11位手机号!');
    } else {
			callback();
		}
	}

	render() {
		const { getFieldDecorator } = this.props.form
		return (
			<div>
				<FormItem label="手机号码:" {...FormItemLayout}>
					{getFieldDecorator('phone', {
						rules: [
							{required: true, message: '手机号码必填!'},
							{validator: this.checkPhone.bind(this) },
						],
					})(
						<Input style={{width: 400}}
						onKeyDown={(e) => { if (e.keyCode === 13) {this.onNext()} }} />
					)}
				</FormItem>
				<div style={{textAlign: 'center'}}>
					<Button style={{fontSize: 16}} onClick={() => {this.onNext()}} type="primary">下一步</Button>
				</div>
			</div>
		)
	}

	onNext = () => {
		const self = this
		this.props.form.validateFieldsAndScroll((err, values) => {
			if(!err) {
				const body = self.props.form.getFieldsValue()
				self.props.store.getPhone(body, (res) => {
					if (SYSTEM_CODE.ACCT_UN_AVAILABLE === res.respCode) {
						self.props.store.phone = body.phone
						self.props.next()
					} else if (SYSTEM_CODE.FORMAT_FAILED === res.respCode) {
						message.error('电话格式不正确')
					} else if (SYSTEM_CODE.LOGIN_SUCCESS === res.respCode) {
						message.error('未找到用户,请确认手机号码')
					}
				})
			}
		})
	}
}

const CertCheck = Form.create()(CertCheckBlock)

//重置登陆密码块
class ResetPassWordBlock extends React.Component {
	constructor(props) {
		super(props);
		this.state = {
			isSendOut: false,
			count: 60,
			randomNumber: undefined
		}
	}

	componentWillUnmount() {
		clearInterval(this.timer)
	}

	//密码格式校验
	checkPassWrod = (rule, value, callback) => {
		const form = this.props.form;
		const isRule = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/.test(value);
    if (!isRule) {
      callback('密码由数字和字母组成');
    } else {
      callback();
    }
	}

	checkRepeatPassword = (rule, value, callback) => {
		const passWord = this.props.form.getFieldsValue(['password']).password
		const isRule = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/.test(value);
		if (!isRule) {
			callback('密码由数字和字母组成');
		} else if (passWord !== value) {
			callback('两次密码不一致')
		} else {
			callback()
		}
	}

	sendOutVerify = () => {
		const self = this
		const body = {
			mobile: self.props.store.phone,
			argMap: {
				schoolName: ''
			}
		}
		this.props.store.sendVerificationCode(body, () => {
			self.countDown()
		})
	}

	countDown = () => {
		if (!this.state.isSendOut) {
			this.timer = setInterval(function () {
				this.setState((prevState) => ({ count: prevState.count - 1, isSendOut: true }), () => {
					if (this.state.count === 0) {
						this.setState({ isSendOut: false, count: 60 });
						clearInterval(this.timer);
					}
				})
			}.bind(this), 1000)
		}
	}

	render() {
		const { getFieldDecorator } = this.props.form
		const { phone } = this.props.store
		const { isSendOut, randomNumber } = this.state
		const text = isSendOut ? `${this.state.count}秒后重新发送` : '发送验证码'
		return (
			<div>
				<p style={{color: '#999'}}>以下是您在本平台登记过的手机号码,我们将向选中手机发送验证码</p>
				<RadioGroup defaultValue={`${phone}`}>
					<div style={{margin: '8px'}}>
						<Radio value={`${phone}`}>{phone}</Radio>
					</div>
				</RadioGroup>

				<div style={{marginTop: 15}}>
					<FormItem label="图形验证码:" {...FormItemLayout} className="imageCode">
						{getFieldDecorator('imgCode', {
							rules: [{required: true, message: '图形验证码必填!'}],
						})(
							<Input
							style={{width: 250, float: 'left'}}
							placeholder="右侧验证码" />
						)}
						<div
						style={{
							width: 90,
							height: 35,
							float: 'left',
							background: '#fff',
							margin: '0 10px'}}>
								<img
								style={{width: 80, height: 30, margin: 5}}
								src={`${process.env.REACT_APP_API_SMS_URL}/api/v1/captcha/${randomNumber}`}
								alt="验证码" />
							</div>
						<div
						onClick={() => {this.changeImaCode()}}
						style={{float: 'left', color: '#00a4e1', cursor: 'pointer'}}>
							看不清楚?换一张
						</div>
					</FormItem>
					<FormItem label="短信验证码:" {...FormItemLayout}>
						{getFieldDecorator('messageCode', {
							rules: [{required: true, message: '短信验证码必填!'}],
						})(
							<Input
							style={{width: 250}}
							placeholder="收到的验证码" />
						)}
						<Button
						style={{
							marginLeft: 15,
							background: isSendOut ? '#6f7072' : '#f39c13',
							border: 0,
							color: '#fff',
							cursor: isSendOut ? 'no-drop' :'pointer'}}
							type="primary"
							onClick={() => {isSendOut ? null : this.sendOutVerify()}}>
							{text}
						</Button>
					</FormItem>
					<FormItem label="登陆密码:" {...FormItemLayout}>
						{getFieldDecorator('password', {
							rules: [
								{required: true, message: '登录密码必填!'},
								{validator: this.checkPassWrod.bind(this)}
							],
						})(
							<Input
							type="password"
							style={{width: 400}}
							placeholder="设置登陆密码,8-16位数字字母组合" />
						)}
					</FormItem>
					<FormItem label="确认密码证码:" {...FormItemLayout}>
						{getFieldDecorator('repeatPassWord', {
							rules: [
								{required: true, message: '确认密码必填!'},
								{validator: this.checkRepeatPassword.bind(this)}
							],
						})(
							<Input
							type="password"
							style={{width: 400}}
							placeholder="再次输入密码" />
						)}
					</FormItem>
				</div>
				<div style={{textAlign: 'center'}}>
					<Button style={{fontSize: 16}} onClick={() => {this.onNext()}} type="primary">提交</Button>
				</div>
			</div>
		)
	}

	changeImaCode = (value) => {
		const date = new Date()
		const timeStamp = Date.parse(date)
		this.setState({
			randomNumber: timeStamp
		})
	}

	onNext = () => {
		const self = this
		const { form } = this.props
		form.validateFieldsAndScroll((err, values) => {
			if(!err) {
				const data = form.getFieldsValue()
				//图形验证码的body
				const imgCodeCheck = {verifyCode: data.imgCode}
				//短信验证码的body
				const messageCodeCheck =  {
					mobile: self.props.store.phone,
					verifyCode: data.messageCode
				}
				//修改用户密码的body
				const body = {password: encrypt(data.password)}
				//图形验证码校验
				self.props.store.checkImageVerificationCode(imgCodeCheck, (res) => {
					//成功
					if (res.respCode === VERIFY_CODE.SUCCESS) {
						//短信校验码
						self.props.store.checkVerificationCode(messageCodeCheck, (res) => {
							if (res.respCode === VERIFY_CODE.SUCCESS) {
								//发起修改密码
								self.props.store.forgetPassWord(body, (res) => {
									if (res.respCode === SYSTEM_CODE.LOGIN_SUCCESS) {
										message.success('修改成功')
										self.props.next()
									} else if (res.respCode === SYSTEM_CODE.FORMAT_FAILED) {
										message.error('密码格式不正确')
									}
								})
							} else if (res.respCode === VERIFY_CODE.FAILED) {
								form.setFields({
									messageCode: {
										value: values.messageCode,
										errors: [new Error(`${res.message}`)]
									}
								})
							} else {
								message.error('短信验证码异常')
							}
						})
					} else if (res.respCode === VERIFY_CODE.FAILED) {
						form.setFields({
							imgCode: {
								value: values.imgCode,
								errors: [new Error(`${res.message}`)]
							}
						})
					} else {
						message.error('图片验证码异常')
					}
				})
			}
		})
	}
}

const ResetPassWord = Form.create()(ResetPassWordBlock)

//完成
class Done extends React.Component {
	render() {
		return (
			<div>
				<div>
					<div style={{padding: '20px 20px'}}>
						<div className="doneMeassage">恭喜您!完成登陆密码的重置!请返回登录页,重新登陆....</div>
						<div style={{textAlign: 'center'}}>
							<Button
							onClick={() => {this.goLogin()}}
							style={{fontSize: 16, marginBottom: 50}}
							type="primary">
								返回
							</Button>
						</div>
					</div>
				</div>
			</div>
		)
	}

	goLogin = () => {
		this.props.history.push('/login')
	}
}

export default ForgetPassWord
yarn run eslint src/pages/basic/ForgetPassWord.jsx --debug

What did you expect to happen?

What actually happened? Please include the actual, raw output from ESLint.

yarn run v1.3.2
$ /Users/bk/.../educloud-web/node_modules/.bin/eslint src/pages/basic/ForgetPassWord.jsx --debug
  eslint:cli Running on files +0ms
  eslint:glob-util Creating list of files to process. +0ms
  eslint:ignored-paths Looking for ignore file in /Users/bk/project/project_business/emsoft/EduCloud/educloud-web +0ms
  eslint:ignored-paths Could not find ignore file in cwd +1ms
  eslint:cli-engine Processing /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/src/pages/basic/ForgetPassWord.jsx +0ms
  eslint:cli-engine Linting /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/src/pages/basic/ForgetPassWord.jsx +2ms
  eslint:config Constructing config file hierarchy for /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/src/pages/basic +0ms
  eslint:config Using .eslintrc and package.json files +1ms
  eslint:config Loading /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/.eslintrc.yml +5ms
  eslint:config-file Loading YAML config file: /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/.eslintrc.yml +0ms
  eslint:config-file Loading airbnb +884ms
  eslint:config-file Attempting to resolve eslint-config-airbnb +1ms
  eslint:config-file Loading JS config file: /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb/index.js +2ms
  eslint:config-file Loading /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb/rules/react-a11y.js +10ms
  eslint:config-file Loading JS config file: /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb/rules/react-a11y.js +1ms
  eslint:config-file Loading /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb/rules/react.js +586ms
  eslint:config-file Loading JS config file: /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb/rules/react.js +0ms
  eslint:config-file Loading /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb-base/rules/strict.js +70ms
  eslint:config-file Loading JS config file: /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb-base/rules/strict.js +1ms
  eslint:config-file Loading /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb-base/index.js +5ms
  eslint:config-file Loading JS config file: /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb-base/index.js +0ms
  eslint:config-file Loading /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb-base/rules/imports.js +5ms
  eslint:config-file Loading JS config file: /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb-base/rules/imports.js +1ms
  eslint:config-file Loading /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb-base/rules/es6.js +205ms
  eslint:config-file Loading JS config file: /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb-base/rules/es6.js +0ms
  eslint:config-file Loading /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb-base/rules/variables.js +48ms
  eslint:config-file Loading JS config file: /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb-base/rules/variables.js +0ms
  eslint:config-file Loading /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb-base/rules/style.js +17ms
  eslint:config-file Loading JS config file: /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb-base/rules/style.js +1ms
  eslint:config-file Loading /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb-base/rules/node.js +192ms
  eslint:config-file Loading JS config file: /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb-base/rules/node.js +0ms
  eslint:config-file Loading /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb-base/rules/errors.js +5ms
  eslint:config-file Loading JS config file: /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb-base/rules/errors.js +1ms
  eslint:config-file Loading /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb-base/rules/best-practices.js +11ms
  eslint:config-file Loading JS config file: /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint-config-airbnb-base/rules/best-practices.js +0ms
  eslint:config Using /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/.eslintrc.yml +2s
  eslint:config-ops Using config from partial cache +0ms
  eslint:config-ops Apply environment settings to config +1ms
  eslint:config-ops Creating config for environment node +1ms
  eslint:config-ops Creating config for environment es6 +0ms
  eslint:linter Linting code for /Users/bk/project/project_business/emsoft/EduCloud/educloud-web/src/pages/basic/ForgetPassWord.jsx (pass 1) +0ms
  eslint:traverser Unknown node type "ClassProperty": Estimated visitor keys ["type","start","end","loc","static","computed","key","variance","value","range"] +0ms
  eslint:traverser Unknown node type "ClassProperty": Estimated visitor keys ["type","start","end","loc","static","computed","key","variance","value","range"] +758ms
  eslint:traverser Unknown node type "ClassProperty": Estimated visitor keys ["type","start","end","loc","static","computed","key","variance","value","range"] +17ms
  eslint:traverser Unknown node type "ClassProperty": Estimated visitor keys ["type","start","end","loc","static","computed","key","variance","value","range"] +70ms
  eslint:traverser Unknown node type "ClassProperty": Estimated visitor keys ["type","start","end","loc","static","computed","key","variance","value","range"] +85ms
  eslint:traverser Unknown node type "ClassProperty": Estimated visitor keys ["type","start","end","loc","static","computed","key","variance","value","range"] +72ms
  eslint:traverser Unknown node type "ClassProperty": Estimated visitor keys ["type","start","end","loc","static","computed","key","variance","value","range"] +7ms
  eslint:traverser Unknown node type "ClassProperty": Estimated visitor keys ["type","start","end","loc","static","computed","key","variance","value","range"] +15ms
  eslint:traverser Unknown node type "ClassProperty": Estimated visitor keys ["type","start","end","loc","static","computed","key","variance","value","range"] +12ms
  eslint:traverser Unknown node type "ClassProperty": Estimated visitor keys ["type","start","end","loc","static","computed","key","variance","value","range"] +219ms
  eslint:traverser Unknown node type "ClassProperty": Estimated visitor keys ["type","start","end","loc","static","computed","key","variance","value","range"] +7ms
  eslint:traverser Unknown node type "ClassProperty": Estimated visitor keys ["type","start","end","loc","static","computed","key","variance","value","range"] +102ms
Cannot read property 'type' of undefined
TypeError: Cannot read property 'type' of undefined
    at isForInRef (/Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint/lib/rules/no-unused-vars.js:410:24)
    at variable.references.some.ref (/Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint/lib/rules/no-unused-vars.js:447:21)
    at Array.some (<anonymous>)
    at isUsedVariable (/Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint/lib/rules/no-unused-vars.js:446:40)
    at collectUnusedVariables (/Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint/lib/rules/no-unused-vars.js:569:26)
    at collectUnusedVariables (/Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint/lib/rules/no-unused-vars.js:576:17)
    at Program:exit (/Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint/lib/rules/no-unused-vars.js:621:36)
    at listeners.(anonymous function).forEach.listener (/Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint/lib/util/safe-emitter.js:47:58)
    at Array.forEach (<anonymous>)
    at Object.emit (/Users/bk/project/project_business/emsoft/EduCloud/educloud-web/node_modules/eslint/lib/util/safe-emitter.js:47:38)
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

About this issue

  • Original URL
  • State: closed
  • Created 7 years ago
  • Comments: 15 (6 by maintainers)

Most upvoted comments

Closing because this issue could not be reproduced. Feel free to open a new issue if you’re still encountering crashes after upgrading to babel-eslint@8.1.2.

@sugarac It looks fine to me after I updated babel-eslint:

~\Downloads\u2cmyw> npm ls eslint babel-eslint
react-cnode-teach@1.0.0 C:\Users\t-nagashima.MSS\Downloads\u2cmyw
+-- babel-eslint@8.1.2
`-- eslint@4.14.0

~\Downloads\u2cmyw> node_modules/.bin/eslint "client/**/*.{js,jsx}"
~\Downloads\u2cmyw>