From 5a96e6266b3861b1976f8e47c46c8cb6c1086ac5 Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Thu, 5 Nov 2015 15:10:18 -0800 Subject: [PATCH] Lint all the things --- .eslintignore | 1 + .eslintrc | 4 +- common/app/components/Flash/Queue.jsx | 8 +- common/app/routes/Bonfires/Actions.js | 63 --------- common/app/routes/Bonfires/Store.js | 67 --------- .../routes/Bonfires/components/Bonfires.jsx | 99 -------------- .../routes/Bonfires/components/Results.jsx | 62 --------- .../routes/Bonfires/components/SidePanel.jsx | 129 ------------------ common/app/routes/Bonfires/executeBonfire.js | 27 ---- common/app/routes/Bonfires/index.js | 8 -- .../routes/Jobs/components/JobNotFound.jsx | 4 +- common/app/routes/Jobs/components/NewJob.jsx | 8 +- .../app/routes/Jobs/components/TwitterBtn.jsx | 4 +- common/app/shared/displayCode/Display.jsx | 51 ------- common/app/shared/displayCode/index.js | 1 - common/app/shared/editor/Editor.jsx | 91 ------------ common/app/shared/editor/index.js | 1 - package.json | 2 +- 18 files changed, 16 insertions(+), 614 deletions(-) delete mode 100644 common/app/routes/Bonfires/Actions.js delete mode 100644 common/app/routes/Bonfires/Store.js delete mode 100644 common/app/routes/Bonfires/components/Bonfires.jsx delete mode 100644 common/app/routes/Bonfires/components/Results.jsx delete mode 100644 common/app/routes/Bonfires/components/SidePanel.jsx delete mode 100644 common/app/routes/Bonfires/executeBonfire.js delete mode 100644 common/app/routes/Bonfires/index.js delete mode 100644 common/app/shared/displayCode/Display.jsx delete mode 100644 common/app/shared/displayCode/index.js delete mode 100644 common/app/shared/editor/Editor.jsx delete mode 100644 common/app/shared/editor/index.js diff --git a/.eslintignore b/.eslintignore index 9f9b48d05b..c71f54c11a 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1 +1,2 @@ public/**/*.js +client/main.js diff --git a/.eslintrc b/.eslintrc index 5d7667557f..92fad475c3 100644 --- a/.eslintrc +++ b/.eslintrc @@ -224,8 +224,8 @@ "no-plusplus": 0, "react/display-name": 1, - "react/jsx-boolean-value": 1, - "react/jsx-quotes": [1, "single", "avoid-escape"], + "react/jsx-boolean-value": [1, "always"], + "jsx-quotes": [1, "prefer-single"], "react/jsx-no-undef": 1, "react/jsx-sort-props": 1, "react/jsx-uses-react": 1, diff --git a/common/app/components/Flash/Queue.jsx b/common/app/components/Flash/Queue.jsx index 718733a923..ac36ca3f46 100644 --- a/common/app/components/Flash/Queue.jsx +++ b/common/app/components/Flash/Queue.jsx @@ -1,7 +1,7 @@ -import React, { createClass, PropTypes } from 'react'; +import React, { PropTypes } from 'react'; import { Alert } from 'react-bootstrap'; -export default createClass({ +export default React.createClass({ displayName: 'FlashQueue', propTypes: { @@ -9,9 +9,9 @@ export default createClass({ }, renderMessages(messages) { - return messages.map(message => { + return messages.map(() => { return ( - + ); }); }, diff --git a/common/app/routes/Bonfires/Actions.js b/common/app/routes/Bonfires/Actions.js deleted file mode 100644 index 1930b48890..0000000000 --- a/common/app/routes/Bonfires/Actions.js +++ /dev/null @@ -1,63 +0,0 @@ -var Action = require('thundercats').Action, - executeBonfire = require('./executeBonfire'), - getModel = require('../../utils/getModel'), - debug = require('debug')('freecc:common:bonfires'); - -var BonfireActions = Action.createActions([ - 'setUserCode', - 'testUserCode', - 'setResults', - 'setDisplay', - 'setBonfire', - 'getBonfire', - 'handleBonfireError', - 'openCompletionModal' -]); - -BonfireActions - .getBonfire - .subscribe(function(params) { - var Bonfire = getModel('bonfire'); - var bonfireName = params.bonfireName ? - params.bonfireName.replace(/\-/g, ' ') : - 'meet bonfire'; - debug('getting bonfire for: ', bonfireName); - var regQuery = { name: { like: bonfireName, options: 'i' } }; - Bonfire.find( - { where: regQuery }, - function(err, bonfire) { - if (err) { - return debug('bonfire get err', err); - } - if (!bonfire || bonfire.length < 1) { - return debug('404 no bonfire found for ', bonfireName); - } - bonfire = bonfire.pop(); - if (bonfire) { - debug( - 'found bonfire %s for route %s', - bonfire.name, - bonfireName - ); - } - BonfireActions.setBonfire(bonfire); - } - ); - }); - - -BonfireActions - .testUserCode - .subscribe(function({ userCode, tests }) { - debug('test bonfire'); - executeBonfire(userCode, tests, function(err, { output, results }) { - if (err) { - debug('error running tests', err); - return BonfireActions.setDisplay(err); - } - BonfireActions.setDisplay(output); - BonfireActions.setResults(results); - }); - }); - -module.exports = BonfireActions; diff --git a/common/app/routes/Bonfires/Store.js b/common/app/routes/Bonfires/Store.js deleted file mode 100644 index 4a83c223d6..0000000000 --- a/common/app/routes/Bonfires/Store.js +++ /dev/null @@ -1,67 +0,0 @@ -var BonfiresActions = require('./Actions'); -var { Store, setStateUtil } = require('thundercats'); - -var BonfiresStore = Store.create({ - - getInitialValue: function() { - return { - userCode: 'console.log(\'FreeCodeCamp!\')', - difficulty: 0, - description: [ - 'default state' - ], - tests: [], - results: null - }; - }, - - getOperations: function() { - var { - setBonfire, - setUserCode, - setResults, - setDisplay - } = BonfiresActions; - - return [ - setBonfire - .map(function(bonfire) { - var { - name, - description, - difficulty, - tests - } = bonfire; - var userCode = bonfire.challengeSeed; - return { - name, - userCode, - tests, - description, - difficulty - }; - }) - .map(setStateUtil), - - setUserCode - .map(function(userCode) { - return { userCode }; - }) - .map(setStateUtil), - - setDisplay - .map(function(display) { - return { display }; - }) - .map(setStateUtil), - - setResults - .map(function(results) { - return { results }; - }) - .map(setStateUtil) - ]; - } -}); - -module.exports = BonfiresStore; diff --git a/common/app/routes/Bonfires/components/Bonfires.jsx b/common/app/routes/Bonfires/components/Bonfires.jsx deleted file mode 100644 index 9da6db9320..0000000000 --- a/common/app/routes/Bonfires/components/Bonfires.jsx +++ /dev/null @@ -1,99 +0,0 @@ -var React = require('react'), - - // ## mixins - { ObservableStateMixin } = require('thundercats'), - - // ## components - SidePanel = require('./SidePanel.jsx'), - Results = require('./Results.jsx'), - Display = require('../displayCode'), - Editor = require('../editor'), - { Grid, Row, Col } = require('react-bootstrap'), - - // ## flux - BonfireActions = require('./Actions'), - BonfireStore = require('./Store'); - -var Bonfire = React.createClass({ - - mixins: [ObservableStateMixin], - - contextTypes: { - makePath: React.PropTypes.func.isRequired, - replaceWith: React.PropTypes.func.isRequired - }, - - getObservable: function() { - return BonfireStore; - }, - - componentDidMount: function() { - // get history object - var his = typeof window !== 'undefined' ? window.history : null; - // spinal-case bonfireName - var bonfireName = this.state.name.toLowerCase().replace(/\s/g, '-'); - // create proper URI from react-router - var path = this.context.makePath('bonfires', { bonfireName: bonfireName }); - - // if html5 push state exists, update URI - // else we are using hash location and should just cause a re render - if (his) { - his.replaceState({ path: path }, '', path); - } else { - this.context.replaceWith('bonfires', { bonfireName: bonfireName}); - } - }, - - _onTestBonfire: function() { - BonfireActions.testUserCode({ - userCode: this.state.userCode, - tests: this.state.tests - }); - }, - - render: function() { - var { - name, - userCode, - difficulty, - description, - results, - display - } = this.state; - var brief = description.slice(0, 1).pop(); - - // convert bonfire difficulty from floating point string - // to integer. - var difficultyInt = Math.floor(+difficulty); - - return ( - - - - 1 ? description : [] }/> - - - - - - - - - ); - } -}); - -module.exports = Bonfire; diff --git a/common/app/routes/Bonfires/components/Results.jsx b/common/app/routes/Bonfires/components/Results.jsx deleted file mode 100644 index 8e0e11b449..0000000000 --- a/common/app/routes/Bonfires/components/Results.jsx +++ /dev/null @@ -1,62 +0,0 @@ -var React = require('react'), - classNames = require('classnames'), - { Grid, Row, Col } = require('react-bootstrap'); - -var Results = React.createClass({ - - propTypes: { - results: React.PropTypes.array - }, - - _renderText: function(text, textClass) { - return ( - - { text } - - ); - }, - - _renderResult: function(results) { - return results.map(function(result, idx) { - var err = result.err; - var iconClass = { - 'ion-close-circled big-error-icon': err, - 'ion-checkmark-circled big-success-icon': !err - }; - var textClass = { - 'test-output wrappable': true, - 'test-vertical-center': !err - }; - return ( -
- - - - - { this._renderText(result.text, textClass) } - { err ? this._renderText(err, textClass) : null } - -
-
- ); - }.bind(this)); - }, - - render: function() { - var results = this.props.results; - if (!results || results.length && results.length === 0) { - return null; - } - return ( - - { this._renderResult(this.props.results) } - - ); - } -}); - -module.exports = Results; diff --git a/common/app/routes/Bonfires/components/SidePanel.jsx b/common/app/routes/Bonfires/components/SidePanel.jsx deleted file mode 100644 index 078e9fe72b..0000000000 --- a/common/app/routes/Bonfires/components/SidePanel.jsx +++ /dev/null @@ -1,129 +0,0 @@ -var React = require('react'), - - // ## components - { - Well, - Row, - Col, - Button, - } = require('react-bootstrap'); - -var SidePanel = React.createClass({ - - propTypes: { - name: React.PropTypes.string, - brief: React.PropTypes.string, - description: React.PropTypes.array, - difficulty: React.PropTypes.number, - onTestBonfire: React.PropTypes.func - }, - - getDefaultProps: function() { - return { - name: 'Welcome to Bonfires!', - difficulty: 5, - brief: 'This is a brief description' - }; - }, - - getInitialState: function() { - return { - isMoreInfoOpen: false - }; - }, - - _toggleMoreInfo: function() { - this.setState({ - isMoreInfoOpen: !this.state.isMoreInfoOpen - }); - }, - - _renderFlames: function() { - var difficulty = this.props.difficulty; - - return [1, 2, 3, 4, 5].map(num => { - var className = 'ion-ios-flame'; - if (num > difficulty) { - className += '-outline'; - } - return ( - - ); - }); - }, - - _renderMoreInfo: function(isDescription) { - var description = this.props.description.map((sentance, index) => { - return

{ sentance }

; - }); - - if (isDescription && this.state.isMoreInfoOpen) { - return ( - - - { description } - - - ); - } - return null; - }, - - _renderMoreInfoButton: function(isDescription) { - if (isDescription) { - return ( - - ); - } - return null; - }, - - render: function() { - var isDescription = this.props.description && - this.props.description.length > 1; - - return ( -
-

{ this.props.name }

-

-
- Difficulty:  - { this._renderFlames() } -
-

- - - -
-

{ this.props.brief }

-
- { this._renderMoreInfo(isDescription) } - { this._renderMoreInfoButton(isDescription) } -
-
- -
-
- -
-
- ); - } -}); - -module.exports = SidePanel; diff --git a/common/app/routes/Bonfires/executeBonfire.js b/common/app/routes/Bonfires/executeBonfire.js deleted file mode 100644 index 0d1795894a..0000000000 --- a/common/app/routes/Bonfires/executeBonfire.js +++ /dev/null @@ -1,27 +0,0 @@ -var debug = require('debug')('freecc:executebonfire'); -var { - addTests, - runTests, - testCode -} = require('../../utils'); - -module.exports = executeBonfire; - -function executeBonfire(userCode, tests, cb) { - - // TODO: move this into componentDidMount - // ga('send', 'event', 'Bonfire', 'ran-code', bonfireName); - var testSalt = Math.random(); - var { preppedCode, userTests } = addTests(userCode, tests, testSalt); - - debug('sending code to web worker for testing'); - testCode(preppedCode, function(err, data) { - if (err) { return cb(err); } - var results = runTests(userTests, data, testSalt); - debug('testing complete', results); - cb(null, { - output: data.output, - results - }); - }); -} diff --git a/common/app/routes/Bonfires/index.js b/common/app/routes/Bonfires/index.js deleted file mode 100644 index ec633552eb..0000000000 --- a/common/app/routes/Bonfires/index.js +++ /dev/null @@ -1,8 +0,0 @@ -/* -export default { - path: 'bonfires/(:bonfireName)' - getComponents(cb) { - // TODO(berks): add bonfire component - } -}; -*/ diff --git a/common/app/routes/Jobs/components/JobNotFound.jsx b/common/app/routes/Jobs/components/JobNotFound.jsx index b921dfd4dc..c4981d22f8 100644 --- a/common/app/routes/Jobs/components/JobNotFound.jsx +++ b/common/app/routes/Jobs/components/JobNotFound.jsx @@ -1,8 +1,8 @@ -import React, { createClass } from 'react'; +import React from 'react'; import { LinkContainer } from 'react-router-bootstrap'; import { Button, Row, Col, Panel } from 'react-bootstrap'; -export default createClass({ +export default React.createClass({ displayName: 'NoJobFound', render() { diff --git a/common/app/routes/Jobs/components/NewJob.jsx b/common/app/routes/Jobs/components/NewJob.jsx index 661ea70367..2d0bd08937 100644 --- a/common/app/routes/Jobs/components/NewJob.jsx +++ b/common/app/routes/Jobs/components/NewJob.jsx @@ -162,16 +162,16 @@ export default contain({ handleSubmit(e) { e.preventDefault(); - const props = this.props; + const pros = this.props; let valid = true; checkValidity.forEach((prop) => { // if value exist, check if it is valid - if (props[prop].value && props[prop].type !== 'boolean') { - valid = valid && !!props[prop].valid; + if (pros[prop].value && pros[prop].type !== 'boolean') { + valid = valid && !!pros[prop].valid; } }); - if (!valid || !props.isFrontEndCert && !props.isFullStackCert ) { + if (!valid || !pros.isFrontEndCert && !pros.isFullStackCert ) { debug('form not valid'); return; } diff --git a/common/app/routes/Jobs/components/TwitterBtn.jsx b/common/app/routes/Jobs/components/TwitterBtn.jsx index fb5f8edf12..7998353ffc 100644 --- a/common/app/routes/Jobs/components/TwitterBtn.jsx +++ b/common/app/routes/Jobs/components/TwitterBtn.jsx @@ -1,4 +1,4 @@ -import React, { createClass, PropTypes } from 'react'; +import React, { PropTypes } from 'react'; import { Button } from 'react-bootstrap'; const followLink = 'https://twitter.com/intent/follow?' + @@ -9,7 +9,7 @@ function commify(count) { return Number(count).toLocaleString('en'); } -export default createClass({ +export default React.createClass({ displayName: 'FollowButton', diff --git a/common/app/shared/displayCode/Display.jsx b/common/app/shared/displayCode/Display.jsx deleted file mode 100644 index 9eb60db8da..0000000000 --- a/common/app/shared/displayCode/Display.jsx +++ /dev/null @@ -1,51 +0,0 @@ -var React = require('react'), - Tailspin = require('tailspin'); - -var Editor = React.createClass({ - - propTypes: { - value: React.PropTypes.string - }, - - getDefaultProps: function() { - return { - value: [ - '/**', - '* Your output will go here.', - '* Console.log() -type statements', - '* will appear in your browser\'s', - '* DevTools JavaScript console.', - '**/' - ].join('\n') - }; - }, - - render: function() { - var value = this.props.value; - var options = { - lineNumbers: false, - lineWrapping: true, - mode: 'text', - readOnly: 'noCursor', - textAreaClassName: 'hide-textarea', - theme: 'monokai', - value: value - }; - - var config = { - setSize: ['100%', '100%'] - }; - - return ( -
-
- -
-
- ); - } -}); - -module.exports = Editor; diff --git a/common/app/shared/displayCode/index.js b/common/app/shared/displayCode/index.js deleted file mode 100644 index d3e3560174..0000000000 --- a/common/app/shared/displayCode/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./Display.jsx'); diff --git a/common/app/shared/editor/Editor.jsx b/common/app/shared/editor/Editor.jsx deleted file mode 100644 index 8e72f5d4a0..0000000000 --- a/common/app/shared/editor/Editor.jsx +++ /dev/null @@ -1,91 +0,0 @@ -var React = require('react'), - debug = require('debug')('freecc:comp:editor'), - jshint = require('jshint').JSHINT, - Tailspin = require('tailspin'); - -var Editor = React.createClass({ - - propTypes: { - onValueChange: React.PropTypes.func, - value: React.PropTypes.string - }, - - getDefaultProps: function() { - return { - value: 'console.log(\'freeCodeCamp is awesome\')' - }; - }, - - getInitialState: function() { - return { - value: this.props.value - }; - }, - - render: function() { - var options = { - autoCloseBrackets: true, - gutters: ['CodeMirror-lint-markers'], - lint: true, - linter: jshint, - lineNumbers: true, - lineWrapping: true, - mode: 'javascript', - matchBrackets: true, - runnable: true, - scrollbarStyle: 'null', - theme: 'monokai', - textAreaClassName: 'hide-textarea', - value: this.state.value, - onChange: e => { - this.setState({ value: e.target.value}); - if (typeof this.props.onValueChange === 'function') { - this.props.onValueChange(e.target.value); - } - } - }; - - var config = { - setSize: ['100%', 'auto'], - extraKeys: { - Tab: function(cm) { - debug('tab pressed'); - if (cm.somethingSelected()) { - cm.indentSelection('add'); - } else { - var spaces = new Array(cm.getOption('indentUnit') + 1).join(' '); - cm.replaceSelection(spaces); - } - }, - 'Shift-Tab': function(cm) { - debug('shift-tab pressed'); - if (cm.somethingSelected()) { - cm.indentSelection('subtract'); - } else { - var spaces = new Array(cm.getOption('indentUnit') + 1).join(' '); - cm.replaceSelection(spaces); - } - }, - 'Ctrl-Enter': function() { - debug('C-enter pressed'); - // execute bonfire action - return false; - } - } - }; - - return ( -
-
-
- -
-
-
- ); - } -}); - -module.exports = Editor; diff --git a/common/app/shared/editor/index.js b/common/app/shared/editor/index.js deleted file mode 100644 index 5e431fabff..0000000000 --- a/common/app/shared/editor/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./Editor.jsx'); diff --git a/package.json b/package.json index ef06329143..4e36abf74f 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "lint-server": "jsonlint -q server/*.json", "lint-resources": "jsonlint -q server/resources/*.json", "lint-utils": "jsonlint -q server/utils/*.json", - "lint-js": "eslint --ext=.js,.jsx server/ common/models common/utils config/", + "lint-js": "eslint --ext=.js,.jsx server/ common/ common/utils config/ client/", "lint-json": "npm run lint-server && npm run lint-nonprofits && npm run lint-challenges && npm run lint-resources && npm run lint-utils", "test-challenges": "babel-node seed/test-challenges.js | tnyan", "pretest": "npm run lint",