diff --git a/.travis.yml b/.travis.yml index 05d04877fc..b01eb3044c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,7 @@ language: node_js node_js: -- '4.4' -- '5.7' -- '6.1' +- '6.10' +- '7.10' deploy: provider: npm on: diff --git a/README.md b/README.md index 61a8f5bc84..a10121474a 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 62d424279b..394ab11787 100644 --- a/package.json +++ b/package.json @@ -41,44 +41,47 @@ "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-polyfill": "^6.23.0", + "babel-preset-es2015": "^6.24.1", + "babel-preset-react": "^6.24.1", + "babel-preset-stage-0": "^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", - "history": "^2.1.2", - "http-server": "~0.8.5", - "immutable": "~3.7.5", + "eslint-plugin-react": "^7.0.1", + "file-loader": "^0.11.1", + "history": "^4.6.1", + "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", + "react-router": "^4.1.1", "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", @@ -100,14 +103,10 @@ }, "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/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..5e4d146303 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'], + presets: ['react', 'es2015', 'stage-0'] // 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..56e6fd1dff 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 = __dirname + '/PIG/bundles'; module.exports = configuration; diff --git a/webpack/base.config.js b/webpack/base.config.js index a36ee769f0..abc5caf967 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'], + presets: ['react', 'es2015', 'stage-0'] + } + }, }, { 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..f79923ceab 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 = __dirname + '/Parse-Dashboard/public/bundles'; module.exports = configuration; diff --git a/webpack/production.config.js b/webpack/production.config.js index a84fdbd080..5b41b45f88 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 = __dirname + '/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..df74f1c200 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 = __dirname + '/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..8f4be9d903 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 = __dirname + '/bundles'; module.exports = configuration;