diff --git a/.travis.yml b/.travis.yml index ed5283e877..ce7640999c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,8 @@ language: node_js node_js: -- '4.4' -- '5.7' -- '6.1' +- '6.11' +- '8.8' +before_script: ./scripts/before_script.sh cache: directories: - node_modules diff --git a/README.md b/README.md index b4d9a2de1b..2d843a1a9b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Parse Dashboard +[![Greenkeeper badge](https://badges.greenkeeper.io/parse-community/parse-dashboard.svg)](https://greenkeeper.io/) + [![Build Status](https://img.shields.io/travis/parse-community/parse-dashboard/master.svg?style=flat)](https://travis-ci.org/parse-community/parse-dashboard) [![npm version](https://img.shields.io/npm/v/parse-dashboard.svg?style=flat)](https://www.npmjs.com/package/parse-dashboard) diff --git a/package.json b/package.json index 939716d082..2f2a7eeda0 100644 --- a/package.json +++ b/package.json @@ -41,44 +41,49 @@ "csurf": "^1.9.0", "express": "^4.13.4", "json-file-plus": "^3.2.0", - "package-json": "^2.3.1", + "package-json": "^4.0.1", "passport": "^0.3.2", "passport-local": "^1.0.0" }, "devDependencies": { - "babel-core": "~5.8.12", + "babel-core": "~6.24.1", "babel-eslint": "^7.2.3", - "babel-loader": "~5.3.0", - "babel-plugin-remove-proptypes": "~1.0.0", - "babel-polyfill": "^6.7.2", - "babel-runtime": "~5.8.25", - "css-loader": "~0.18.0", + "babel-loader": "~7.0.0", + "babel-plugin-transform-decorators-legacy": "^1.3.4", + "babel-plugin-transform-object-rest-spread": "^6.26.0", + "babel-plugin-transform-regenerator": "^6.26.0", + "babel-plugin-transform-runtime": "^6.23.0", + "babel-polyfill": "^6.23.0", + "babel-preset-env": "^1.6.1", + "babel-preset-react": "^6.24.1", + "babel-runtime": "~6.23.0", + "css-loader": "~0.28.2", "eslint": "^3.8.1", "eslint-plugin-jest": "^20.0.3", - "eslint-plugin-react": "^6.4.1", - "file-loader": "^0.8.5", + "eslint-plugin-react": "^7.0.1", + "file-loader": "^0.11.1", "history": "^2.1.2", - "http-server": "~0.8.5", - "immutable": "~3.7.5", + "http-server": "~0.10.0", + "immutable": "~3.8.1", "immutable-devtools": "~0.0.4", - "jest-cli": "^12.0.2", - "js-beautify": "~1.5.0", + "jest-cli": "^20.0.3", + "js-beautify": "~1.6.14", "marked": "^0.3.5", - "node-sass": "^3.7.0", - "parse": "1.9.1", - "prismjs": "~1.2.0", + "node-sass": "^4.5.3", + "parse": "1.9.2", + "prismjs": "~1.6.0", "react": "^15.0.1", "react-addons-test-utils": "^15.0.1", - "react-dnd": "~2.1.4", - "react-dnd-html5-backend": "~2.0.0", + "react-dnd": "~2.4.0", + "react-dnd-html5-backend": "~2.4.1", "react-dom": "^15.0.1", "react-router": "^2.6.0", "request-promise": "^4.1.1", - "sass-loader": "~3.1.2", - "style-loader": "~0.12.3", + "sass-loader": "~6.0.5", + "style-loader": "~0.18.0", "svg-prep": "~1.0.0", "transform-jest-deps": "^2.1.0", - "webpack": "~1.12.0" + "webpack": "~2.5.1" }, "scripts": { "dev": "node ./Parse-Dashboard/index.js & webpack --config webpack/build.config.js --devtool eval-source-map --progress --watch", @@ -89,7 +94,7 @@ "lint": "eslint . --ignore-path .gitignore --cache", "pretest": "npm run lint", "generate": "node scripts/generate.js", - "prepublish": "webpack --config webpack/publish.config.js", + "prepublish": "webpack --config webpack/publish.config.js --progress", "start": "node ./Parse-Dashboard/index.js" }, "bin": { @@ -100,14 +105,12 @@ }, "main": "Parse-Dashboard/app.js", "jest": { - "testPathDirs": [ + "roots": [ "src/lib" ], - "scriptPreprocessor": "/testing/preprocessor.js", - "testDirectoryName": "tests", - "testFileExtensions": [ - "test.js" - ], + "transform": { + ".*": "/testing/preprocessor.js" + }, "unmockedModulePathPatterns": [ "react", "react-dom", diff --git a/scripts/before_script.sh b/scripts/before_script.sh new file mode 100755 index 0000000000..06bda6d29f --- /dev/null +++ b/scripts/before_script.sh @@ -0,0 +1,8 @@ +#!/bin/sh +set -e +set -x + +test -f Parse-Dashboard/public/bundles/dashboard.bundle.js +test -f Parse-Dashboard/public/bundles/login.bundle.js +test -f Parse-Dashboard/public/bundles/sprites.svg +test -d Parse-Dashboard/public/bundles/img diff --git a/src/components/PlatformCard/PlatformCard.react.js b/src/components/PlatformCard/PlatformCard.react.js index a96eb90a80..afee1d67d4 100644 --- a/src/components/PlatformCard/PlatformCard.react.js +++ b/src/components/PlatformCard/PlatformCard.react.js @@ -32,7 +32,7 @@ export default PlatformCard; PlatformCard.propTypes = { platform: PropTypes.oneOf([ - 'ios', 'android', 'xamarin', 'unity', 'php', 'windows', 'dotnet', 'arduino', 'rpi', 'rtos' + 'apple', 'android', 'xamarin', 'unity', 'php', 'windows', 'dotnet', 'arduino', 'rpi', 'rtos' ]).isRequired.describe( 'The platform name. This will determine the icon.' ), diff --git a/src/lib/tests/Button.test.js b/src/lib/tests/Button.test.js index 1e2556bc63..d43efff10b 100644 --- a/src/lib/tests/Button.test.js +++ b/src/lib/tests/Button.test.js @@ -10,7 +10,7 @@ jest.dontMock('../../components/Button/Button.react'); import React from 'react'; import TestUtils from 'react-addons-test-utils'; -const Button = require('../../components/Button/Button.react'); +const Button = require('../../components/Button/Button.react').default; describe('Button', () => { it('has a default state', () => { diff --git a/src/lib/tests/Tooltip.test.js b/src/lib/tests/Tooltip.test.js index 14e5aa5398..ab91c3fa24 100644 --- a/src/lib/tests/Tooltip.test.js +++ b/src/lib/tests/Tooltip.test.js @@ -8,5 +8,5 @@ jest.dontMock('../../components/Tooltip/Tooltip.react'); describe('Tooltip', () => { - // test suite goes here + it('does nothing', () => {}); }); diff --git a/src/lib/tests/passwordStrength.test.js b/src/lib/tests/passwordStrength.test.js index cecb3ad0a4..fc7ef3fe8e 100644 --- a/src/lib/tests/passwordStrength.test.js +++ b/src/lib/tests/passwordStrength.test.js @@ -6,7 +6,7 @@ * the root directory of this source tree. */ jest.dontMock('../passwordStrength'); -const passwordStrength = require('../passwordStrength'); +const passwordStrength = require('../passwordStrength').default; describe('passwordStrength', () => { it('returns 0 for passwords that are too short', () => { diff --git a/src/lib/tests/prettyNumber.test.js b/src/lib/tests/prettyNumber.test.js index f816b12dd0..1950a90c3c 100644 --- a/src/lib/tests/prettyNumber.test.js +++ b/src/lib/tests/prettyNumber.test.js @@ -6,7 +6,7 @@ * the root directory of this source tree. */ jest.dontMock('../prettyNumber'); -const prettyNumber = require('../prettyNumber'); +const prettyNumber = require('../prettyNumber').default; describe('prettyNumber', () => { it('does not change small numbers', () => { diff --git a/testing/preprocessor.js b/testing/preprocessor.js index c37eddd11c..49b6cf4cb4 100644 --- a/testing/preprocessor.js +++ b/testing/preprocessor.js @@ -22,14 +22,15 @@ module.exports = { // Ignore all files within node_modules // babel files can be .js, .es, .jsx or .es6 - if (filename.indexOf('node_modules') < 0 && babel.canCompile(filename)) { + if (filename.indexOf('node_modules') < 0) { return babel.transform(src, { filename: filename, - stage: 0, retainLines: true, + plugins: ['transform-decorators-legacy', 'transform-object-rest-spread', 'transform-regenerator', 'transform-runtime'], + presets: ['react', 'env'] // Remove propTypes for tests so we don't have to keep unmocking lib/PropTypes // Also it's more representative of the production environment - plugins: [ 'babel-plugin-remove-proptypes' ] + //plugins: [ 'babel-plugin-remove-proptypes' ] }).code; } diff --git a/webpack/PIG.config.js b/webpack/PIG.config.js index 50ee21173e..422a7bc24b 100644 --- a/webpack/PIG.config.js +++ b/webpack/PIG.config.js @@ -8,6 +8,6 @@ var configuration = require('./base.config.js'); configuration.entry = {PIG: './parse-interface-guide/index.js'}; -configuration.output.path = './PIG/bundles'; +configuration.output.path = require('path').resolve('./PIG/bundles'); module.exports = configuration; diff --git a/webpack/base.config.js b/webpack/base.config.js index a36ee769f0..4987a7b9f0 100644 --- a/webpack/base.config.js +++ b/webpack/base.config.js @@ -23,33 +23,36 @@ module.exports = { publicPath: 'bundles/' }, resolve: { - root: [__dirname,path.join(__dirname, '../src'), path.join(__dirname, 'node_modules')] + modules: [__dirname,path.join(__dirname, '../src'), path.join(__dirname, '../node_modules')] }, resolveLoader: { - root: path.join(__dirname, '../node_modules') + modules: [path.join(__dirname, '../node_modules')] }, module: { - loaders: [ + rules: [ { test: /\.js$/, exclude: /node_modules/, - loader: 'babel-loader', - query: { - optional: ['runtime', 'es7.decorators'] - } + use: { + loader: 'babel-loader', + query: { + plugins: ['transform-decorators-legacy', 'transform-object-rest-spread', 'transform-regenerator', 'transform-runtime'], + presets: ['react', 'env'] + } + }, }, { test: /\.scss$/, - loader: "style-loader!css-loader?modules&localIdentName=[local]__[hash:base64:5]!sass-loader?includePaths[]=" + - encodeURIComponent(path.resolve(__dirname, '../src')) + use: [ "style-loader", "css-loader?modules&localIdentName=[local]__[hash:base64:5]!sass-loader?includePaths[]=" + + encodeURIComponent(path.resolve(__dirname, '../src')) ] }, { test: /\.css$/, - loader: 'style-loader!css-loader' + use: [ 'style-loader', 'css-loader' ] }, { test: /\.png$/, - loader: 'file-loader?name=img/[hash].[ext]', + use: { loader: 'file-loader?name=img/[hash].[ext]' } }, { test: /\.jpg$/, - loader: 'file-loader?name=img/[hash].[ext]', + use: { loader: 'file-loader?name=img/[hash].[ext]' } } ] }, diff --git a/webpack/build.config.js b/webpack/build.config.js index 8c849a06a7..ad45faeb51 100644 --- a/webpack/build.config.js +++ b/webpack/build.config.js @@ -11,6 +11,6 @@ configuration.entry = { dashboard: './dashboard/index.js', login: './login/index.js' }; -configuration.output.path = './Parse-Dashboard/public/bundles'; +configuration.output.path = require('path').resolve('./Parse-Dashboard/public/bundles'); module.exports = configuration; diff --git a/webpack/production.config.js b/webpack/production.config.js index a84fdbd080..355eeeb812 100644 --- a/webpack/production.config.js +++ b/webpack/production.config.js @@ -13,22 +13,10 @@ configuration.entry = { PIG: './parse-interface-guide/index.js', quickstart: './quickstart/index.js', }; -configuration.output.path = './production/bundles'; +configuration.output.path = require('path').resolve('./production/bundles'); var webpack = require('webpack'); -// Add propType removal to Babel -var loaders = configuration.module.loaders; -for (var i = 0; i < loaders.length; i++) { - if (loaders[i].loader === 'babel-loader') { - if (!loaders[i].query.plugins) { - loaders[i].query.plugins = []; - } - loaders[i].query.plugins.push('babel-plugin-remove-proptypes'); - break; - } -} - // Enable minification configuration.plugins.push( new webpack.DefinePlugin({ @@ -41,7 +29,7 @@ configuration.plugins.push( warnings: false } }), - new webpack.optimize.OccurenceOrderPlugin(), + new webpack.optimize.OccurrenceOrderPlugin(), function() { this.plugin('done', function(stats) { if (stats.compilation.errors && stats.compilation.errors.length) { diff --git a/webpack/publish.config.js b/webpack/publish.config.js index db53ef7a52..e5402fa2e6 100644 --- a/webpack/publish.config.js +++ b/webpack/publish.config.js @@ -11,22 +11,10 @@ configuration.entry = { dashboard: './dashboard/index.js', login: './login/index.js' }; -configuration.output.path = './Parse-Dashboard/public/bundles'; +configuration.output.path = require('path').resolve('./Parse-Dashboard/public/bundles'); var webpack = require('webpack'); -// Add propType removal to Babel -var loaders = configuration.module.loaders; -for (var i = 0; i < loaders.length; i++) { - if (loaders[i].loader === 'babel-loader') { - if (!loaders[i].query.plugins) { - loaders[i].query.plugins = []; - } - loaders[i].query.plugins.push('babel-plugin-remove-proptypes'); - break; - } -} - // Enable minification configuration.plugins.push( new webpack.DefinePlugin({ @@ -39,7 +27,7 @@ configuration.plugins.push( warnings: false } }), - new webpack.optimize.OccurenceOrderPlugin(), + new webpack.optimize.OccurrenceOrderPlugin(), function() { this.plugin('done', function(stats) { if (stats.compilation.errors && stats.compilation.errors.length) { diff --git a/webpack/webpack.config.js b/webpack/webpack.config.js index 04d4081fab..cd597b8338 100644 --- a/webpack/webpack.config.js +++ b/webpack/webpack.config.js @@ -14,6 +14,6 @@ configuration.entry = { PIG: './parse-interface-guide/index.js', quickstart: './quickstart/index.js', }; -configuration.output.path = './bundles'; +configuration.output.path = require('path').resolve('./bundles'); module.exports = configuration;