From 80f08b2759ce539f908ac819018d5df543dbf473 Mon Sep 17 00:00:00 2001 From: kellyrmilligan Date: Thu, 15 Mar 2018 09:59:26 -0500 Subject: [PATCH 1/4] new pr against next branch --- .../package.json | 2 +- packages/babel-preset-react-app/package.json | 26 +++++++++---------- .../react-dev-utils/WebpackDevServerUtils.js | 6 ++--- .../react-dev-utils/errorOverlayMiddleware.js | 4 +-- .../noopServiceWorkerMiddleware.js | 6 +++-- packages/react-dev-utils/package.json | 3 ++- .../react-dev-utils/serveAppMiddleware.js | 23 ++++++++++++++++ packages/react-error-overlay/package.json | 6 ++--- .../config/webpack.config.dev.js | 14 +++++++--- .../config/webpackDevServer.config.js | 16 ++++++++++-- packages/react-scripts/package.json | 5 ++-- packages/react-scripts/scripts/start.js | 5 +++- packages/react-scripts/template/README.md | 7 +++++ 13 files changed, 89 insertions(+), 34 deletions(-) create mode 100644 packages/react-dev-utils/serveAppMiddleware.js diff --git a/packages/babel-plugin-named-asset-import/package.json b/packages/babel-plugin-named-asset-import/package.json index 9c586ac5753..71dbdf065b4 100644 --- a/packages/babel-plugin-named-asset-import/package.json +++ b/packages/babel-plugin-named-asset-import/package.json @@ -12,6 +12,6 @@ "index.js" ], "peerDependencies": { - "@babel/core": "7.0.0-beta.38" + "@babel/core": "7.0.0-beta.41" } } diff --git a/packages/babel-preset-react-app/package.json b/packages/babel-preset-react-app/package.json index 5e3f3b0a5ff..8a7390dd16f 100644 --- a/packages/babel-preset-react-app/package.json +++ b/packages/babel-preset-react-app/package.json @@ -12,19 +12,19 @@ "dependencies.js" ], "dependencies": { - "@babel/core": "7.0.0-beta.38", - "@babel/plugin-proposal-class-properties": "7.0.0-beta.38", - "@babel/plugin-syntax-dynamic-import": "7.0.0-beta.38", - "@babel/plugin-transform-classes": "7.0.0-beta.38", - "@babel/plugin-transform-destructuring": "7.0.0-beta.38", - "@babel/plugin-transform-react-constant-elements": "7.0.0-beta.38", - "@babel/plugin-transform-react-display-name": "7.0.0-beta.38", - "@babel/plugin-transform-react-jsx": "7.0.0-beta.38", - "@babel/plugin-transform-regenerator": "7.0.0-beta.38", - "@babel/plugin-transform-runtime": "7.0.0-beta.38", - "@babel/preset-env": "7.0.0-beta.38", - "@babel/preset-flow": "7.0.0-beta.38", - "@babel/preset-react": "7.0.0-beta.38", + "@babel/core": "7.0.0-beta.41", + "@babel/plugin-proposal-class-properties": "7.0.0-beta.41", + "@babel/plugin-syntax-dynamic-import": "7.0.0-beta.41", + "@babel/plugin-transform-classes": "7.0.0-beta.41", + "@babel/plugin-transform-destructuring": "7.0.0-beta.41", + "@babel/plugin-transform-react-constant-elements": "7.0.0-beta.41", + "@babel/plugin-transform-react-display-name": "7.0.0-beta.41", + "@babel/plugin-transform-react-jsx": "7.0.0-beta.41", + "@babel/plugin-transform-regenerator": "7.0.0-beta.41", + "@babel/plugin-transform-runtime": "7.0.0-beta.41", + "@babel/preset-env": "7.0.0-beta.41", + "@babel/preset-flow": "7.0.0-beta.41", + "@babel/preset-react": "7.0.0-beta.41", "babel-plugin-macros": "2.0.0", "babel-plugin-transform-dynamic-import": "2.0.0", "babel-plugin-transform-react-remove-prop-types": "0.4.12" diff --git a/packages/react-dev-utils/WebpackDevServerUtils.js b/packages/react-dev-utils/WebpackDevServerUtils.js index 1208d7fc776..260f73ceea0 100644 --- a/packages/react-dev-utils/WebpackDevServerUtils.js +++ b/packages/react-dev-utils/WebpackDevServerUtils.js @@ -34,20 +34,20 @@ if (isSmokeTest) { }; } -function prepareUrls(protocol, host, port) { +function prepareUrls(protocol, host, port, pathname) { const formatUrl = hostname => url.format({ protocol, hostname, port, - pathname: '/', + pathname, }); const prettyPrintUrl = hostname => url.format({ protocol, hostname, port: chalk.bold(port), - pathname: '/', + pathname, }); const isUnspecifiedHost = host === '0.0.0.0' || host === '::'; diff --git a/packages/react-dev-utils/errorOverlayMiddleware.js b/packages/react-dev-utils/errorOverlayMiddleware.js index 873b1994732..57a6003e45d 100644 --- a/packages/react-dev-utils/errorOverlayMiddleware.js +++ b/packages/react-dev-utils/errorOverlayMiddleware.js @@ -9,9 +9,9 @@ const launchEditor = require('./launchEditor'); const launchEditorEndpoint = require('./launchEditorEndpoint'); -module.exports = function createLaunchEditorMiddleware() { +module.exports = function createLaunchEditorMiddleware(servedPathPathname) { return function launchEditorMiddleware(req, res, next) { - if (req.url.startsWith(launchEditorEndpoint)) { + if (req.url.startsWith(`${servedPathPathname}${launchEditorEndpoint}`)) { const lineNumber = parseInt(req.query.lineNumber, 10) || 1; const colNumber = parseInt(req.query.colNumber, 10) || 1; launchEditor(req.query.fileName, lineNumber, colNumber); diff --git a/packages/react-dev-utils/noopServiceWorkerMiddleware.js b/packages/react-dev-utils/noopServiceWorkerMiddleware.js index 568ff4d6519..ad32c09b230 100644 --- a/packages/react-dev-utils/noopServiceWorkerMiddleware.js +++ b/packages/react-dev-utils/noopServiceWorkerMiddleware.js @@ -7,9 +7,11 @@ 'use strict'; -module.exports = function createNoopServiceWorkerMiddleware() { +module.exports = function createNoopServiceWorkerMiddleware( + servedPathPathname +) { return function noopServiceWorkerMiddleware(req, res, next) { - if (req.url === '/service-worker.js') { + if (req.url === `${servedPathPathname}/service-worker.js`) { res.setHeader('Content-Type', 'text/javascript'); res.send( `// This service worker file is effectively a 'no-op' that will reset any diff --git a/packages/react-dev-utils/package.json b/packages/react-dev-utils/package.json index ca08b4e612b..0ac25485e72 100644 --- a/packages/react-dev-utils/package.json +++ b/packages/react-dev-utils/package.json @@ -16,6 +16,7 @@ "clearConsole.js", "crossSpawn.js", "errorOverlayMiddleware.js", + "serveAppMiddleware.js", "eslintFormatter.js", "FileSizeReporter.js", "formatWebpackMessages.js", @@ -37,7 +38,7 @@ "workspaceUtils.js" ], "dependencies": { - "@babel/code-frame": "7.0.0-beta.38", + "@babel/code-frame": "7.0.0-beta.41", "address": "1.0.3", "browserslist": "2.11.3", "chalk": "2.3.0", diff --git a/packages/react-dev-utils/serveAppMiddleware.js b/packages/react-dev-utils/serveAppMiddleware.js new file mode 100644 index 00000000000..620847c333c --- /dev/null +++ b/packages/react-dev-utils/serveAppMiddleware.js @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ +'use strict'; + +module.exports = function createServeAppMiddleware(servedPathPathname) { + return function serveAppMiddleware(req, res, next) { + if (servedPathPathname.length > 1 && servedPathPathname !== './') { + if (req.url.indexOf(servedPathPathname) === -1) { + res.redirect(servedPathPathname); + } else { + next(); + } + } else { + next(); + } + }; +}; diff --git a/packages/react-error-overlay/package.json b/packages/react-error-overlay/package.json index 60d8195f2a3..f168ba5333c 100644 --- a/packages/react-error-overlay/package.json +++ b/packages/react-error-overlay/package.json @@ -30,9 +30,9 @@ "lib/index.js" ], "devDependencies": { - "@babel/code-frame": "7.0.0-beta.38", - "@babel/core": "7.0.0-beta.38", - "@babel/runtime": "7.0.0-beta.38", + "@babel/code-frame": "7.0.0-beta.41", + "@babel/core": "7.0.0-beta.41", + "@babel/runtime": "7.0.0-beta.41", "anser": "1.4.6", "babel-core": "^7.0.0-bridge.0", "babel-eslint": "^8.0.2", diff --git a/packages/react-scripts/config/webpack.config.dev.js b/packages/react-scripts/config/webpack.config.dev.js index 398b8bf53b7..4766fac4dcf 100644 --- a/packages/react-scripts/config/webpack.config.dev.js +++ b/packages/react-scripts/config/webpack.config.dev.js @@ -10,6 +10,7 @@ const autoprefixer = require('autoprefixer'); const path = require('path'); +const url = require('url'); const webpack = require('webpack'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); @@ -21,14 +22,18 @@ const getClientEnvironment = require('./env'); const paths = require('./paths'); // Webpack uses `publicPath` to determine where the app is being served from. -// In development, we always serve from the root. This makes config easier. -const publicPath = '/'; +// In development, we serve from the root by default. Webpack will serve from +// the relative path of the homepage field if specified. +let publicPath = url.parse(paths.servedPath).pathname || ''; +if (publicPath === './') { + publicPath = publicPath.slice(1); +} // `publicUrl` is just like `publicPath`, but we will provide it to our app // as %PUBLIC_URL% in `index.html` and `process.env.PUBLIC_URL` in JavaScript. // Omit trailing slash as %PUBLIC_PATH%/xyz looks better than %PUBLIC_PATH%xyz. -const publicUrl = ''; +const publicUrl = paths.servedPath.slice(0, -1) + '/static'; // Get environment variables to inject into our app. -const env = getClientEnvironment(publicUrl); +const env = getClientEnvironment(publicUrl === '.' ? '' : publicUrl); // Options for PostCSS as we reference these options twice // Adds vendor prefixing based on your specified browser support in @@ -85,6 +90,7 @@ module.exports = { // There are also additional JS chunk files if you use code splitting. chunkFilename: 'static/js/[name].chunk.js', // This is the URL that app is served from. We use "/" in development. + // If there is a homepage path defined, it will be served from that instead. publicPath: publicPath, // Point sourcemap entries to original disk location (format as URL on Windows) devtoolModuleFilenameTemplate: info => diff --git a/packages/react-scripts/config/webpackDevServer.config.js b/packages/react-scripts/config/webpackDevServer.config.js index 74119d27f39..69fe86d8448 100644 --- a/packages/react-scripts/config/webpackDevServer.config.js +++ b/packages/react-scripts/config/webpackDevServer.config.js @@ -10,12 +10,16 @@ const errorOverlayMiddleware = require('react-dev-utils/errorOverlayMiddleware'); const noopServiceWorkerMiddleware = require('react-dev-utils/noopServiceWorkerMiddleware'); +const serveAppMiddleware = require('react-dev-utils/serveAppMiddleware'); const ignoredFiles = require('react-dev-utils/ignoredFiles'); +const url = require('url'); const config = require('./webpack.config.dev'); const paths = require('./paths'); +const express = require('express'); const protocol = process.env.HTTPS === 'true' ? 'https' : 'http'; const host = process.env.HOST || '0.0.0.0'; +const servedPathPathname = url.parse(paths.servedPath).pathname || ''; module.exports = function(proxy, allowedHost) { return { @@ -86,18 +90,26 @@ module.exports = function(proxy, allowedHost) { // Paths with dots should still use the history fallback. // See https://github.com/facebook/create-react-app/issues/387. disableDotRule: true, + index: servedPathPathname, }, public: allowedHost, proxy, before(app) { // This lets us open files from the runtime error overlay. - app.use(errorOverlayMiddleware()); + app.use(errorOverlayMiddleware(servedPathPathname)); // This service worker file is effectively a 'no-op' that will reset any // previous service worker registered for the same host:port combination. // We do this in development to avoid hitting the production cache if // it used the same host and port. // https://github.com/facebook/create-react-app/issues/2272#issuecomment-302832432 - app.use(noopServiceWorkerMiddleware()); + app.use(noopServiceWorkerMiddleware(servedPathPathname)); + // serves the app up from the homepage if specified + app.use(serveAppMiddleware(servedPathPathname)); + // serve up static assets + app.use( + `${config.output.publicPath.slice(0, -1)}/static`, + express.static(paths.appPublic) + ); }, }; }; diff --git a/packages/react-scripts/package.json b/packages/react-scripts/package.json index 46e9a00a020..43fba37e551 100644 --- a/packages/react-scripts/package.json +++ b/packages/react-scripts/package.json @@ -3,6 +3,7 @@ "version": "1.1.0", "description": "Configuration and scripts for Create React App.", "repository": "facebook/create-react-app", + "homepage": "https://app.knowledgehound.com/supplier", "license": "MIT", "engines": { "node": ">=6" @@ -21,8 +22,8 @@ "react-scripts": "./bin/react-scripts.js" }, "dependencies": { - "@babel/core": "7.0.0-beta.38", - "@babel/runtime": "7.0.0-beta.38", + "@babel/core": "7.0.0-beta.41", + "@babel/runtime": "7.0.0-beta.41", "autoprefixer": "7.2.5", "babel-core": "7.0.0-bridge.0", "babel-eslint": "8.2.1", diff --git a/packages/react-scripts/scripts/start.js b/packages/react-scripts/scripts/start.js index 95502bc2a24..127cc4b4c92 100644 --- a/packages/react-scripts/scripts/start.js +++ b/packages/react-scripts/scripts/start.js @@ -29,6 +29,7 @@ if (process.env.SKIP_PREFLIGHT_CHECK !== 'true') { } // @remove-on-eject-end +const url = require('url'); const chalk = require('chalk'); const webpack = require('webpack'); const WebpackDevServer = require('webpack-dev-server'); @@ -56,6 +57,8 @@ if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) { const DEFAULT_PORT = parseInt(process.env.PORT, 10) || 3000; const HOST = process.env.HOST || '0.0.0.0'; +const servedPathPathname = url.parse(paths.servedPath).pathname || ''; + if (process.env.HOST) { console.log( chalk.cyan( @@ -89,7 +92,7 @@ checkBrowsers(paths.appPath) } const protocol = process.env.HTTPS === 'true' ? 'https' : 'http'; const appName = require(paths.appPackageJson).name; - const urls = prepareUrls(protocol, HOST, port); + const urls = prepareUrls(protocol, HOST, port, servedPathPathname); // Create a webpack compiler that is configured with custom messages. const compiler = createCompiler( webpack, diff --git a/packages/react-scripts/template/README.md b/packages/react-scripts/template/README.md index 8d282b52fe4..38609def3f6 100644 --- a/packages/react-scripts/template/README.md +++ b/packages/react-scripts/template/README.md @@ -2175,6 +2175,13 @@ To override this, specify the `homepage` in your `package.json`, for example: This will let Create React App correctly infer the root path to use in the generated HTML file. +If `homepage` is specified, Create React App will open your browser at the path specified. From the example above, `npm start` would result in: + +```js +http://localhost:3000/relativepath +``` +This also means that in development the paths to the static files will be served out of the `relativepath` directory. + **Note**: If you are using `react-router@^4`, you can root ``s using the `basename` prop on any ``.
More information [here](https://reacttraining.com/react-router/web/api/BrowserRouter/basename-string).

From 23ed094c0866ffb3d98a4d798b4c2fc88b83d35e Mon Sep 17 00:00:00 2001 From: kellyrmilligan Date: Thu, 15 Mar 2018 10:19:39 -0500 Subject: [PATCH 2/4] spacing fixes and remove test value in package.json --- packages/react-dev-utils/package.json | 2 +- packages/react-scripts/package.json | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/react-dev-utils/package.json b/packages/react-dev-utils/package.json index 0ac25485e72..d0b3d74864c 100644 --- a/packages/react-dev-utils/package.json +++ b/packages/react-dev-utils/package.json @@ -16,7 +16,7 @@ "clearConsole.js", "crossSpawn.js", "errorOverlayMiddleware.js", - "serveAppMiddleware.js", + "serveAppMiddleware.js", "eslintFormatter.js", "FileSizeReporter.js", "formatWebpackMessages.js", diff --git a/packages/react-scripts/package.json b/packages/react-scripts/package.json index 43fba37e551..ce272ac3af2 100644 --- a/packages/react-scripts/package.json +++ b/packages/react-scripts/package.json @@ -3,7 +3,6 @@ "version": "1.1.0", "description": "Configuration and scripts for Create React App.", "repository": "facebook/create-react-app", - "homepage": "https://app.knowledgehound.com/supplier", "license": "MIT", "engines": { "node": ">=6" From 876de93a4611f162acf08a07df65ab050e824f19 Mon Sep 17 00:00:00 2001 From: kellyrmilligan Date: Thu, 22 Mar 2018 08:40:54 -0500 Subject: [PATCH 3/4] re-do of header of serve app middleware file to remove patents reference --- packages/react-dev-utils/serveAppMiddleware.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/react-dev-utils/serveAppMiddleware.js b/packages/react-dev-utils/serveAppMiddleware.js index 620847c333c..c2824a96d32 100644 --- a/packages/react-dev-utils/serveAppMiddleware.js +++ b/packages/react-dev-utils/serveAppMiddleware.js @@ -1,10 +1,8 @@ /** * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. */ 'use strict'; From 405f6db5ea721fc3ef75b6ab9d76c53b1088826d Mon Sep 17 00:00:00 2001 From: kellyrmilligan Date: Thu, 22 Mar 2018 09:21:27 -0500 Subject: [PATCH 4/4] try fixing tests --- .../react-scripts/fixtures/kitchensink/integration/env.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-scripts/fixtures/kitchensink/integration/env.test.js b/packages/react-scripts/fixtures/kitchensink/integration/env.test.js index 43badcbde8e..ee7f27c383f 100644 --- a/packages/react-scripts/fixtures/kitchensink/integration/env.test.js +++ b/packages/react-scripts/fixtures/kitchensink/integration/env.test.js @@ -50,7 +50,7 @@ describe('Integration', () => { const prefix = process.env.NODE_ENV === 'development' - ? '' + ? '/static' : 'http://www.example.org/spa'; expect(doc.getElementById('feature-public-url').textContent).to.equal( `${prefix}.`